我正在寻找一种使用Jenkins声明性管道在后台运行Java进程的方法。以下是代码片段

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


已经知道Jenkins的ProcessTreeKiller了,每个答案都建议这样做。我曾尝试在步骤块内使用环境,但没有运气。

詹金斯版本:2.60.1

管道插件:1.1.7

任何非常感谢您的帮助。

评论

怎么了?错误信息?无声的失败?

我没有正在运行的Java进程。这是我管道中的最后阶段,所以我想詹金斯会启动它并在下一刻终止它。

当直接在从站上运行命令时会发生什么?登录到代理程序/从属主机,转到作业的工作空间(或者是否已将其手动清除到war文件中的副本中,例如... / tmp),然后在双引号之间运行所有内容。

另外,如果没有清除工作空间,请在将运行shell命令的任何目录中查找名为nohup.out的文件。如果未以其他方式重定向输出,则nohup会自动记录到此类文件。

@BlairM当我通过非登录非交互式shell与jenkins用户一起尝试时,同一脚本运行良好。用双引号引起来没有区别。 nohup.out存在,但为0 KB。

#1 楼

任何面临相同问题并使用管道项目的人,请设置JENKINS_NODE_COOKIE而不是BUILD_ID。它们都不适合管道项目。

有关更多详细信息,请参阅https://issues.jenkins-ci.org/browse/JENKINS-28182。

评论


哇,那是里面的棒球。很高兴知道。

– B层
17年7月16日在7:18

#2 楼

替代解决方案。使用parallel管道步骤以并行方式平等地运行前台和后台进程。
优点之一是,您可以轻松地在Blue Ocean界面中访问后台进程的标准输出。
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'
                }
            }
        }
    }
}