18

I'm running a shell command at the end of a Jenkins deployment to restart a forever script:

npm install && forever stop app.js && forever start -a -l /var/log/forever.log app.js

When I run that as a user jenkins everything works fine and the console output from the build history also tells me that the forever script is running. However, the process stops right after the deployment is finished and the forever process is stopped.

What causes this behavior and how can I fix it?

Patrick
  • 351
  • 1
  • 3
  • 11

4 Answers4

29

Jenkins kills all process spawn by the job.

This can be disabled by setting the BUILD_ID environment variable to something else:

export BUILD_ID=dontKillMe

see https://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller for details

rcomblen
  • 476
  • 4
  • 5
3

In the new Pipeline jobs, setting BUILD_ID no longer works. Instead, you need to set JENKINS_NODE_COOKIE to prevent Jenkins from killing your process when the job finishes.

sh 'export JENKINS_NODE_COOKIE=dontKillMe'
sh 'myProcess'

Or, more selectively:

sh 'JENKINS_NODE_COOKIE=dontKillMe myProcess'

See the wiki on ProcessTreeKiller and this comment in the Jenkins Jira.

jpyams
  • 435
  • 4
  • 7
2

The question is quite old, but there is a better solution in this case I think.

Use Post-Build Script Plug-In

The plugin itself is not updated since the beginning of 2016, but it does the job and you do not have to fiddle with environment variables. Seems a bit neater to me.

matewilk
  • 121
  • 1
0

Try with:

(
  set -e
  export BUILD_ID=dontKillMe
  export JENKINS_NODE_COOKIE=dontKillMe
  npm install
  forever stop app.js
  forever start -a -l /var/log/forever.log app.js &
) &
Eduardo Cuomo
  • 192
  • 1
  • 5