How can I have Jenkins restart a Tomcat instance after a successful deployment?
I already tried using a batch script, but the Tomcat instance is killed when the build is finished.
How can I have Jenkins restart a Tomcat instance after a successful deployment?
I already tried using a batch script, but the Tomcat instance is killed when the build is finished.
Your answer lies in Jenkins ProcessTreeKiller. A more detailed explanation here.
It's a design decision to kill any processes that are spawned by the build to maintain a clean environment. Unfortunately that means you can't leave a process (such as Tomcat) running after the build.
You can disable this functionality globally (not recommended) by launching Jenkins like this:
java -Dhudson.util.ProcessTree.disable=true -jar jenkins.war
Or you can disable this on a per-case basis, by launching the process with a changed environment variable:
BUILD_ID=dontKillMe ./catalina restart
Some people report however that changing
BUILD_ID
is not enough. They recommend also unsetting:JENKINS_COOKIE
JENKINS_SERVER_COOKIE
Edit:
Another issue that could be at play is that when you connect to remote shell, and start a process in that remote shell session, once you (Jenkins) disconnects, the session is killed and all processes spawned by the session are killed too. To get around that issue, you need to disassociate the process from the shell session.
One way is:
nohup ./catalina restart &
This is how I am restarting Tomcat after deployment via jenkins.
I am having two servers DEV and QA where I need to do the deployment and restart tomcat. I have Jenkins installed in DEV server.
tomcat-restart.ksh
in the server where you have tomcat installed..#!/bin/bash echo "*********************Restarting Tomcat70.******************" sh /apps/apache/sss-tomcat70.ksh status echo "Trying to stop Tomcat." sh /apps/apache/sss-tomcat70.ksh stop echo "Getting Tomcat Status." sh /apps/apache/sss-tomcat70.ksh status echo "Trying to Start Tomcat" sh /apps/apache/sss-tomcat70.ksh start sleep 2 echo "Getting Tomcat Status" sh /apps/apache/sss-tomcat70.ksh status
Since Jenkins and Tomcat is installed in the same machine I am directly calling the script.
In Jenkins go to
Add post-build action
and choosePost build task
and in theScript
textbox add the following :/apps/apache/tomcat-restart.ksh
Since Jenkins is installed in different server, I am calling the script to restart Tomcat via Secure Shell.
In Jenkins go to Add
post-build action
selectPost build task
and in the Script textbox add the following :sshpass -p 'myPassword' ssh -tt username@hostname sudo sh /apps/apache/tomcat-restart.ksh
You need to install
sshpass
if its not already installed.If everything went fine, then you may see something like this in your Jenkins log.
Hope this helps.