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

如何配置Jenkinsfile让发送邮件阶段在任何情况下都能执行

Jenkinsfile 始终执行发邮件步骤配置方案

核心思路

Jenkins 脚本式流水线默认某阶段执行失败就会抛出异常终止整个流程,要保证邮件发送步骤无论前面阶段是否失败都能执行,可通过 try...finally 结构 + catchError 组合实现,既保证流程不会异常中断,也能保证必要后置步骤始终执行。

修改后完整 Jenkinsfile 代码

properties([[$class: 'BuildDiscarderProperty', strategy: [$class: 'LogRotator', artifactDaysToKeepStr: '14', artifactNumToKeepStr: '10', daysToKeepStr: '14', numToKeepStr: '10']]])
node {
    checkout scm

    def lib = load 'cicd/shared-library.groovy'

    try {
        stage('build project') {
            lib.compileProject()
        }

        stage('Unit test') {
            // 单元测试失败时仅标记构建/阶段失败,不中断后续流程
            catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
                lib.executeUnitTest()
            }
        }

        stage('Archive log files') {
            def files = ["failure_services.txt", "unit_test.log"]
            lib.archiveFile(files, "unit_test_result.tar.xz")
        }
    } finally {
        // finally 块内的步骤无论前面是否报错都会执行
        stage('send email') {
            def subject = "Test Result"
            def content = 'Log file attached'
            def toList = ["aaa@gmail.com", "bbb@gmail.com"]
            def ccList = ["xxx@gmail.com", "zzz@gmail.com"]
            def attachmentFiles = ["unit_test_result.tar.xz"]
            lib.sendMail(toList, ccList, subject, content, attachmentFiles)
        }

        cleanWs()
    }
}

关键修改说明

  • 在单元测试阶段增加catchError配置:单元测试执行失败时只会将该阶段和整体构建标记为失败,不会终止流程,保证后续日志归档步骤可以正常执行,确保邮件附件可以正常生成
  • 使用try块包裹所有业务执行阶段,将必须始终执行的发邮件、清理工作空间步骤放在finally块中,无论try块内是否出现报错,finally块内容都会正常执行

内容的提问来源于stack exchange,提问作者mah454

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:39:03