最近模块拆分,独立出了几个服务。上线流程并不复杂,只需要在指定目录执行bash deploy.sh master即可上线master分支。但是架不住模块太多,每天在上线流程上也花费了不少时间,所以尝试搭了个jenkins来自动化上线。上线时遇到了一个小坑,jenkins已经输出了启动成功的日志,但是实际上服务并没有跑起来,也就是说服务启动以后又被kill掉了。上网找了找资料,得出结论是jenkins杀掉了刚启动的服务。
服务被杀的原因是:jenkins默认会在构建完成后杀死构建过程中由jenkins中的shell命令触发的衍生进程。
我在jenkins中调用bash deploy.sh master,虽然有supervisord保护我的服务,但是jenkins将supervisord和服务一同杀掉了。在网上找到了两种解决办法,亲测有效,两种方法中我个人更推荐第二种,方法三是我自己想到的,亲测也有效哟~:
方法一:
修改配置,启动jenkins时禁止其杀死衍生进程
在/etc/sysconfig/jenkins中加入参数-Dhudson.util.ProcessTree.disable=true
即java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war
方法二:
修改构建号,使jenkins找不到衍生进程
OLD_BUILD_ID=$BUILD_ID
BUILD_ID=dontKillMe
bash deploy.sh master
BUILD_ID=$OLD_BUILD_ID
方法三:
这是我自己想到的方法,也确实生效了。我们访问生产环境需要先登录跳板机器,然后从跳板机器跳到线上服务器,所以我把jenkins部署到跳板机上,在jenkins的shell脚本中使用ssh脚本访问线上机器。
sh online.sh
cd webserver/server/***
bash deploy.sh master
这样启动之后jenkins杀死的是跳板机上衍生出的ssh进程而不会影响真正线上服务器的进程
希望对大家有所帮助~