Jenkins declarative pipeline能否在各stage成功或失败时发送邮件?
需求可行性结论
该需求完全可落地实现,依托Jenkins Declarative Pipeline原生的阶段后置处理机制,配合官方邮件扩展插件,就能精准覆盖Build、package、deploy三类stage的成功/失败状态通知,不需要额外开发自定义插件。
核心实现逻辑
- 不要把邮件通知逻辑只放在pipeline最外层的全局
post块中,这类全局逻辑只会在整条流水线全部运行结束后统一触发,满足不了单stage独立发通知的要求 - 给每个Build、package、deploy stage单独配置专属的
post后置块,通过块内的状态匹配规则,精准捕捉当前stage的执行结果 - post块内可直接匹配两种核心状态:
success:当前stage所有步骤执行无报错时触发failure:当前stage任意步骤执行报错时触发
- *机制说明:即便某个stage执行失败触发流水线中断,系统也会优先完成该stage内部的post块执行逻辑,确保失败通知能正常发出,不会出现通知漏发的情况
可直接复用的Jenkinsfile示例
pipeline { agent any stages { stage('Build') { steps { // 原有Build阶段逻辑,例如下载代码、编译构建 echo "Execute build compile step" } post { success { emailext ( subject: "[流水线通知] Build阶段执行成功", body: "当前构建 ${env.BUILD_URL} 的Build阶段已完成", to: "收件人邮箱列表" ) } failure { emailext ( subject: "[流水线告警] Build阶段执行失败", body: "当前构建 ${env.BUILD_URL} 的Build阶段执行报错,请及时排查", to: "收件人邮箱列表" ) } } } stage('package') { steps { // 原有打包阶段逻辑,例如打包镜像、生成制品 echo "Execute package step" } post { success { emailext ( subject: "[流水线通知] package阶段执行成功", body: "当前构建 ${env.BUILD_URL} 的制品打包阶段已完成", to: "收件人邮箱列表" ) } failure { emailext ( subject: "[流水线告警] package阶段执行失败", body: "当前构建 ${env.BUILD_URL} 的制品打包阶段执行报错,请及时排查", to: "收件人邮箱列表" ) } } } stage('deploy') { steps { // 原有部署阶段逻辑,例如推送制品到环境、触发服务重启 echo "Execute deploy step" } post { success { emailext ( subject: "[流水线通知] deploy阶段执行成功", body: "当前构建 ${env.BUILD_URL} 的部署流程已完成", to: "收件人邮箱列表" ) } failure { emailext ( subject: "[流水线告警] deploy阶段执行失败", body: "当前构建 ${env.BUILD_URL} 的部署流程执行报错,请及时排查", to: "收件人邮箱列表" ) } } } } }
落地注意事项
- 需提前安装
Email Extension Plugin插件,在Jenkins全局配置中完成SMTP发件服务参数填写,否则emailext命令无法正常触发邮件发送 - 如果三个stage的邮件逻辑重复度较高,可以将邮件发送逻辑抽为流水线内的自定义函数,每个stage的success/failure分支仅需传入对应阶段名称调用函数即可,减少重复代码
- 如果需要在某个stage失败后不中断整条流水线,继续执行后续stage,可以在对应stage的options块中添加
catchError(buildResult: 'UNSTABLE', stageResult: 'FAILURE')配置,当前stage标记为失败、发完通知后可继续流转到后续stage执行,同样不会影响后续stage的通知触发逻辑
内容的提问来源于stack exchange,提问作者Aravind Krishna
相关产品推荐
相关产品推荐

