上期回顾
掘金文章地址 上期做了npm自动发布脚本,感觉笨笨哒...
近期又因为自己新开了一个项目,后端每写完一个接口,每次的 部署真的超麻烦 的好嘛!!
我已经厌倦了自己、厌倦了生活、厌倦了没有自动化的编程路 💢💢💢
本期代码舔狗(舔代码)
先贴一下我这次的项目吧【目前还是学生 轻一点骂!】:)
上图几个架构的地址 - > github 有用可以点一下star~
还有一部分还在写ing 但可以看一下接口文档-> 在线链接
前端地址 - > github 有用可以点一下star~
前端就是提交作业的app,但包括了数据分析、权限管理等等很多操作,用了大量的可视化图表 -> 在线链接 (目前还有用)
🌝目的
讲述需求
写完后端 -> 就部署 -> 前端就能和后端很"轻松、快捷、无等待"的联调
- 手动去服务器或者第三方部署效率低、费劲
- 我写了bash脚本(shell)去一行命令自动化部署后端服务(不止后端)
- 结果 🔽
整体思路(重点)🔽
两个文件:
- packfor_remote 本地打包脚本
- setup_remote 远端脚本
- 先将代码在宿主机打包成tar包
- 将数据库导出打包等待上传
- 上传所有的代码、依赖、数据和脚本代码到服务器
- 删除多余的文件(如 .gz文件)
- 执行setup_remote脚本 => 开启服务
- 迁移数据库
- 设置环境变量
- 重启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,这个比较简单,后边有时间再说啦
有用,点个赞再走吧? 👀