记一次Jenkins无法启动tomcat问题解决

问题描述

项目发版部署采用Jenkins+tomcat进行。jenkins的tomcat和项目的tomcat在同一台服务器上,端口不同。发版采用jenkins的shell脚本进行,会在服务器上拉取最新代码,然后打包,替换war包,kill掉tomcat进程再重新启动。但只能做到kill掉进程,无法启动项目的tomcat,需要每次去服务器上手动执行startup.sh来启动。

问题排查

首先看看是不是shell脚本的问题,部署的shell脚本如下:

#!/bin/bash
export BUILD_ID=dontkillme
rm -f /datadrive01/mainTomcat/apache-tomcat-9.0.54/webapps/ROOT.war
rm -rf /datadrive01/mainTomcat/apache-tomcat-9.0.54/webapps/ROOT
cd /root/.jenkins/workspace/mdm
rm -rf /root/.jenkins/workspace/mdm/core/target/ROOT.war
#/datadrive01/maven/apache-maven-3.5.2/bin/mvn clean package -Pdev
/datadrive01/maven/apache-maven-3.6.3/bin/mvn clean package -Pdev
cp /root/.jenkins/workspace/mdm/core/target/ROOT.war  /datadrive01/mainTomcat/apache-tomcat-9.0.54/webapps/ROOT.war
cd /datadrive01/mainTomcat/apache-tomcat-9.0.54/bin
pid=$(ps aux | grep tomcat | grep -v grep| grep /datadrive01/mainTomcat/apache-tomcat-9.0.54 | awk '{print $2}')
if echo  $pid|grep "^[0-9][0-9]*$"
then
#export BUILD_ID=1
echo $pid
kill -9 ${pid}
fi
sleep 3
echo startTomcat
cd /datadrive01/mainTomcat/apache-tomcat-9.0.54/bin
/datadrive01/mainTomcat/apache-tomcat-9.0.54/bin/startup.sh
sleep 5

可以看到,shell脚本没有什么问题。网上搜索相似问题,大部分都是说要加上BUILD_ID,防止刚启动的tomcat进程被kill掉。但是这里的shell脚本中已经有了BUILD_ID,所以并不是这个问题。

在多次使用jenkins发版的过程中,其实并不只是项目的tomcat无法启动的问题,有些时候jenkins的tomcat会有多个进程在运行,这可能是问题的关键所在。会不会并不是无法启动,而是启动的路径错了呢?错误地将jenkins的tomcat启动了。

随即去查看启动脚本,shell脚本执行的是startup.sh,脚本里面的内容很少,但其实这并不是真正的tomcat启动脚本,在这个脚本中,转而去执行了catalina.sh这个脚本,这才是启动tomcat的关键。

对比jenkins的catalina.sh和项目的catalina.sh,终于发现了一些端倪。

jenkins的catalina.sh多了一段对CATALINA_HOME和CATALINA_BASE的指定内容:

为什么要加这两行呢?尝试将这两行代码注释,kill掉jenkins的tomcat进程,再重新启动,意外的发现,启动的是项目的tomcat,而不是jenkins的tomcat

明明是在jenkins的路径下执行的,为什么会启动项目的tomcat呢?这里就是关键所在。推测脚本中会自动读取环境变量中的内容。尝试输出环境变量,果然如此:

看来之前负责这个项目的人,是为了让jenkins能够正常启动,所以才手动指定了这两个路径,让脚本不去读取环境变量中的内容。而项目的tomcat,则没有进行定制,环境变量中配置的路径是项目tomcat的路径,所以也能够正常启动。

那么既然环境变量中是项目tomcat的路径,为什么在jenkins的shell脚本中,没有生效呢?这里推测是因为在启动jenkins的tomcat的时候,配置在脚本中的路径,产生了影响。那里的配置,会影响到由jenkins执行的shell脚本中对环境变量的判断,这就是关键所在。

好了,问题找到了,要怎么解决呢?其实也很简单,在项目的tomcat配置中,也参照着jenkins的配置来一份就可以了。不让脚本去读取环境变量中的配置,而是自己指定。

尝试kill掉两个tomcat,然后启动jenkins的tomcat,可以正常启动访问。然后点击构建,在服务器上监控tomcat进程。终于,成功将项目的tomcat启动了!

问题总结

其实这个问题的关键就在于,catalina.sh这个脚本,会去读取环境变量中的配置,而不是根据自己的相对位置来执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值