如何获取Jenkins下游Job不稳定/错误原因并忽略特定异常?
Jenkins下游Job结果自定义处理方案
核心需求
- 快速定位下游Job错误/不稳定的原因及发生阶段
- 忽略特定不稳定场景:下游Job在
Send info阶段因Failed to send info导致的UNSTABLE,此时上游Stage标记为成功 - 其他原因导致的下游Job不稳定/错误,遵循默认规则同步结果到上游
- 尽量避免使用
propagate: false参数
示例基础Pipeline
pipeline { agent { label "masterLin" } options { timestamps() } stages { stage('Run'){ steps { script { def jobBuild = build job: 'test_2'//, propagate: false //test_2通过warnError方法在"Send info"阶段出现不稳定,日志含" ERROR: " //如何忽略该情况并将上游Stage标记为成功? //但如果下游Job因其他原因不稳定或错误,则保留默认标记规则 //尽量不使用propagate: false } } } } }
已尝试的无效实现
String errorTime @NonCPS def getLine(jobBuild) { def BUILD_STRING1 = " ERROR: " jobBuild.getRawBuild().getLog().eachLine { line -> if (line =~ /$BUILD_STRING1/ ) { if (line.contains("Failed to send info")){ println line.plus(" ignoring it") errorTime = line.substring(0, line.indexOf(' ERROR: ')) //尝试捕获错误信息的第二行,但时间戳不一致导致效果不好 } else if (line.contains(errorTime)) { println line.plus(" ignoring it") else { unstable(line) } } } } pipeline { agent { label "masterLin" } options { timestamps() } stages { stage('Run'){ steps { script { def jobBuild = build job: 'test_2', propagate: false if (jobBuild.result == 'UNSTABLE') { echo "UNSTABLE" getLine(jobBuild) } else if (jobBuild.result == 'FAILURE') { echo "ERROR" currentBuild.result='FAILURE' } } } } } post { cleanup { cleanWs() } } }
下游Job日志示例
[Pipeline] stage [Pipeline] { (Send info) [Pipeline] warnError [Pipeline] { [Pipeline] dir ... [2024-06-04T09:25:58.906Z] [ssh-agent] Stopped. [Pipeline] // sshagent [Pipeline] } [Pipeline] // withVaultCredential [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // dir [Pipeline] } [2024-06-04T09:25:59.198Z] ERROR: Failed to send info [2024-06-04T09:25:59.199Z] ERROR: script returned exit code 1 [Pipeline] // warnError [Pipeline] } [Pipeline] // stage [Pipeline] cleanWs [2024-06-04T09:25:59.295Z] [WS-CLEANUP] Deleting project workspace... [2024-06-04T09:25:59.295Z] [WS-CLEANUP] Deferred wipeout is used... [2024-06-04T09:25:59.326Z] [WS-CLEANUP] done [Pipeline] } [2024-06-04T09:25:59.329Z] [Pipeline] // ansiColor [Pipeline] } [Pipeline] // timeout [Pipeline] } [Pipeline] // timestamps [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline Finished: UNSTABLE
可行解决方案
实现思路
- 利用
try-catch捕获build步骤抛出的异常(下游返回UNSTABLE/FAILURE时触发) - 从异常中提取下游构建对象,检查其结果与日志内容
- 匹配到目标场景时,强制将上游结果设为
SUCCESS;其他场景同步下游结果
完整代码
pipeline { agent { label "masterLin" } options { timestamps() } stages { stage('Run'){ steps { script { def jobBuild = null try { // 执行下游Job,默认在下游失败/不稳定时抛出异常 jobBuild = build job: 'test_2' } catch (Exception e) { // 从异常中提取下游构建对象 jobBuild = e.getCause()?.getBuild() if (!jobBuild) { // 无法获取构建对象时直接标记失败 currentBuild.result = 'FAILURE' throw e } // 判断是否为需要忽略的不稳定场景 if (jobBuild.result == 'UNSTABLE') { def logContent = jobBuild.rawBuild.log // 同时匹配阶段标识和错误信息,确保准确性 def isIgnorable = logContent.contains("(Send info)") && logContent.contains("ERROR: Failed to send info") if (isIgnorable) { echo "忽略下游Job因'Send info'阶段发送信息失败导致的不稳定" currentBuild.result = 'SUCCESS' } else { // 其他不稳定场景同步结果 currentBuild.result = 'UNSTABLE' } } else { // 下游失败场景同步结果 currentBuild.result = 'FAILURE' } } } } } } post { cleanup { cleanWs() } } }
关键说明
- 无需使用
propagate: false,通过异常捕获机制获取下游构建状态 - 直接检查日志中是否存在目标阶段和错误信息,避免时间戳匹配的问题
- 严格匹配需要忽略的场景,确保其他异常/不稳定情况正常同步到上游
内容的提问来源于stack exchange,提问作者malltaf
相关产品推荐
相关产品推荐

