簡介:
項目是單機版的,但是因爲在更新的時候會停止掉項目,致使前端報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 : 臨時切換到 升級項目