24

I am looking for a way to run a java process in background using Jenkins declarative pipeline. Below is the snippet of code

stage('Deploy'){
        steps{
            script{
                withEnv(['BUILD_ID=dontkill']) {
                    sh "nohup java -jar test-0.0.1-SNAPSHOT.war &"
                }
            }
        }
}

Already aware of ProcessTreeKiller of Jenkins and every answer suggest to do the same. I have tried using environment inside the steps block with no luck.

Jenkins version : 2.60.1

Pipeline plugin : 1.1.7

Any help is greatly appreciated.

7
  • What happens? Error message? Silent fail?
    – B Layer
    Commented Jul 5, 2017 at 8:55
  • I do not have a running java process. This is the final stage in my pipeline so my guess is that jenkins starts it and terminates it the very next moment. Commented Jul 5, 2017 at 8:57
  • What happens when you run the command directly on the slave? Log into the agent/slave host, go to the job's workspace (or if it was cleaned up manually copy in the war file somewhere.../tmp for example), and run everything between the double-quotes.
    – B Layer
    Commented Jul 5, 2017 at 13:13
  • Also, if the workspace was not wiped out look for a file named nohup.out in whatever directory the shell command would have run. nohup automatically logs to such a file when the output is not otherwise redirected.
    – B Layer
    Commented Jul 5, 2017 at 13:15
  • @BlairM the same script runs fine when i try it with jenkins user via a non-login non-interactive shell. Running in double quotes makes no difference. nohup.out is present but it is 0 KB. Commented Jul 6, 2017 at 7:57

3 Answers 3

22

Any one facing the same problem and using pipeline project, set JENKINS_NODE_COOKIE instead of BUILD_ID.

Dont waste your time setting HUDSON_COOKIE, HUDSON_SERVER_COOKIE, JENKINS_COOKIE or JENKINS_SERVER_COOKIE. None of them work for pipeline project.

Refer to https://issues.jenkins-ci.org/browse/JENKINS-28182 for more details.

1
  • 1
    Whoa, that's some inside baseball right there. Good to know.
    – B Layer
    Commented Jul 16, 2017 at 7:18
2

Alternative solution. Use the parallel pipeline step to run your foreground and background processes as equal partners in, well, parallel.

One advantage is that you have easy access to the stdout of the background process in the Blue Ocean UI.

stage("Run") {
    parallel {
        stage('k3s') {
            steps {
                sh 'sudo /home/jenkins/k3s server --write-kubeconfig-mode 664 & echo $! > $WORKSPACE/k3s.pid; wait -n $(cat $WORKSPACE/k3s.pid) || true'
            }
        }
        stage('test') {
            steps {
                sh 'sleep 1; ps -p $(cat $WORKSPACE/k3s.pid)'
                sh 'while ! /home/jenkins/k3s kubectl get node; do sleep 1; done'
            }
            post {
                always {
                    sh 'while ps -p $(cat $WORKSPACE/k3s.pid); do sudo kill -9 $(cat $WORKSPACE/k3s.pid); sleep 5; done'
                }
            }
        }
    }
}
1

With a bat pipeline step it works with:

            script {
                withEnv ( ['JENKINS_NODE_COOKIE=do_not_kill'] ) {

                   bat """
                       @set prompt=\$G\$S
                       cd ${RUN_DIR}
                       start \"title\" my.bat
                       start \"title\" my.cmd
                       start \"title\" my.exe
                       """
                }
            }
 
2
  • 1
    Thanks . I've been looking for this jem for couple of hours. This solution actually works
    – Mike
    Commented Jan 31, 2023 at 13:05
  • why are there underscores, shouldnt it be doNotKill?
    – Nor.Z
    Commented Aug 27, 2023 at 10:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.