为何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
相关产品推荐
相关产品推荐

