如何配置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
相关产品推荐
相关产品推荐

