我想在一个定义管道构建作业的框架中利用Jenkins 的现有Mailer插件Jenkinsfile。给定以下简单的失败脚本,我希望每个构建版本都会收到一封电子邮件。
Jenkinsfile
#!groovy stage 'Test' node { try { sh 'exit 1' } finally { step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: 'me@me.com', sendToIndividuals: true]) } }
构建的输出为:
Started by user xxxxx [Pipeline] stage (Test) Entering stage Test Proceeding [Pipeline] node Running on master in /var/lib/jenkins/jobs/rpk-test/workspace [Pipeline] { [Pipeline] sh [workspace] Running shell script + exit 1 [Pipeline] step [Pipeline] } [Pipeline] // node [Pipeline] End of Pipeline ERROR: script returned exit code 1 Finished: FAILURE
如您所见,它确实记录了它step在失败后立即执行管道的过程,但是没有生成电子邮件。
step
利用自由工作的其他自由式工作中的电子邮件mailer,只是通过管道工作来调用。
mailer
这与Jenkins 2.2和mailer 1.17一起运行。
是否有其他机制可以用来调用失败的构建电子邮件? 我不需要该mail步骤的所有开销,仅需要有关故障和恢复的通知。
mail
在Pipeline中,失败sh不会立即将设置为currentBuild.result,FAILURE而初始值为null。因此,依赖于诸如Mailer之类的构建状态的构建步骤可能看起来不正确。
sh
currentBuild.result
FAILURE
null
您可以通过添加调试打印来检查它:
stage 'Test' node { try { sh 'exit 1' } finally { println currentBuild.result // this prints null step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: 'me@me.com', sendToIndividuals: true]) } }
整个流程都由Jenkins提供的异常处理程序包装,这就是Jenkins最终将构建标记为失败的原因。
因此,如果您想使用Mailer,则需要正确维护构建状态。例如:
stage 'Test' node { try { sh 'exit 1' currentBuild.result = 'SUCCESS' } catch (any) { currentBuild.result = 'FAILURE' throw any //rethrow exception to prevent the build from proceeding } finally { step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: 'me@me.com', sendToIndividuals: true]) } }
如果您不需要重新抛出异常,则可以使用catchError。它是内置的Pipeline,可捕获其范围内的任何异常,将其打印到控制台中并设置构建状态。例:
catchError
stage 'Test' node { catchError { sh 'exit 1' } step([$class: 'Mailer', notifyEveryUnstableBuild: true, recipients: 'me@me.com', sendToIndividuals: true]) }