前端:继上次的笨....这次我又因为懒,写了自动化部署脚本(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,这个比较简单,后边有时间再说啦

有用,点个赞再走吧? 👀

相关推荐
想用offer打牌4 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
崔庆才丨静觅4 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60615 小时前
完成前端时间处理的另一块版图
前端·github·web components
KYGALYX5 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了5 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅5 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅5 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
爬山算法6 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
七夜zippoe6 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
盟接之桥6 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造