项目有开发测试服务器和正式服务器,每次更新都有点麻烦:
- 备份当前的Web页面资源和后端服务程序
- 从测试服务器复制Web页面资源和后端服务程序到正式服务器
- 关闭当前后端服务器并重启新的
- 如果出现问题还要快速回滚:从备份文件夹拷贝回来,再重启后端服务
如何让这一切自动化实现?下面以一个golang的web站点为例,目录对照如下:
内容 | 测试服务器 | 正式服务器 |
---|---|---|
域名或IP | x2.domain.com | x.domain.com |
Web页面资源文件夹 | /root/server2/web/build/ | /root/server/web/build/ |
Golang服务器程序文件 | /root/server2/web/goserver | /root/server2/web/goserver |
备份文件夹 | ... | /root/bak/ |
后端服务器运行端口 | ... | 8000 |
Web页面资源使用nginx自动提供,不需要重启。
自动部署新版的脚本
如下编写一个update.sh
脚本文件,更新只要执行sh update.sh
即可,注意最好都使用绝对路径,避免从其他文件夹运行脚本出错。
baktime=$(date +%Y-%m-%d-%H-%M)
mkdir -p /root/bak/server_$baktime/web/
cp -r /root/server/web/build/ /root/bak/server_$baktime/web/
cp /root/server/goserver /root/bak/server_$baktime/
scp -r root@x2.domain.cn:/root/server/web/build/ /root/server/web/
yes | mv -f /root/server/server server_$baktime
scp root@x2.domain.cn:/root/server/goserver /root/server/goserver
chmod 777 /root/server/goserver
lsof -i :8000 | grep goserver | awk '{print $2}' | xargs kill -7
nohup /root/server/goserver --mod=pro >/root/server/goserver.log 2>&1 & disown
-
baktime=$(date +%Y-%m-%d-%H-%M)
创建时间变量精确到分钟,用来做备份文件夹名称 -
mkdir
,创建文件夹,-p创建多层目录; -
cp
,复制到备份文件夹 -
scp
,使用ssh远程复制,会提示输入测试服务器密码,要想永久自动输入密码,先执行下面两个命令:-
ssh-keygen
建议输入一个新文件名/root/.ssh/xxx
-
ssh-copy-id root@x2.shiyancang.cn
需要登录密码就能添加成功
-
-
yes
行,先重命名当前的goserver文件,避免出现Text is busy
文件被占用无法复制的问题。 -
chmod
行,给予复制过来的新文件可执行权限 -
lsof
行,使用管道直接关闭掉8000端口的goserver程序 -
nohup
行,后台重启goserver后端服务
自动回滚老版的脚本
同样创建rollbak.sh
文件如下,回滚执行sh rollbak.sh
然后输入需要回滚的备份文件夹名称即可。
echo "> 可用备份:"
ls /root/bak/
echo "> 请输入或复制粘贴需要回滚的备份完整名称:"
read bakfolder
echo "正在从 $bakfolder 回滚build文件夹和goserver执行文件"
cp -r /root/bak/$bakfolder/web/build /root/server/web/
baktime=$(date +%Y-%m-%d-%H-%M)
yes | mv -f /root/server/goserver goserver_rollbak_$baktime
cp /root/bak/$bakfolder/server /root/server/server
echo "> 正在重新启动zerver服务器程序..."
chmod 777 /root/server/server
lsof -i :3031 | grep server | awk '{print $2}' | xargs kill -7
nohup /root/server/goserver --mod=pro >/root/server/goserver.log 2>&1 & disown
echo "> 回滚已经完成!"
这里仍然把现有的goserver文件重命名为时间戳文件名备用。
END
网友评论