记一次Jenkins构建项目成功后服务并未正常启动的问题
一、问题描述
最近在尝试使用jenkins自动化部署,但是遇到了一点问题,jenkins构建成功,并且已经输出了启动成功的日志,但是实际上服务并没有跑起来
二、问题定位
- 首先查看服务启动日志
通过服务启动日志发现服务是启动成功过的,但启动成功后立马就被shutdown。 - 分析关闭原因
2.1 首先定位是否是注册中心的配置问题,服务无法正确注册到注册中心(虽然大概率不是,但万一呢)
通过检查配置,确认配置没有问题
2.2 那么是否跟网络波动有关系呢
ping一下网络,正常;手动重启一下,再看看日志,发现正常了;再观察一段时间,服务正常运行,没有异常,难道只是因为网络波动?
2.3 继续使用jenkins构建其他服务
发现问题仍然存在,并且手动重启后都是正常的 - 问题确认
通过排查,确认了不是业务系统的原因,那问题只能出在jenkins,在搜索引擎逛了一圈,发现相同的问题不在少数,并且jenkins官方也有相应的解释
三、问题原因
jenkins默认会在构建完成后杀死构建过程中由jenkins中的shell命令触发的衍生进程。
相关官方说明:
https://wiki.jenkins.io/display/JENKINS/ProcessTreeKiller
https://wiki.jenkins.io/display/JENKINS/Spawning+processes+from+build
四、解决办法
-
方法一:将jenkins和业务服务器分开
这样jenkins即使杀死衍生进程也只会是自己服务器的,而不会影响业务服务器。
(因为条件限制,并没有多余的服务器给我使用,所以这个方案没有试过,只是一个想法) -
方法二:修改jenkins配置,禁止其杀死衍生进程
根据jenkins的启动方式,在/etc/sysconfig/jenkins,或者其他启动命令中中加入参数java运行参数-Dhudson.util.ProcessTree.disable=true
(本文章是修改/etc/sysconfig/jenkins文件),然后重启jenkins -
方法三:修改shell脚本,重置BUILD_ID,使jenkins找不到衍生进程
BUILD_ID=DONTKILLME