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

如何解决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
    }
}
解决方案

让代理失联后任务自动失败

  1. 配置节点失联检测
    进入代理节点(someagent)的配置页面:

    • 找到「Node Properties」→「Advanced」,勾选「Mark this node as offline when ping fails」,设置合理的检测间隔(如10秒)和失败阈值(如3次),节点失联后会被自动标记为离线。
    • 同时设置「Inactivity timeout」(如5分钟),节点超过指定时间无响应则标记离线,Jenkins会终止该节点上的停滞任务。
  2. 给流水线添加超时控制
    在声明式流水线中加入全局或阶段级超时,避免任务无限停滞:

    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ņš

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:05:24