一、问题描述 环境:
192.168.2.20 jenkins服务器 设置jenkins与tomcat服务器相互免密钥登陆,shell在远程的tomcat服务器上的,用jenkins控制台去调用shell脚本。
用jekins+shell搭建自动化部署更新tomcat,脚本在Linux下运行一切正常,但是当用jenkins构建完毕后,发现shell脚本会将tomcat停止,但是却怎么也无法再次启动tomcat,查了权限问题,脚本问题等等都无法解决,后经过不懈之努力,测试发现,当jekins中只有一个工程(tomcat项目)的时候是正常的,但是有多个工程(tomcat项目)就无法启动,最后在网上查资料知道是jenkins的问题。原因如下:
构建后报错如下图:
百度很多说明都是需要在脚本头部加上export BUILD_ID="xxxxxx"随便写,可以通过改变BUILD_ID的值来防止后台进程被杀死。但是我试过在我这边加了这个没有作用的,最后才想到上面那个找不到jdk或者jre路径的提示,感觉脚本中startup.sh 启动的不是项目Tomcat,而是Jenkins自身Tomcat,于是修改项目Tomcat的catalina.sh, 重新设置了Tomcat启动需要的变量或在脚本头部加上“export JAVA_HOME=xxxx”; 在次构建项目,项目Tomcat启动成功。此时,Jenkins控制台输出的环境变量也变成了项目Tomcat路径,不再是JenkinsTomcat路径。
原因分析(个人理解):项目Tomcat未启动应该环境变量的问题,脚本./startup.sh启动了一个tomcat, 但启动的是Jekins本身的TOMCAT , 不是cd到目录下的目标TOMCAT,正常在服务器cd到对应目录, 此时环境变更(CATALINA_BASE、CATALINA_HOME、CATALINA_TMPDIR、JRE_HOME、CLASSPATH)没值,./startup.sh默认使用当前目录Tomcat路径,故可正常启动当前目录下的TOMCAT;而在Jenkins的脚本中,Jenkins是用TOMCAT启的, 启动的时候设置了环境变量, 要启动的目标TOMCAT是通过Jenkins启动的, 延用了Jenkins的环境变量,其startup.sh (其实是 CATALINA.sh)运行时上述几个环境变量还是Jenkins的值,故再一次启动了Jenkins的TOMCAT,而不是目标TOMCAT。
二、通过Jenkins提供的启动参数禁用杀死子进程的特性
三、最后附上完整脚本 192.168.2.17服务器上shell脚本 (责任编辑:IT) |