如何在Jenkins邮件通知中包含构建/测试失败原因?
Jenkins邮件缺失失败原因的解决方法
问题背景
需要Jenkins发送的邮件直接包含失败的测试或构建信息,不用跳转到控制台日志找问题。试过解析日志、发完整日志、用JELLY_SCRIPT等方法,但都碰到同一个坑:失败通知触发得太早,失败原因还没写入日志,导致邮件里没关键错误信息。测试流水线代码如下:
pipeline { agent { label '' } environment { AccessToken = credentials('xxx') CredentialsIdEsd = "xxx" } stages { stage('Prepare') { steps { script { error 'This is a deliberate failure' } } } } post { failure { script{ emailext subject: "Failed" + " for ${JOB_NAME} JOB#${BUILD_NUMBER}", body: '${JELLY_SCRIPT,template="html"}', from: "Jenkins Build <no-reply@example.com>", to: "mail@example.com" } } } }
可行解决方案
1. 强制刷新构建状态再发邮件
Jenkins的currentBuild对象可能缓存了旧状态,在发邮件前手动刷新,确保失败原因已被记录。如果是慢系统,再加几秒等待让日志写完:
post { failure { script { // 刷新构建对象,获取最新状态和日志 currentBuild.refresh() // 可选:给日志写入留时间,根据自己系统调整时长 sleep(time: 2, unit: 'SECONDS') emailext subject: "Failed for ${JOB_NAME} JOB#${BUILD_NUMBER}", body: """ <h3>构建失败详情</h3> <p><strong>失败原因:</strong>${currentBuild.getLog(10).join('<br>')}</p> <p>任务名称:${JOB_NAME}</p> <p>构建编号:${BUILD_NUMBER}</p> """, from: "Jenkins Build <no-reply@example.com>", to: "mail@example.com" } } }
这里用currentBuild.getLog(10)直接取最后10行日志,把错误信息直接嵌到邮件里。
2. 优化JELLY模板获取最新日志
如果一定要用JELLY_SCRIPT模板,修改模板逻辑,确保它能拿到最新的日志内容。比如在你的HTML模板里加这段:
<j:set var="recentLog" value="${build.getLog(10)}" /> <div class="failure-details"> <h3>最近10行日志(含错误信息)</h3> <ul> <j:forEach var="line" items="${recentLog}"> <li>${line}</li> </j:forEach> </ul> </div>
同时在流水线的failure阶段里,发邮件前先执行currentBuild.refresh(),避免模板拿到旧数据。
3. 换用always阶段判断状态发送
如果failure阶段的触发时机确实早于日志写入,可以改用always阶段,先判断构建失败再发邮件,同样加刷新和等待:
post { always { script { if (currentBuild.result == 'FAILURE') { currentBuild.refresh() sleep(2) emailext subject: "Failed for ${JOB_NAME} JOB#${BUILD_NUMBER}", body: """ 构建失败了! 任务:${JOB_NAME} #${BUILD_NUMBER} 错误信息: ${currentBuild.getLog(10).join('\n')} """, from: "Jenkins Build <no-reply@example.com>", to: "mail@example.com" } } } }
内容的提问来源于stack exchange,提问作者Benjol
相关产品推荐
相关产品推荐

