前端:继上次的笨....这次我又因为懒,写了自动化部署脚本(Bash)

上期回顾

掘金文章地址 上期做了npm自动发布脚本,感觉笨笨哒...

近期又因为自己新开了一个项目,后端每写完一个接口,每次的 部署真的超麻烦 的好嘛!!


我已经厌倦了自己、厌倦了生活、厌倦了没有自动化的编程路 💢💢💢

本期代码舔狗(舔代码)

先贴一下我这次的项目吧【目前还是学生 轻一点骂!】:)

上图几个架构的地址 - > github 有用可以点一下star~

还有一部分还在写ing 但可以看一下接口文档-> 在线链接

前端地址 - > github 有用可以点一下star~

前端就是提交作业的app,但包括了数据分析、权限管理等等很多操作,用了大量的可视化图表 -> 在线链接 (目前还有用)

🌝目的

讲述需求

写完后端 -> 就部署 -> 前端就能和后端很"轻松、快捷、无等待"的联调

  • 手动去服务器或者第三方部署效率低、费劲
  • 我写了bash脚本(shell)去一行命令自动化部署后端服务(不止后端)
  • 结果 🔽

整体思路(重点)🔽

两个文件:

  • packfor_remote 本地打包脚本
  • setup_remote 远端脚本
  1. 先将代码在宿主机打包成tar包
  2. 将数据库导出打包等待上传
  3. 上传所有的代码、依赖、数据和脚本代码到服务器
  4. 删除多余的文件(如 .gz文件)
  5. 执行setup_remote脚本 => 开启服务
    1. 迁移数据库
    2. 设置环境变量
    3. 重启Nginx并启动项目

**具体更加详细的思路介绍可参考我的 readme文件 => **链接
注:在此基础上我还有许多操作比如:测试用例、更新代码、更新数据库等操作,可以围观一下

✅代码

代码记录

宿主机打包文件-packfor_remote.sh

javascript 复制代码
#!/bin/bash

user=jobpost // 你服务器的具体用户名称。也可以选择root用户
host=xxx // 你的公网ip
deploy_dir=jobpro // 工作目录
file_name=JobPosting_Pro
home_dir=/Users/duibagroup/Desktop/myself // 宿主机代码路径
dist=$home_dir/jobposting_pro.tar.gz //从这里往下.gz文件都是打包后的文件名子
db_dist=$home_dir/jobpost.tar.gz
bash_dist=$home_dir/bash.tar.gz
port_rspec=$home_dir/port.tar.gz
modules_dist=$home_dir/node_modules.tar.gz

title "更新代码"
read -p "是否要更新本地代码? (y/n): " choice // 这一步大家伙可以忽略,从测试用例开始
# 判断用户的选择
if [ "$choice" = "y" ]; then
  title "执行更新"
  bash/ga.sh "更新本地代码"
elif [ "$choice" = "n" ]; then
  title "取消更新"
  echo "用户选择不更新代码。"
else
  title "无效选择"
  echo "无效的选择。请输入 'yes' 或 'no'。"
fi

title "执行测试用例" // 这里我的Express框架用了Mocha测试,没有的也不用写这个
mocha rspec/test --reporter dot
title "clear tar*" // 删除宿主机之前打包后的资源(清理缓存)
rm -rf $dist $bash_dist $db_dist $port_rspec $modules_dist

title "打包源代码" // 打包你的代码 --exclude是你这次不打包的文件,必要存放重要数据的不打包
// 或者依赖不打包
tar --exclude="node_modules/*" --exclude="bash/*" --exclude="portDocument/*" -czf $dist *
tar -czf $bash_dist -C ./bash . 

title "正在打包node_modules<<<请稍后..." // 因为node_modules太大 所以我分开打包
modules_total_size=$(du -sk ./node_modules | cut -f 1)
tar --exclude="portDocument/*" -cf - -C ./node_modules . | pv -s ${modules_total_size}k | gzip > $modules_dist // 这里用了 pv 工具做了进度条(因为速度略慢一些,给你更好的体验)
# tar --exclude="portDocument/*" -czf $modules_dist -C ./node_modules .

title "打包接口文档" // 这个是前端接口文档打包-> 后边 Nginx 会有部署
cd portDocument
npm run build
cd .. && tar -czf $port_rspec -C ./portDocument/dist .

title "导出数据库并打包" // 我用了mongodb,有专门的工具 mongodump 来快速打包
mongodump --host localhost --port 27017 -o $home_dir -d jobpost
tar -czf $db_dist -C ../jobpost .

title "创建远程目录" // 创建一些需要用到的文件夹(工作目录)
ssh $user@$host "rm -rf $deploy_dir/ && 
   mkdir -p $deploy_dir && 
   mkdir -p $deploy_dir/db && 
   mkdir -p $deploy_dir/node_modules && 
   mkdir -p $deploy_dir/portDocument"

title "上传源代码" // 上传前 一定! 要加上权限
ssh $user@$host "chmod -R 777 $deploy_dir/"
scp -r $dist $user@$host:$deploy_dir // 链接到远端服务器

