如何在Jenkins脚本化流水线中无论作业状态均触发邮件
Jenkins脚本化流水线:无论构建结果如何都发送邮件
实现方案
通过try-finally结构保证邮件发送逻辑必然执行,同时可通过异常捕获控制流水线是否中断后续阶段。
完整示例代码
node { def buildResult = 'SUCCESS' try { stage('拉取代码') { // 替换为你的代码拉取逻辑 echo '代码拉取完成' } stage('触发关联作业') { // 触发其他Jenkins作业,wait: true表示等待作业完成 build job: '依赖作业名称', wait: true } stage('构建与测试') { // 替换为你的构建测试逻辑,可取消下面注释模拟失败 // sh 'exit 1' echo '构建测试完成' } } catch (Throwable err) { buildResult = 'FAILURE' currentBuild.result = 'FAILURE' // 标记整体构建状态为失败 echo "流水线执行异常:${err.getMessage()}" // 若需要中断后续阶段(除finally外),取消下面注释抛出异常;否则继续执行 // throw err } finally { stage('发送通知邮件') { echo "基于构建状态[${buildResult}]发送邮件" // 使用emailext插件发送邮件,替换为你的配置 emailext( subject: "Jenkins构建通知:${currentBuild.fullDisplayName} - ${buildResult}", body: """ 构建结果:${buildResult} 构建编号:${currentBuild.number} 查看详情:${currentBuild.absoluteUrl} """, to: 'target@example.com' ) } } }
关键细节说明
try-finally核心作用:不管try块内是正常完成还是抛出异常,finally块的代码都会执行,从根本上保证邮件发送逻辑不被跳过。- 异常捕获与构建状态:在
catch块中标记整体构建为失败,同时可以选择是否抛出异常:- 抛出异常:流水线会在
catch后终止,但finally仍会执行邮件发送。 - 不抛出异常:后续阶段(如果有)会继续执行,适合需要完成所有阶段再发邮件的场景。
- 抛出异常:流水线会在
- 单个阶段容错:如果需要某个阶段失败不影响其他阶段,可在阶段内部单独添加
try-catch:
stage('允许失败的阶段') { try { // 阶段业务逻辑 } catch (Throwable err) { echo "阶段执行失败:${err.getMessage()}" currentBuild.result = 'FAILURE' // 不中断流水线,但标记整体构建失败 } }
内容的提问来源于stack exchange,提问作者NVNK
相关产品推荐
相关产品推荐

