前言:最近写了个一键发布脚本,这个脚本改进了很多次,踩了一些坑,放在这里的是最终版,稍微复杂的地方我都打了注释。
一、项目架构
很常见的双节点负载均衡架构
预发布服务器IP:192.168.1.100
后端节点服务器1:192.168.1.201
后端节点服务器2:192.168.1.202
上边部署了若干服务,脚本里是1个前端页面3个微服务
二、后端节点服务器脚本——功能脚本
以下脚本需在后端节点服务器上都要放在相同位置,用于被预发布服务器上的执行脚本调用。这里只写一个前端页面的和微服务的,有多少个项目就分别制作多少个,照葫芦画瓢即可。
1、前端页面脚本,因不需要重启服务,所以只要做备份和回滚功能就好了。将功能通过函数的方式模块化方便再利用和修改。
mkdir /usr/local/scripts
vim client.sh
#!/bin/bash
NOW_DATE=`date "+%Y-%m-%d"`
NOW_TIME=`date "+%H%M%S"`
client_dir=/var/www/html/client
backup_dir=/usr/local/backup
backup() {
echo -e "\033[33m===== 前端页面 开始备份... =====\033[0m"
if [ -d ${backup_dir}/html-client-${NOW_DATE} ];then
mv ${client_dir} ${backup_dir}/html-client-${NOW_DATE}/${NOW_TIME}
else
mkdir -p ${backup_dir}/html-client-${NOW_DATE} && mv ${client_dir} ${backup_dir}/html-client-${NOW_DATE}/${NOW_TIME}
fi
echo -e "\033[33m===== 前端页面 备份完毕 =====\033[0m"
}
rollback() {
#找出最后备份的目录
declare -a list
list=()
i=0
for j in `ls ${
backup_dir}/html-client-${
NOW_DATE}`
do
list[$i]=$j
i=`expr $i + 1`
done
MAX=${list[0]}
#换算成10进制进行计算,不然当小时分钟是08.09时会被当成8进制数出现value too great for base的数值错误
for I in ${!list[@]};do
if [[ 10#${MAX} -le 10#${list[${I}]} ]];then
MAX=${list[${I}]}
fi
done
#删除现有目录,回滚至最新版本
rm -rf $client_dir && cp -R ${backup_dir}/html-client-${NOW_DATE}/${MAX} $client_dir
echo -e "\033[33m===== 前端页面 回滚完成 =====\033[0m"
}
case $1 in
backup) backup;;
rollback) rollback;;
*) echo "本 $0 发布脚本需携带参数 backup|rollback"
esac
2、jar微服务脚本
这里我用sfa-web项目的脚本举例,其他项目如果大同小异就只需更改变量部分即可。功能比前端多了”停服务,起服务和查状态”。
vim /usr/local/scripts/sfa-web.sh
#!/bin/bash
jdk=/usr/servers/jdk1.8.0_151/bin/java
NOW_DATE=`date "+%Y-%m-%d"`
NOW_TIME=`date "+%H%M%S"`
backup_dir=/usr/local/backup
proj_dir=/usr/local/sfa-web-18081
jar=/usr/local/sfa-web-18081/sfa-web.jar
proj=sfa-web
checkpid() {
pid=`jps -l | grep $proj | grep -v "grep" | awk '{print $1}'`
}
status() {
checkpid
[ ! -z $pid 2>/dev/null ] && echo "$proj项目正在运行中,进程ID: $pid" ||