记录一下一个gitlab-ci部署springboot碰到的问题
部署前需要先关闭原来跑的jar进程,用pkill(虽然说有一些问题,但可以根据进程名粗暴全杀,毕竟方便,只要进程在运行时加入全路径,这样也可以做到精准kill),另外网络上有优雅结束springboot进程的方法,暂不是很适用。
- 杀死进程命令(不杀死原进程就运行新进程,显然会因为端口占用报错):
sshpass -p 'password' ssh root@ip "pkill -f /www/wwwroot/kola.designer/kolaboot-0.0.1-SNAPSHOT.jar"
如果进程不存在(没有运行或上一次运行失败自动退出),那么这句ssh pkill 会在gitlab-ci里出错:ERROR: Job failed: exit status 1,实际上在其他shell里运行这句是没问题,这个gitlab-ci script会因某些内部错误退出。
这里就需要在ssh + if 去远端机子判断是否存在进程,如果本身就不存在,就跳过pkill。
- echo "生产环境:运行服务器端命令"
- RESULT=$(sshpass -p 'password' ssh root@ip "ps -ef | grep /www/wwwroot/kola.designer/kolaboot-0.0.1-SNAPSHOT.jar | wc -l")
- echo 判断是否由kolaboot-0.0.1-SNAPSHOT.jar进程
- |
if [ ${RESULT} -le 2 ]; then
echo "含bash,grep进程数只有2个,真正进程不存在,跳过pkill"
else
echo 先杀死原有kolaboot-0.0.1-SNAPSHOT.jar进程,含grep命令行进程数${RESULT}
sshpass -p 'password' ssh root@ip "pkill -f /www/wwwroot/kola.designer/kolaboot-0.0.1-SNAPSHOT.jar"
fi
- echo "指定生产环境 prod,在后台运行colaboot-0.0.1-SNAPSHOT.jar进程(运行前暂停30秒)"
- sshpass -p 'password' ssh root@ip "cd /www/wwwroot/kola.designer;sleep 30;nohup java -jar /www/wwwroot/kola.designer/kolaboot-0.0.1-SNAPSHOT.jar > /www/wwwroot/kola.designer/log/nohup_${DATETIME}.log 2>&1 & "
- echo "运行成功,稍后请测试..."
本来也想用 grep -v grep |awk ‘{print $2}’ 来排除grep命令本身,并用awk 第二列 获得精准的pid,但是在gitlab-ci script里面有太多限制,当然可以把以下脚本存成一个文件,在gitlab-ci里执行这个脚本。不过我只想一个gitlab-ci.yml就搞定一切,就没去试验。
#!/bin/bash
pid=`ps -ef | grep summer-admin | grep -v grep |awk '{print $2}'`
if [ $pid ]; then
echo :App is running pid=$pid
kill -9 $pid
fi
java -jar /home/roo/summer-admin.jar &