Jenkins流水线运行期间,如何实现控制器与节点重启且不中断任务?
解决Jenkins升级重启中断流水线的方案
一、控制器端:避免apt自动重启Jenkins服务
Debian环境下,apt安装Jenkins新版本时默认会触发postinst脚本重启服务,直接中断所有正在运行的流水线(包括代理节点上的任务)。可以通过以下方式修改升级行为:
- 临时禁止服务自动重启
执行apt dist-upgrade时添加参数,跳过自动重启步骤:
DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade -y --option Dpkg::Options::="--force-confdef" --option Dpkg::Options::="--force-confold" --no-restart-on-upgrade
其中--no-restart-on-upgrade阻止apt自动重启Jenkins,--force-confdef和--force-confold避免配置文件冲突的交互提示。
- 手动触发Jenkins安全重启
升级完成后,不要直接执行systemctl restart jenkins,而是使用Jenkins的安全重启功能,等待所有正在运行的构建完成后再重启:
- UI操作路径:「Manage Jenkins」→「Manage Nodes and Clouds」→ 点击控制器节点的「Prepare for Shutdown」,待所有构建完成后执行
systemctl restart jenkins。 - 自动化API调用(适合流水线集成):
# 替换为你的Jenkins地址、用户名和API令牌 curl -X POST -u "admin:API_TOKEN" "http://your-jenkins-url/safeRestart"
安全重启会让控制器停止接受新任务,等待所有代理节点的现有构建完成后再重启服务。
二、代理节点:重启前等待任务完成
代理节点执行systemctl restart jenkins-node会直接终止正在运行的任务,需要调整流程,先让节点完成现有任务再重启:
- 配置Jenkins节点离线策略
在代理节点的配置页面(「Manage Jenkins」→「Manage Nodes and Clouds」→ 对应节点的「Configure」),勾选:
- 允许节点在离线前完成正在运行的构建
- 可按需设置「准备离线的超时时间」(用于强制终止长时间运行的任务)
- 流水线中先触发节点准备离线,再重启服务
在流水线的代理升级步骤中,先通过API让节点进入准备离线状态,等待任务完成后再执行重启:
// 替换为你的节点名称、Jenkins地址、凭据ID def nodeName = "agent-node-1" def jenkinsUrl = "http://your-jenkins-url" def credentialsId = "jenkins-api-token" withCredentials([usernamePassword(credentialsId: credentialsId, usernameVariable: 'USER', passwordVariable: 'TOKEN')]) { // 触发节点准备离线 sh """ curl -X POST -u "${USER}:${TOKEN}" "${jenkinsUrl}/computer/${nodeName}/doPrepareShutdown" """ // 等待节点变为空闲状态 waitUntil { def nodeStatus = sh(script: "curl -s -u \"${USER}:${TOKEN}\" \"${jenkinsUrl}/computer/${nodeName}/api/json\" | jq '.idle'", returnStdout: true).trim() return nodeStatus == "true" } // 重启代理服务 sh "ssh user@${nodeName} 'systemctl restart jenkins-node'" // 等待节点重新上线 waitUntil { def nodeOnline = sh(script: "curl -s -u \"${USER}:${TOKEN}\" \"${jenkinsUrl}/computer/${nodeName}/api/json\" | jq '.offline'", returnStdout: true).trim() return nodeOnline == "false" } }
- 滚动升级代理节点
不要同时重启两个代理节点,先完成第一个节点的升级、重启和上线,再处理第二个节点。这样始终有一个节点可接受新任务,避免流水线中断。
三、流水线整体优化策略
- 调整升级顺序:先升级代理节点,再升级控制器。代理节点升级完成后,控制器的安全重启可以等待所有代理任务完成。
- 添加升级前检查:流水线启动时,通过Jenkins API查询是否有正在运行的关键构建,如有则延迟升级。
- 节点标签分组:若有更多代理节点,可将节点分组,每次升级一组,保证服务可用性。
内容的提问来源于stack exchange,提问作者Darwick
相关产品推荐
相关产品推荐

