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

如何在Jenkins多分支流水线中捕获错误并使任务失败?

问题分析

你的流水线出现「构建失败但任务显示成功」的核心原因有两个:

  1. 第一个脚本的catch块中,error语句会直接终止执行流程,导致后续的currentBuild.result = 'FAILURE'根本不会运行;同时post块仅在success时触发,掩盖了失败状态的处理逻辑。
  2. 第二个脚本的catchError用法本身没问题,但你提供的代码不完整(缺少闭合括号、后续流程),导致错误处理逻辑未生效。
修复方案

方案1:简化逻辑,直接让构建命令的失败标记任务失败

去掉冗余的try-catch,让sh命令的失败直接触发构建失败,同时确保工作区无论结果都被清理:

stages {
    stage('[Stage 1] Build') {
        steps {
            sh """#!/bin/bash
            mkdir -p build
            cd build
            cmake ..
            make
            cd .."""
        }
    }
}
post {
    always {
        script {
            try {
                echo "Build Number: ${env.BUILD_NUMBER}"
                echo "Branch name: ${env.GIT_BRANCH}"
            } catch (err) {
                error "[ERROR] Caught error trying to display build info: ${err}"
            } finally {
                cleanWs()
            }
        }
    }
}
  • sh命令默认会在执行失败时抛出异常,直接将构建标记为失败;
  • 将post的触发条件从success改为always,确保不管构建成功/失败都会清理工作区并输出构建信息。

方案2:正确使用catchError(自定义错误信息场景)

如果需要自定义错误提示,确保代码结构完整,参数配置正确:

stages {
    stage('[Stage 1] Build') {
        steps {
            script {
                catchError(buildResult: 'FAILURE', stageResult: 'FAILURE', message: 'Build failed during compilation') {
                    sh """#!/bin/bash
                    mkdir -p build
                    cd build
                    cmake ..
                    make
                    cd .."""
                }
            }
        }
    }
}
post {
    always {
        cleanWs()
        echo "Build Number: ${env.BUILD_NUMBER}"
        echo "Branch name: ${env.GIT_BRANCH}"
    }
}
  • buildResult: 'FAILURE'会标记整个构建的结果,stageResult: 'FAILURE'标记当前阶段的结果;
  • 同样用always块统一处理收尾逻辑,避免遗漏。

方案3:修复原try-catch逻辑(不推荐,冗余)

如果坚持使用try-catch,需调整代码顺序,确保构建结果先被标记:

stages {
    stage('[Stage 1] Build') {
        steps {
            script {
                try {
                    sh """#!/bin/bash
                    mkdir -p build
                    cd build
                    cmake ..
                    make
                    cd .."""
                } catch (err) {
                    currentBuild.result = 'FAILURE'
                    error "[ERROR] Caught error when building branch: ${err}"
                }
            }
        }
    }
}
post {
    always {
        script {
            try {
                echo "Build Number: ${env.BUILD_NUMBER}"
                echo "Branch name: ${env.GIT_BRANCH}"
            } catch (err) {
                error "[ERROR] Caught error trying to display build info: ${err}"
            } finally {
                cleanWs()
            }
        }
    }
}
  • 先设置currentBuild.result = 'FAILURE',再执行error语句,确保构建结果被正确标记;
  • 必须将post改为always,避免失败时无法清理工作区。
关键注意点
  • 不要在error语句后设置currentBuild.result,因为error会直接终止执行,后续代码不会运行;
  • 多分支PR流水线中,检查是否有其他插件/配置覆盖了构建结果的标记逻辑;
  • 收尾逻辑(如清理、日志输出)尽量放在always块,避免遗漏场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:02:27