使用emailext插件时如何检查已发送邮件的状态



我正在使用Jenkins 2.332.3的电子邮件扩展插件,但是当我得到电子邮件扩展配置错误时,我的构建仍然成功,即使我得到例如

AuthenticationFailedException message: 535 5.7.3 Authentication failed

是否有一种方法来获得构建失败,如果我有不正确的emailext配置?我的舞台:

emailext(
attachmentsPattern: "test.txt",
subject: "Test",
body: "Example test",
replyTo: 'test@test.com'
)

当配置有效时,我得到

DEBUG SMTP: message successfully delivered to mail server

我简单地检查了插件的源代码,这似乎是不可行的。所有错误都被捕获并妥善处理。检查在这里。而且,插件的执行甚至不返回状态码。检查在这里。

所以我没有办法知道邮件是否发送了

在彻底检查了代码之后,我注意到有一个选项可以在发送邮件后执行postscript。该脚本可以全局指定,也可以在管道中指定。所以我想出了一个很有创意的解决方案。基本上,在发送邮件之后,您可以捕获来自SMTP服务器的响应。此响应将包含一些细节,您可以使用这些细节来确定它是成功还是失败。

如果成功,您将看到如下所示的响应。(这里我用的是Gmail SMTP服务器)

250 2.0.0 OK  1655253667 cc23-20020a05622a411700b00304f98ad3c1sm7772402qtb.29 - gsmtp

在身份验证失败时,您应该看到如下所示:

535-5.7.8 Username and Password not accepted. Learn more at
535 5.7.8  https://support.google.com/mail/?p=BadCredentials q18-20020a05622a04d200b002f906fc8530sm8752555qtx.46 - gsmtp

正如我前面提到的,管道只是从脚本中吞下抛出的所有错误,没有办法访问当前构建上下文。因此,作为一种解决方案,我将响应写入一个文件,然后基于此标记作业的状态。请参考以下管道。

pipeline {
agent any
stages {
stage('MailAndFail') {
steps {
script{
echo "Starting Mailing"
def script = "String response = transport.getLastServerResponse();println "Mail Response: " + response;File file = new File("/var/jenkins_home/workspace/EMAIEXT2222/MailResponse.txt");file.write response"
emailext(
to: "test@gmail.com",
subject: "Test",
body: "Example test",
replyTo: 'test@test.com',
postsendScript: "$script"
)
sh "cat MailResponse.txt"
def response = readFile(file: 'MailResponse.txt')
if(!response.contains("2.0.0 OK")) {
echo "BUILD FAILURE!!!!"
currentBuild.result = 'FAILURE'
}
}
}
}
}
}

注意:确保将文件写入路径更改为工作空间/var/jenkins_home/workspace/EMAIEXT2222中的目录。此外,脚本中的打印语句将不会显示在构建控制台中。你可以在Jenkins日志中看到它们。另外,如果出现脚本没有执行权限的错误,请确保批准了groovy脚本。你可以从这里开始:http://JENKINSHOST/scriptApproval/

最新更新