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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:01:49