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

Jenkins:测试失败时如何让流水线阶段直接失败?

Jenkins流水线UI测试失败未终止流水线的原因及解决方案

原因分析

你的问题核心在于:UI测试失败时,Jenkins将构建标记为不稳定(黄色)而非失败(红色),导致UITests阶段仍被判定为成功,因此post块的success分支始终执行。

具体细节:

  • 当make run_tests返回exit code 1时,若你的测试框架或Jenkins测试插件(如JUnit)将测试失败识别为「构建不稳定」而非「步骤执行失败」,Jenkins会认为整个sh步骤是成功完成的,只是测试结果存在失败,因此阶段保持绿色,构建转为黄色。
  • post块的分支是基于阶段状态而非构建整体状态判断的,只要阶段成功就会走success分支,和构建是否不稳定无关。

解决方案

方案一:显式检查命令退出码,主动终止流水线

通过sh步骤的returnStatus参数捕获命令退出码,手动判断是否触发失败,强制终止流水线:

stage('UITests') {
    steps {
        withCredentials([file(credentialsId: 'env_file', variable: 'envFile')]) {
            script {
                // 捕获命令退出码,不直接让步骤失败
                def testExitCode = sh(
                    script: '''
                        cat $envFile > .env.dev
                        make run_tests
                    ''',
                    returnStatus: true
                )
                // 非零退出码则主动抛出错误,标记阶段失败
                if (testExitCode != 0) {
                    error "UI Tests Failed with exit code ${testExitCode}, stopping pipeline"
                }
            }
        }  
    }
    post {
        success {
            echo "UI Tests passed, proceeding to Build stage"
        }
    }
}

方案二:调整测试报告插件的状态判定(若使用JUnit等报告)

如果你的测试会生成JUnit格式的报告,可通过junit步骤强制将测试失败标记为构建失败,而非不稳定:

stage('UITests') {
    steps {
        withCredentials([file(credentialsId: 'env_file', variable: 'envFile')]) {
            sh '''
                cat $envFile > .env.dev
                make run_tests
            '''
            // 配置JUnit插件,只要有测试失败就标记构建失败
            junit(
                testResults: '**/test-results.xml', // 替换为你的测试报告实际路径
                allowEmptyResults: false,
                failureThreshold: 1, // 至少1个失败就触发构建失败
                unstableThreshold: 0 // 关闭不稳定阈值判定
            )
        }  
    }
    post {
        success {
            echo "UI Tests passed moving to Build stage"
        }
        failure {
            echo "UI Tests Failed, pipeline stopped"
        }
    }
}

关键说明

  • Jenkins的阶段状态由步骤执行结果决定,只有当步骤抛出错误(如error指令、sh命令非零退出且未捕获),阶段才会标记为失败,post的failure分支才会触发。
  • 测试失败默认触发「不稳定」是Jenkins的常规行为,用于区分「命令执行失败」和「测试逻辑失败」,但通过上述方法可以强制将测试失败转为流水线终止的触发条件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:50:22