19

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?

4 Answers 4

30

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

6
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.

1
  • Isn't each sh step its own shell? I don't think the export in your first shell is going to exist in the second shell. May 24, 2022 at 19:50
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.

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 &
) &

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .