springboot jar項目通過shell快捷迭代線上版本

簡介:

項目是單機版的,但是因爲在更新的時候會停止掉項目,致使前端報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.shshutdown.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	: 臨時切換到 升級項目
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章