如何解决Jenkins在代理机关闭时任务停滞的问题?
问题描述
- Jenkins代理为普通工作站,任务运行期间代理关机后,任务会无限停滞(即使代理恢复后仍无进展),期望任务直接失败,附加需求是能从最后失败的步骤重启。
- 任务停滞时最后一条日志:
Cannot contact someagent: java.lang.InterruptedException
- 手动中止停滞任务时提示:
Aborted by admin
Sending interrupt signal to process
Click here to forcibly terminate running steps
After 20s process did not stop
- 当前环境:最新Jenkins LTS,声明式流水线调用PowerShell脚本,代码片段:
stage('Build') { steps { powershell '. Tools\\Build\\Build.ps1 -version $env:VERSION' } } stage('Package') { steps { powershell '. Tools\\Build\\Package.ps1 -artifact $env:ARTIFACT' archiveArtifacts ARTIFACT } }
解决方案
让代理失联后任务自动失败
配置节点失联检测
进入代理节点(someagent)的配置页面:- 找到「Node Properties」→「Advanced」,勾选「Mark this node as offline when ping fails」,设置合理的检测间隔(如10秒)和失败阈值(如3次),节点失联后会被自动标记为离线。
- 同时设置「Inactivity timeout」(如5分钟),节点超过指定时间无响应则标记离线,Jenkins会终止该节点上的停滞任务。
给流水线添加超时控制
在声明式流水线中加入全局或阶段级超时,避免任务无限停滞:pipeline { agent { label 'someagent' } options { // 全局超时,根据任务实际耗时调整 timeout(time: 30, unit: 'MINUTES') // 允许从任意失败阶段重启(满足附加需求) restartFromStage('*') } stages { stage('Build') { steps { powershell '. Tools\\Build\\Build.ps1 -version $env:VERSION' } } stage('Package') { steps { powershell '. Tools\\Build\\Package.ps1 -artifact $env:ARTIFACT' archiveArtifacts ARTIFACT } } } }
实现从最后步骤重启
- 上述流水线配置中的
restartFromStage('*')选项,会允许任务失败后,在任务详情页点击「Restart from stage」按钮,选择从最后失败的阶段重新执行。 - 如果需要自动重试,可在阶段内用
retry和catchError组合:stage('Build') { steps { catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') { // 最多重试2次,可根据需求调整次数 retry(2) { powershell '. Tools\\Build\\Build.ps1 -version $env:VERSION' } } } }
关于“未停止进程”的疑问
当代理机突然关机,Jenkins控制器与代理的连接直接中断,控制器无法收到代理发送的进程终止信号,因此会在本地保留对该任务进程的虚拟引用。实际上代理机上的进程已经随系统关闭而完全终止,控制器提示的“未停止进程”是状态不同步导致的假象。
解决这个假象的方法:先手动将代理节点标记为离线,再中止任务,此时控制器会直接终止任务,不会再出现进程未停止的提示。
内容的提问来源于stack exchange,提问作者Ansis Māliņš
相关产品推荐
相关产品推荐

