一、现象描述
本地脚本运行成功,服务可启动;但使用Jenkins自动部署项目时,发现服务未启动(服务并没有启动,而非启动失败,因为未发现日志信息)。
二、解决此问题的过程
1、Jenkins build结束后会kill掉衍生进程
Jenkins wiki描述,Jenkins build结束后会kill掉衍生进程。尝试重置变量BUILD_ID,避免Jenkins kill进程。
1.1、由于我使用的是Jenkins Pipline,所以应该使用JENKINS_NODE_COOKIE代替BUILD_ID:
Jenkins执行成功了,但是在服务器上却发现cp-device服务并未启动。
1.2、改成通过shell脚本启动:
Jenkins执行成功了,但是在服务器上发现cp-device服务依旧未启动。
1.3、启动时设置禁用进程树:
-Dhudson.util.ProcessTree.disable=true
Jenkins执行成功了,但是在服务器上发现cp-device服务依旧并未启动。。。
o(╥﹏╥)o
o(╥﹏╥)o
o(╥﹏╥)o
难道是方向错了?不能够吧。。
2、Jenkins读取不到/etc/profile的环境变量
谢天谢地,端午节前终于在网上找到了解决方案:
《本地脚本运行成功,Jenkins运行脚本启动服务失败的解决方法》
尝试在启动服务前执行:source /etc/profile(使环境变量生效)
终于成功了,原来是环境变量的问题!!!
可以好好过个端午节了,好开心(。◕ˇ∀ˇ◕)
3、换个方式解决
节后第一天,试了几个服务,发现在Jenkinsfile中使用source /etc/profile后,服务已经启动成功了,但是Jenkins流水线却还未停止(好几分钟了还在运行中,只好手动停止)。
为什么要执行source /etc/profile?因为环境变量问题。
可是我之前在另一台测试服务A上使用Jenkins部署时,没遇到这个问题呀!
刚好看到下图中的方法3
于是参考服务器测试服务A的Jenkinsfile写法,改为使用软链接的方式,将“nohup java -jar xxx”改为“nohup /usr/bin/java -jar xxx”,也能成功启动服务了(^-^)V