如何在Jenkins Pipeline中配置类似Email-ext的多场景邮件触发条件?
在Jenkins Pipeline中实现灵活的邮件触发规则
我之前在项目里也碰到过这个问题——Email-ext插件在非Pipeline模式下的触发规则很直观,但切换到Pipeline后默认选项确实受限。不过别担心,我们可以利用Pipeline的脚本化能力,结合Jenkins内置的currentBuild对象来实现首次失败、恢复成功、首次成功这些自定义触发逻辑。
核心思路
通过对比当前构建与历史构建的状态,编写可复用的判断函数,然后在Pipeline的post阶段(构建完成后)根据这些函数的结果触发邮件通知。我们会用到Email-ext插件提供的emailext步骤来发送邮件。
具体实现步骤
1. 编写状态判断函数
先把复杂的状态对比逻辑封装成函数,让Pipeline脚本更清晰易维护:
// 判断是否为「首次失败」:当前构建失败,且之前无失败构建(或首次构建就失败) def isFirstFailure() { return currentBuild.result == 'FAILURE' && (currentBuild.previousBuild == null || currentBuild.previousBuild.result != 'FAILURE') } // 判断是否为「恢复成功」:当前构建成功,且上一次构建是失败状态 def isRecoverySuccess() { return currentBuild.result == 'SUCCESS' && currentBuild.previousBuild != null && currentBuild.previousBuild.result == 'FAILURE' } // 判断是否为「首次成功」:当前构建成功,且之前无成功构建(或首次构建就成功) def isFirstSuccess() { return currentBuild.result == 'SUCCESS' && (currentBuild.previousBuild == null || currentBuild.previousBuild.result != 'SUCCESS') }
2. 在Pipeline中集成邮件通知
把这些函数放到你的Pipeline脚本里,然后在post阶段根据判断结果调用emailext发送对应的邮件:
pipeline { agent any // 定义全局变量,方便统一修改收件人 environment { MAIL_RECIPIENTS = 'your-team@example.com' } stages { stage('Build & Test') { steps { // 替换成你的实际构建步骤,比如编译、单元测试 sh 'echo "执行构建逻辑..."' // 模拟构建失败/成功(实际项目可注释) // sh 'exit 1' // 模拟失败场景 } } } post { always { script { // 首次失败触发告警邮件 if (isFirstFailure()) { emailext( to: env.MAIL_RECIPIENTS, subject: '[Jenkins] 🔥 首次构建失败: ${JOB_NAME} #${BUILD_NUMBER}', body: """ <h3>构建告警:首次失败</h3> <ul> <li>项目名称: ${JOB_NAME}</li> <li>构建编号: ${BUILD_NUMBER}</li> <li>构建状态: <span style="color:red">FAILURE</span></li> <li>构建URL: <a href="${BUILD_URL}">${BUILD_URL}</a></li> <li>历史状态: ${currentBuild.previousBuild ? currentBuild.previousBuild.result : '无历史构建'}</li> </ul> """, mimeType: 'text/html', attachLog: true // 可选:附加完整构建日志 ) } // 恢复成功触发通知邮件 else if (isRecoverySuccess()) { emailext( to: env.MAIL_RECIPIENTS, subject: '[Jenkins] 🎉 构建恢复成功: ${JOB_NAME} #${BUILD_NUMBER}', body: """ <h3>构建通知:恢复成功</h3> <ul> <li>项目名称: ${JOB_NAME}</li> <li>构建编号: ${BUILD_NUMBER}</li> <li>构建状态: <span style="color:green">SUCCESS</span></li> <li>构建URL: <a href="${BUILD_URL}">${BUILD_URL}</a></li> <li>上一次状态: FAILURE</li> </ul> """, mimeType: 'text/html' ) } // 首次成功触发通知邮件(可选) else if (isFirstSuccess()) { emailext( to: env.MAIL_RECIPIENTS, subject: '[Jenkins] 🎊 首次构建成功: ${JOB_NAME} #${BUILD_NUMBER}', body: """ <h3>构建通知:首次成功</h3> <ul> <li>项目名称: ${JOB_NAME}</li> <li>构建编号: ${BUILD_NUMBER}</li> <li>构建状态: <span style="color:green">SUCCESS</span></li> <li>构建URL: <a href="${BUILD_URL}">${BUILD_URL}</a></li> <li>历史状态: ${currentBuild.previousBuild ? currentBuild.previousBuild.result : '无历史构建'}</li> </ul> """, mimeType: 'text/html' ) } } } } }
关键注意事项
- 插件依赖:必须已安装Email-ext插件,且Jenkins的SMTP邮件服务器配置正常。
- 构建结果时机:
currentBuild.result只有在构建完成后才会有值,所以判断逻辑必须放在post阶段,或者在步骤中手动捕获结果后设置。 - 扩展自定义规则:如果需要更复杂的触发条件(比如连续3次失败后通知、从UNSTABLE变为FAILURE等),可以修改判断函数,比如遍历
currentBuild.getPreviousBuilds()来检查更多历史构建的状态。 - 邮件格式调整:示例中用了HTML格式的邮件,你可以根据需求改为纯文本格式,只需移除
mimeType: 'text/html'并调整body内容即可。
内容的提问来源于stack exchange,提问作者Oren Shpigel
相关产品推荐
相关产品推荐

