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

如何获取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

可行解决方案

实现思路

  1. 利用try-catch捕获build步骤抛出的异常(下游返回UNSTABLE/FAILURE时触发)
  2. 从异常中提取下游构建对象,检查其结果与日志内容
  3. 匹配到目标场景时,强制将上游结果设为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 07:44:55