You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins流水线运行期间,如何实现控制器与节点重启且不中断任务?

解决Jenkins升级重启中断流水线的方案

一、控制器端:避免apt自动重启Jenkins服务

Debian环境下,apt安装Jenkins新版本时默认会触发postinst脚本重启服务,直接中断所有正在运行的流水线(包括代理节点上的任务)。可以通过以下方式修改升级行为:

  1. 临时禁止服务自动重启
    执行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避免配置文件冲突的交互提示。

  1. 手动触发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会直接终止正在运行的任务,需要调整流程,先让节点完成现有任务再重启:

  1. 配置Jenkins节点离线策略
    在代理节点的配置页面(「Manage Jenkins」→「Manage Nodes and Clouds」→ 对应节点的「Configure」),勾选:
  • 允许节点在离线前完成正在运行的构建
  • 可按需设置「准备离线的超时时间」(用于强制终止长时间运行的任务)
  1. 流水线中先触发节点准备离线,再重启服务
    在流水线的代理升级步骤中,先通过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"
    }
}
  1. 滚动升级代理节点
    不要同时重启两个代理节点,先完成第一个节点的升级、重启和上线,再处理第二个节点。这样始终有一个节点可接受新任务,避免流水线中断。

三、流水线整体优化策略

  1. 调整升级顺序:先升级代理节点,再升级控制器。代理节点升级完成后,控制器的安全重启可以等待所有代理任务完成。
  2. 添加升级前检查:流水线启动时,通过Jenkins API查询是否有正在运行的关键构建,如有则延迟升级。
  3. 节点标签分组:若有更多代理节点,可将节点分组,每次升级一组,保证服务可用性。

内容的提问来源于stack exchange,提问作者Darwick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 02:10:01