简介:
项目是单机版的,但是因为在更新的时候会停止掉项目,致使前端报502,很不好的用户体验,虽然是短短的几十秒而已,所以通过nginx做了负载均衡,通过负载均衡做切换,但是。。。切换的时候需要修改配置,启动,修改配置,启动。。。等一些列的重复麻烦的动作,所以写了一个shell用来全自动更新,命令从之前的十几二十多个减少到 2个
项目结构
-项目
-shell.sh
-ss-1.0-SNAPSHOT.jar
-main
-start.sh
-shutdown.sh
-logs
-ss-1.0-SNAPSHOT.jar
-update
-start.sh
-shutdown.sh
-logs
-ss-1.0-SNAPSHOT.jar
shell代码:
# 操作 main update
# 只有两个,一个是长期跑的jar,一个是用来升级的jar
action="${1}"
if [ "$action" != "main" -a "$action" != "update" ]; then
echo "未知的操作!"
exit 1
fi
# 配置nginx 主目录, 配置文件地址
nginx_path="/data/nginx/"
nginx_conf_path="${nginx_path}/conf/vhost/h.https.conf"
# 配置 主。备端口、jar地址、jar名字
main_port="8888"
update_port="8889"
main_path="/data/product/ss/main/"
update_path="/data/product/ss/update/"
jar_name="ss-1.0-SNAPSHOT.jar"
# 要启动的端口
start_port=""
shutdown_port=""
project_path=""
shutdown_path=""
check(){
if [ ! -e "${nginx_conf_path}" ]; then
echo "nginx 配置文件不存在[${nginx_conf_path}]"
exit 1
fi
if [ ! -e "./${jar_name}" ]; then
echo "当前目录项目${jar_name}不存在"
exit 1
fi
if [ "$action" = "main" ]; then
c=`cat ${nginx_conf_path} | grep "\sserver\s127\.0\.0\.1\:${update_port};" | wc -l`
line=${c}
if [ "$line" -ne "1" ]; then
echo "配置文件错误"
exit 1
fi
c=`cat ${nginx_conf_path} | grep "#server\s127\.0\.0\.1\:${main_port};" | wc -l`
line=${c}
if [ "$line" -ne "1" ]; then
echo "配置文件错误"
exit 1
fi
elif [ "$action" = "update" ]; then
c=`cat ${nginx_conf_path} | grep "#server\s127\.0\.0\.1\:${update_port};" | wc -l`
line=${c}
if [ "$line" -ne "1" ]; then
echo "配置文件错误"
exit 1
fi
c=`cat ${nginx_conf_path} | grep "\sserver\s127\.0\.0\.1\:${main_port};" | wc -l`
line=${c}
if [ "$line" -ne "1" ]; then
echo "配置文件错误"
exit 1
fi
else
echo "未知的类型"
exit 1
fi
}
editConf(){
echo "更改nginx配置"
if [ "$action" = "main" ]; then
sed -i "s/server 127.0.0.1:${update_port};/#server 127.0.0.1:${update_port};/" ${nginx_conf_path}
sed -i "s/#server 127.0.0.1:${main_port};/server 127.0.0.1:${main_port};/" ${nginx_conf_path}
elif [ "$action" = "update" ]; then
sed -i "s/#server 127.0.0.1:${update_port};/server 127.0.0.1:${update_port};/" ${nginx_conf_path}
sed -i "s/server 127.0.0.1:${main_port};/#server 127.0.0.1:${main_port};/" ${nginx_conf_path}
else
echo "未知的类型"
exit 1
fi
}
setAttr(){
echo "设置变量"
if [ "$action" = "main" ]; then
project_path="${main_path}"
start_port="${main_port}"
shutdown_port="${update_port}"
shutdown_path="${update_path}"
elif [ "$action" = "update" ]; then
project_path="${update_path}"
shutdown_path="${main_path}"
start_port="${update_port}"
shutdown_port="${main_port}"
else
echo "err"
fi
}
check
editConf
setAttr
echo "复制项目到目标目录"
\cp ./${jar_name} ./${action}
echo "进入项目目录>>${project_path}"
cd ${project_path}
echo "启动项目"
./start.sh
echo "检测项目状态..."
scmd=``
count=0
ret=""
while [ $count -le "20" ]
do
count=`expr $count + 1`
scmd=`curl -I -X POST -m 3 -o /dev/null -s -w %{http_code} http://127.0.0.1:${start_port}`
ret=${scmd}
if [ $ret == "404" ]; then
echo "尝试${count}次检测,启动完成!"
break
fi
echo "[${count}]错误的状态码[$ret],进行尝试..."
sleep 3s
done
if [ $count -ge "20" ]; then
echo "项目启动失败,请手动处理!"
exit 1
fi
echo "重启nginx"
cmd=`${nginx_path}/sbin/nginx -s reload`
${cmd}
echo "关闭旧项目${shutdown_path}"
scmd=`curl -I -X POST -m 3 -o /dev/null -s -w %{http_code} http://127.0.0.1:${shutdown_port}`
ret=${scmd}
if [ $ret != "404" ]; then
echo "项目没有启动"
else
cd ${shutdown_path}
./shutdown.sh
fi
附(start.sh、shutdown.sh)
# start.sh
cmd=`/data/jdk1.8/bin/java -Xms700M -Xmx700M -jar ss-1.0-SNAPSHOT.jar --spring.profiles.active\=pro --server.port\=8888 > logs/.log &`
${cmd}
# shutdown.sh
port="8888"
echo "停止端口[${port}]的springboot程序..."
cmd=`curl -i -X POST http://127.0.0.1:${port}/shutdown`
ret=${cmd}
使用:
./shell main : 切换到 主项目
./shell update : 临时切换到 升级项目