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
相关产品推荐
相关产品推荐

