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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 11:50:10