Jenkins重启后出现“僵尸”流水线运行实例,如何清理?
解决Jenkins 2.107.2重启后流水线显示假未完成的问题
嘿,这个问题我之前在团队里碰到过一模一样的,Jenkins 2.x版本的流水线恢复机制有时候确实会抽风,尤其是2.107.2这个版本,咱们一步步来解决:
问题根源
Jenkins重启时会自动尝试恢复之前中断的构建,但如果流水线已经在重启前完全完成,却在系统的恢复队列里残留了无效记录,就会出现这种“进度条显示未完成,但实际早就成功”的矛盾状态,日志里重复的“Resuming build”信息就是最直接的证据——系统在反复尝试恢复一个已经结束的任务。
具体解决步骤
1. 先清理卡住的恢复任务
- 进入Jenkins后台的「Manage Jenkins」→「Manage Nodes and Clouds」,点击master节点的「Build Executor Status」,找一找有没有标记为「Resuming」的任务,直接手动终止它们。
- 如果批量任务太多,用脚本控制台批量处理更高效:
进入「Manage Jenkins」→「Script Console」,执行下面的Groovy脚本(记得替换成你的流水线名称,要处理所有流水线就去掉名称过滤):
执行后刷新页面,大部分假未完成的状态应该会消失。// 替换成你的流水线全名,比如"dev/backend-pipeline" def pipelineName = "你的流水线名称" def pipeline = Jenkins.instance.getItemByFullName(pipelineName) pipeline.builds.each { build -> if (build.isBuilding() && build.getLog().contains('Resuming build')) { build.doStop() println "已终止卡住的恢复构建 #${build.number}" } }
2. 检查流水线配置与插件兼容性
- 对于Declarative Pipeline,确保你的构建清理配置正确,避免旧构建元数据残留:
在流水线的options块里添加或确认buildDiscarder配置,比如保留最近10个构建:options { buildDiscarder(logRotator(numToKeepStr: '10')) } - 检查核心插件版本:2.107.2对应的
Pipeline: Nodes and Processes和Workflow Durable Task Step插件最好用官方推荐的兼容版本,去「Manage Jenkins」→「Manage Plugins」里查看更新,避免插件冲突导致的状态异常。
3. 手动强制修正构建状态(极端情况)
如果某个构建还是顽固显示未完成,但控制台明确显示Finished: SUCCESS,可以用脚本强制标记为完成:
// 替换成流水线名称和目标构建号 def pipelineName = "你的流水线名称" def buildNumber = 123 def build = Jenkins.instance.getItemByFullName(pipelineName).getBuildByNumber(buildNumber) build.setResult(hudson.model.Result.SUCCESS) build.save() println "已将构建 #${buildNumber} 标记为成功状态"
预防措施
- 重启Jenkins前,尽量先暂停所有正在运行的流水线,等它们全部完成后再重启,减少系统不必要的恢复操作。
- 定期清理旧构建,降低元数据积累带来的异常概率。
内容的提问来源于stack exchange,提问作者tarantoga
相关产品推荐
相关产品推荐

