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

如何在Jenkins流水线中针对非基础设施相关错误重试代码块?

问题描述

Jenkins 流水线提供了retry步骤,可在发生错误时重新执行代码。可选的conditions参数支持agent值,会重新执行那些「大概率由基础设施而非构建行为导致」的错误。

我需要处理完全相反的情况:只针对由构建行为导致、非基础设施相关的错误进行重试,有没有简便的实现方式?

我已经尝试过两种方法,但都没成功:

  • 对条件取反,比如retry(conditions: [!agent()], count: 3),但retry步骤要求的是org.jenkinsci.plugins.workflow.flow.ErrorCondition类的对象,不是布尔值。
  • 实现一个继承自ErrorCondition的自定义类,在测试方法中委托给AgentErrorCondition对象并返回取反结果,但没达到预期效果——难道只能通过开发插件实现?
解决方案

方法1:脚本式异常判断结合retry

不需要自定义类,直接在retry块内捕获异常,通过异常特征判断是否重试:

retry(count: 3) {
    try {
        // 你的构建逻辑代码
        runBuildTasks()
    } catch (Exception e) {
        // 根据异常类名、消息判断是否为基础设施相关错误
        def isInfraError = e.class.name.contains('Agent') || e.message =~ /node|agent|连接超时/
        if (isInfraError) {
            // 基础设施错误,不重试,直接抛出终止流程
            throw e
        }
        // 构建行为导致的错误,不抛出异常,触发retry自动重试
        echo "捕获到构建错误,触发重试:${e.message}"
    }
}

这种方式无需额外插件,直接在流水线脚本中实现,可根据实际异常特征调整判断逻辑,灵活度高。

方法2:自定义ErrorCondition(需插件开发)

如果一定要复用retry的conditions参数,确实需要开发自定义插件:

  1. 创建继承自ErrorCondition的类,比如NonInfraErrorCondition
  2. 在test方法中调用AgentErrorCondition的test方法,返回取反结果
  3. 将类打包为Jenkins插件并安装后,即可在流水线中使用:
retry(conditions: [NonInfraErrorCondition()], count: 3) {
    // 你的构建逻辑
}

该方式适合需要跨流水线复用该条件的场景,但需要具备Jenkins插件开发能力。

方法3:循环+条件判断实现重试

用基础循环逻辑替代retry步骤,逻辑更直观:

def maxRetries = 3
def retryCount = 0
def buildSuccess = false

while (!buildSuccess && retryCount < maxRetries) {
    try {
        // 构建逻辑
        runBuildTasks()
        buildSuccess = true
    } catch (Exception e) {
        retryCount++
        def isInfraError = e.class.name.contains('Agent') || e.message =~ /node|agent/
        // 基础设施错误或重试次数耗尽时,终止流程
        if (isInfraError || retryCount >= maxRetries) {
            throw e
        }
        echo "第${retryCount}次重试,原因:${e.message}"
    }
}

这种写法对新手友好,无需依赖retry步骤的复杂参数,调试更方便。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 05:52:47