Jenkins 脚本控制台与构建代理
Jenkins Script Console vs Build Agent
我在使用 Jenkins 构建时遇到了一些奇怪的行为(Jenkins 项目是一个多分支管道,具有源存储库提供的 Jenkinsfile)。最后一步是部署应用程序,其中涉及替换远程主机上的工件,然后重新启动 运行 的进程。
除一个问题外一切正常 - 构建完成后服务不再 运行ning。我什至在重启脚本后添加了一些调试消息,以通过构建输出证明它确实在工作。但出于某种原因,在构建退出后,服务不再 运行ning。我已经进行了广泛的测试,以确保 Jenkins 以正确的用户身份连接到远程主机,设置了正确的环境变量等。另外,重新启动脚本的输出一开始就非常详细——没有办法获得如果它实际上没有工作,则输出成功。所以我假设 运行s 远程主机上的部署步骤在构建完成执行后正在做其他事情。
这就是它变得奇怪的地方:如果我 运行 使用脚本控制台对相同的远程主机执行完全相同的部署命令,它就可以工作。而且服务启动成功后没有停止
“完全相同”是指脚本相同,但脚本控制台和管道之间的 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 的实现知之甚少。
如果有人对应用程序本身感到好奇,它就是一个 Progress Application Server for OpenEdge (PASOE) 实例。部署过程涉及取消部署旧 WAR 文件、部署新文件,然后 stopping/starting 实例。
更新:
我在部署脚本的末尾添加了 60 秒的睡眠时间,以便让我有时间在 Jenkins 进程结束之前测试服务。这是成功的,所以我确定 Jenkins 构建过程退出时会导致服务停止运行。我不确定这是否是 Jenkins 拥有进程的问题,但脚本控制台再次处理得很好...
发现问题。它隐藏在一些 low-level 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
我在使用 Jenkins 构建时遇到了一些奇怪的行为(Jenkins 项目是一个多分支管道,具有源存储库提供的 Jenkinsfile)。最后一步是部署应用程序,其中涉及替换远程主机上的工件,然后重新启动 运行 的进程。
除一个问题外一切正常 - 构建完成后服务不再 运行ning。我什至在重启脚本后添加了一些调试消息,以通过构建输出证明它确实在工作。但出于某种原因,在构建退出后,服务不再 运行ning。我已经进行了广泛的测试,以确保 Jenkins 以正确的用户身份连接到远程主机,设置了正确的环境变量等。另外,重新启动脚本的输出一开始就非常详细——没有办法获得如果它实际上没有工作,则输出成功。所以我假设 运行s 远程主机上的部署步骤在构建完成执行后正在做其他事情。
这就是它变得奇怪的地方:如果我 运行 使用脚本控制台对相同的远程主机执行完全相同的部署命令,它就可以工作。而且服务启动成功后没有停止
“完全相同”是指脚本相同,但脚本控制台和管道之间的 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 的实现知之甚少。
如果有人对应用程序本身感到好奇,它就是一个 Progress Application Server for OpenEdge (PASOE) 实例。部署过程涉及取消部署旧 WAR 文件、部署新文件,然后 stopping/starting 实例。
更新: 我在部署脚本的末尾添加了 60 秒的睡眠时间,以便让我有时间在 Jenkins 进程结束之前测试服务。这是成功的,所以我确定 Jenkins 构建过程退出时会导致服务停止运行。我不确定这是否是 Jenkins 拥有进程的问题,但脚本控制台再次处理得很好...
发现问题。它隐藏在一些 low-level 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