title "上传本地依赖" //继续上传代码。其实还有一个思路就是在远端进行 npm install,但速度太慢,弃用
scp -r $bash_dist $user@$host:$deploy_dir
scp -r $modules_dist $user@$host:$deploy_dir

title "上传接口文档"
scp -r $port_rspec $user@$host:$deploy_dir/portDocument

title "上传数据库"
scp -r $db_dist $user@$host:$deploy_dir/db

title "解压源代码" // 以下解压代码、数据
ssh $user@$host "cd $deploy_dir && 
   tar -xzf jobposting_pro.tar.gz && 
   tar -xzf bash.tar.gz &&  
   tar -xzf node_modules.tar.gz -C ./node_modules && 
  cd portDocument &&  tar -xzf port.tar.gz"

title "解压数据表"
ssh $user@$host "cd $deploy_dir/db &&  tar -xzf jobpost.tar.gz"

title "删除gz文件" // 删除远端的多余文件,保持干净的环境
ssh $user@$host "cd $deploy_dir && 
   rm -rf jobposting_pro.tar.gz bash.tar.gz node_modules.tar.gz&& 
   rm -rf ./db/jobpost.tar.gz &&
   rm -rf ./portDocument/port.tar.gz"

# 在远程服务器上执行 setup.sh 脚本 // 运行第二步-远端脚本
title "执行 setup_remote.sh 脚本"
ssh $user@$host "cd $deploy_dir && chmod +x setup_remote.sh && ./setup_remote.sh"

远程机脚本 - setup_remote.sh

javascript 复制代码
#!/bin/bash

deploy_dir=jobpro
db_name=jobpost
db_folder="/home/jobpost/jobpro/db" // 放数据的文件

echo "是否更新数据库?(y/n): " // 询问用户是否更新数据库,选择了才去做迁移,本项目只用了一套环境,所以这个是很有必要的操作
read answer
if [ "$answer" == "y" ]; then
  echo -e "\e[1;34m正在更新数据库...\e[0m"
  mongo $db_name --eval "
      db.getCollectionNames().forEach(function(collectionName) {
          if (!collectionName.startsWith('system.')) {
              db[collectionName].deleteMany({});
          }
      });
  "
  cd db && rm -rf *.json // 删除json的文件 留下bson
  mongorestore -d $db_name $db_folder
  echo -e "\e[1;34m所有文档名称:\e[0m" // 展出迁移的文档名称
  mongo $db_name --eval "db.getCollectionNames().forEach(printjson)"
  table_count=$(mongo $db_name --quiet --eval "db.getCollectionNames().filter(function(name) { return !name.startsWith('system.'); }).length") // 计算迁移总数
  echo -e "\e[1;34m共迁移成功 $table_count 张表!\e[0m"
  title "数据库更新完成"
else
  echo ''
fi
echo "服务端开始执行脚本>>>..."
# title "重启Nginx服务"
# sudo service nginx restart //根据情况重启 Nginx,下边大家都明白了
title "设置环境变量"
export NODE_ENV=production 
export PORT=80
title "启动服务"
sudo killall node
sudo npm run dev:pro &
title "全部执行完毕!"
echo -e "\e[1;34m⭐️请访问后端地址->:"http://xxx"\e[0m"
echo -e "\e[1;34m⭐️请访问接口文档->:"http://xxx"\e[0m"

🎦结语

有无描述

最近想着前端秋招,所以做了一个交作业的项目,正好用上了数据分析,当做毕设吧~


前端部分用了 COS,它也有自己的命令行工具,上传代码很便捷

接口文档部署在 Nginx,这个比较简单,后边有时间再说啦

有用,点个赞再走吧? 👀

相关推荐
哎呦没32 分钟前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
_.Switch1 小时前
Python Web 应用中的 API 网关集成与优化
开发语言·前端·后端·python·架构·log4j
一路向前的月光1 小时前
Vue2中的监听和计算属性的区别
前端·javascript·vue.js
长路 ㅤ   1 小时前
vite学习教程06、vite.config.js配置
前端·vite配置·端口设置·本地开发
长路 ㅤ   1 小时前
vue-live2d看板娘集成方案设计使用教程
前端·javascript·vue.js·live2d
Fan_web1 小时前
jQuery——事件委托
开发语言·前端·javascript·css·jquery
安冬的码畜日常1 小时前
【CSS in Depth 2 精译_044】第七章 响应式设计概述
前端·css·css3·html5·响应式设计·响应式
韩楚风2 小时前
【linux 多进程并发】linux进程状态与生命周期各阶段转换,进程状态查看分析,助力高性能优化
linux·服务器·性能优化·架构·gnu
莹雨潇潇2 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
陈苏同学2 小时前
4. 将pycharm本地项目同步到(Linux)服务器上——深度学习·科研实践·从0到1
linux·服务器·ide·人工智能·python·深度学习·pycharm