Jenkins脚本控制台与Build Agent

问题描述

我在Jenkins构建中遇到一些奇怪的行为(Jenkins项目是一个多分支管道,其中包含源存储库提供的Jenkinsfile)。最后一步是部署应用程序,其中包括替换远程主机上的工件,然后重新启动运行它的进程。

一个问题外,其他所有东西都可以正常运行-构建完成后,该服务不再运行。我什至在重新启动脚本之后添加了一些调试消息,以通过构建输出证明它确实有效。但是由于某种原因,在构建退出后,该服务将不再运行。我已经进行了广泛的测试,以确保Jenkins以正确的用户身份连接到远程主机,设置了正确的env vars,等等。此外,重新启动脚本的输出首先非常详细-无法获得成功输出(如果它实际上不起作用)。因此,我假设在构建完成执行之后,在远程主机上运行部署步骤的过程正在做其他事情。

这是很奇怪的地方:如果我使用脚本控制台为相同的远程主机运行相同的部署命令,则它可以正常工作。成功启动后,服务不会停止。

“完全相同”是指脚本相同,但脚本控制台和管道之间的DSL不同。例如,在脚本控制台中,我使用

println "deployscript.sh <args>".execute().text

我在管道中使用

pipeline {
  agent {
    node 'mynode'
  }
  stages {
    /*other stages commented out for testing*/
    stage('Deploy') {
      steps {
        script {
            sh 'deployscript.sh <args>'
        }
      }
    }
  }
}

我也没有通过SSH手动运行命令的任何问题。

有人知道这里发生了什么吗?脚本控制台与构建代理如何连接到远程主机有什么区别?这些进程中的任何一个是否运行其他命令?我知道SSH会话是由Java进程控制的,但是我对Jenkins的实现了解不多。

如果有人对应用程序本身感到好奇,那么它就是用于OpenEdge的Progress Application Server(PASOE)实例。部署过程包括取消部署旧的WAR文件,部署新的WAR文件,然后停止/启动实例。

更新: 我在部署脚本的末尾添加了60秒的睡眠时间,以便在Jenkins进程结束之前有时间测试服务。这是成功的,所以我可以确定,当Jenkins构建过程退出时,它将导致服务中断。我不确定这是否与Jenkins拥有一个进程有关,但是脚本控制台再次可以很好地解决此问题...

解决方法

发现了问题。它埋在一些底层的Jenkins文档中,但是Jenkins构建具有默认行为,即杀死该构建所产生的任何进程。这证实了詹金斯是罪魁祸首,并且该构建确实运行正常。它只是在构建完成后被杀死的。

解决方法是将BUILD_ID环境变量的值(对于管道,就像我的情况一样,设置为JENKINS_NODE_COOKIE)设置为“ dontKillMe”。

例如:

pipeline {
  agent { /*set agent*/ }
  environment {
    JENKINS_NODE_COOKIE="dontKillMe"
  }
  stages { /*set build stages*/ }
}

有关更多详细信息,请参见此处:https://wiki.jenkins.io/display/JENKINS/ProcessTreeKiller