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

Jenkins Pipeline:如何配置仅在代码构建失败时触发Slack通知?

区分Jenkins Pipeline构建失败与测试失败的Slack通知方案

一、直接用failure条件的问题

你当前的post { failure { ... } }配置不符合需求——因为默认的failure会覆盖两种场景:

  • 构建阶段(拉取源码、编译打包等)失败,导致Pipeline进入failure状态
  • 测试阶段失败(如果测试失败被标记为failure而非unstable),同样会触发failure条件

也就是说,测试出错时也会发Slack通知,这不是你想要的结果。

二、仅在构建失败时发通知的实现方法

方法1:给构建阶段单独设置post条件

把构建和测试拆成独立的stage,在构建阶段的专属post块里设置failure触发通知,这样只有构建环节失败才会触发:

pipeline {
    agent any
    stages {
        stage('拉取并构建') {
            steps {
                // 这里放你的拉取源码、构建命令
                git url: '你的Git仓库地址'
                sh 'mvn clean package -DskipTests'
            }
            post {
                failure {
                    slackSend( 
                        channel: "#my_alerts", 
                        token: "slack_webhook token", 
                        color: "danger", // 失败用红色更合理,good是成功的绿色
                        message: "构建失败:${env.JOB_NAME} #${env.BUILD_NUMBER} - ${env.BUILD_URL}"
                    )
                }
            }
        }
        stage('执行测试') {
            steps {
                // 这里放你的测试执行命令
                sh 'mvn test'
            }
            // 测试失败如果不需要通知,就不设置post;需要的话可以单独配置unstable/failure
        }
    }
}

方法2:全局post中判断失败阶段

如果不想拆分阶段,也可以在全局post里通过currentBuild对象获取失败的阶段名称,判断是不是构建阶段:

pipeline {
    agent any
    stages {
        stage('拉取并构建') {
            steps {
                git url: '你的Git仓库地址'
                sh 'mvn clean package -DskipTests'
            }
        }
        stage('执行测试') {
            steps {
                sh 'mvn test'
            }
        }
    }
    post {
        failure {
            script {
                // 获取所有失败的阶段名称
                def failedStages = currentBuild.rawBuild.getAction(org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper.FailedStagesAction)?.getFailedStageNames()
                // 只在构建阶段失败时发送通知
                if (failedStages && failedStages.contains('拉取并构建')) {
                    slackSend( 
                        channel: "#my_alerts", 
                        token: "slack_webhook token", 
                        color: "danger",
                        message: "构建失败:${env.JOB_NAME} #${env.BUILD_NUMBER} - ${env.BUILD_URL}"
                    )
                }
            }
        }
    }
}

三、额外提示

  • 测试失败一般建议通过JUnit等插件标记为unstable状态,这种情况下默认的failure条件不会触发,但如果你的测试脚本把失败设为failure状态,就必须用上面的方法区分。
  • Slack的color参数要对应状态:danger是红色(失败),good是绿色(成功),别搞混了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:33:26