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

为何Jenkins流水线的try/catch块触发任务时失效?

解决Jenkins多分支流水线首次构建失败的问题

你的核心问题是try-catch没有捕获到Jenkins构建步骤抛出的异常,导致首次构建失败后直接终止流水线,无法进入重试逻辑。这是因为Jenkins Pipeline的build步骤抛出的是hudson.AbortException(属于特殊的终止异常),普通的Exception捕获范围不包含它。下面是几种可行的解决方式:

方式一:精准捕获Jenkins构建异常

修改catch块,明确捕获hudson.AbortException,或者用更宽泛的Throwable覆盖所有异常类型:

// 触发分支扫描
build job: buildJobForFeatureBranch, wait: false
sleep(10)

// 带异常捕获的重试逻辑
try {
  build job: cm.ftBuildJob,
        parameters: [
          string(name: "VERSION_PASSEDIN", value: srcBranch),
          string(name: "UPLOAD_ARTIFACTS", value: "true"),
          string(name: "DEBUG_LEVEL", value: "0")
        ],
        wait: true
}
catch(hudson.AbortException e) {
  // 捕获构建失败异常,执行重试
  build job: cm.ftBuildJob,
        parameters: [
          string(name: "VERSION_PASSEDIN", value: srcBranch),
          string(name: "UPLOAD_ARTIFACTS", value: "true"),
          string(name: "DEBUG_LEVEL", value: "0")
        ],
        wait: true
}

方式二:使用Jenkins内置的retry步骤(更优雅)

Jenkins Pipeline提供了retry步骤,专门用于重试逻辑,无需手动处理异常捕获:

// 触发分支扫描
build job: buildJobForFeatureBranch, wait: false
sleep(10)

// 重试最多2次(首次尝试+1次重试)
retry(2) {
  build job: cm.ftBuildJob,
        parameters: [
          string(name: "VERSION_PASSEDIN", value: srcBranch),
          string(name: "UPLOAD_ARTIFACTS", value: "true"),
          string(name: "DEBUG_LEVEL", value: "0")
        ],
        wait: true
}

retry(2)会自动捕获构建失败的异常,最多重试2次,直到成功或达到次数上限。

方式三:添加前置检查(减少不必要的重试)

sleep(10)的等待时间不稳定,可提前检查目标分支的Job是否存在且参数已初始化,避免盲目触发构建:

// 触发分支扫描
build job: buildJobForFeatureBranch, wait: false

// 循环检查目标Job是否可用,最多等待30秒
def maxWaitTime = 30
def waitInterval = 5
def currentWait = 0
def jobExists = false

while(currentWait < maxWaitTime && !jobExists) {
  try {
    // 尝试获取Job对象,验证是否存在
    def targetJob = Jenkins.instance.getItemByFullName(cm.ftBuildJob)
    // 检查参数是否已配置
    def hasRequiredParams = targetJob.parameters.any { it.name == "VERSION_PASSEDIN" }
    jobExists = hasRequiredParams
  } catch(Exception e) {
    // Job还未生成,继续等待
    sleep(waitInterval)
    currentWait += waitInterval
  }
}

// 确认Job可用后触发构建,若仍失败则重试
retry(2) {
  build job: cm.ftBuildJob,
        parameters: [
          string(name: "VERSION_PASSEDIN", value: srcBranch),
          string(name: "UPLOAD_ARTIFACTS", value: "true"),
          string(name: "DEBUG_LEVEL", value: "0")
        ],
        wait: true
}

这个方案先确保目标Job的参数已初始化完成,再执行构建,能减少重试的概率。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:07:05