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

如何筛选Jenkins两次构建间的提交并向提交者发送构建状态邮件

解决方案:Jenkins 筛选两次构建间提交并发送状态邮件

一、核心思路

不依赖第三方插件,直接通过Git命令提取两次构建的提交差异,结合Jenkins环境变量和邮件插件实现需求,避开插件配置的潜在问题。

二、自由风格项目实现步骤

1. 保存当前构建的Git提交哈希

在构建步骤中添加「执行Shell」(Linux/macOS)或「执行Windows批处理命令」,执行以下命令:

# 将当前构建的Git提交哈希写入文件,供下一次构建读取
git rev-parse HEAD > ${WORKSPACE}/current_commit.txt

2. 提取两次构建间的提交差异

添加第二个「执行Shell」步骤,获取上一次构建的提交哈希并生成变更列表:

# 检查上一次构建的提交哈希文件是否存在
if [ -f "${WORKSPACE}/../${PREVIOUS_BUILD_NUMBER}/current_commit.txt" ]; then
  PREVIOUS_COMMIT=$(cat "${WORKSPACE}/../${PREVIOUS_BUILD_NUMBER}/current_commit.txt")
  CURRENT_COMMIT=$(git rev-parse HEAD)
  
  # 生成包含作者名、邮箱、提交信息的变更列表,保存到文件
  git log ${PREVIOUS_COMMIT}..${CURRENT_COMMIT} --pretty=format:"%an|%ae|%s" > ${WORKSPACE}/changes.txt
  
  # 提取去重后的作者邮箱,避免重复发送邮件
  awk -F'|' '{print $2}' ${WORKSPACE}/changes.txt | sort | uniq > ${WORKSPACE}/authors.txt
else
  # 首次构建无历史提交,生成空内容文件
  echo "首次构建,无历史提交对比。" > ${WORKSPACE}/changes.txt
  echo "" > ${WORKSPACE}/authors.txt
fi

3. 配置邮件发送(使用Email Extension插件)

  • 确保已安装「Email Extension Plugin」并完成SMTP服务器基础配置。
  • 在「构建后操作」中添加「Editable Email Notification」:
    • 收件人:填写 ${FILE,path="authors.txt"},自动读取生成的作者邮箱列表。
    • 邮件主题:设置为 构建${BUILD_STATUS}: ${JOB_NAME} #${BUILD_NUMBER}。
    • 邮件内容:示例如下,可根据需求调整格式:
      构建状态:${BUILD_STATUS}
      构建链接:${BUILD_URL}
      
      上次构建以来的代码变更:
      ${FILE,path="changes.txt"}
      
    • 触发条件:选择「Always」(无论构建成功/失败都发送),或按需选择「Success」「Failure」等。

三、Pipeline项目实现(更灵活)

如果使用Pipeline脚本,可直接整合所有逻辑,无需分步配置:

pipeline {
    agent any
    stages {
        stage('获取提交变更') {
            steps {
                script {
                    // 获取上一次构建对象及对应提交哈希
                    def prevBuild = currentBuild.previousBuild
                    def prevCommit = prevBuild ? sh(
                        script: "git rev-parse ${prevBuild.changeSets[0].items[0].commitId}",
                        returnStdout: true
                    ).trim() : null
                    def currCommit = sh(script: 'git rev-parse HEAD', returnStdout: true).trim()

                    if (prevCommit) {
                        // 生成带格式的变更详情
                        def changeDetails = sh(
                            script: "git log ${prevCommit}..${currCommit} --pretty=format:'作者: %an <%ae>%n提交ID: %h%n提交信息: %s%n---%n'",
                            returnStdout: true
                        ).trim()
                        // 提取去重后的作者邮箱
                        def authorEmails = sh(
                            script: "git log ${prevCommit}..${currCommit} --pretty=format:'%ae' | sort | uniq",
                            returnStdout: true
                        ).trim().split('\n').join(',')

                        writeFile file: 'change_details.txt', text: changeDetails
                        writeFile file: 'author_list.txt', text: authorEmails
                    } else {
                        writeFile file: 'change_details.txt', text: '这是首次构建,无历史提交对比。'
                        writeFile file: 'author_list.txt', text: ''
                    }
                }
            }
        }
    }
    post {
        always {
            script {
                def authorList = readFile('author_list.txt').trim()
                def changeContent = readFile('change_details.txt').trim()
                def buildStatus = currentBuild.currentResult

                // 仅当有作者时发送邮件
                if (authorList) {
                    emailext(
                        to: authorList,
                        subject: "构建${buildStatus}: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
                        body: """
构建状态:${buildStatus}
构建链接:${env.BUILD_URL}

上次构建以来的代码变更:
${changeContent}
                        """.stripIndent()
                    )
                }
            }
        }
    }
}

四、注意事项

  • 确保Jenkins节点已安装Git,且任务拥有仓库的读取权限。
  • 若上一次构建被删除或不存在,脚本会自动处理首次构建的情况。
  • 如需排除特定提交,可在Git log命令中添加过滤规则,比如 git log ${PREVIOUS_COMMIT}..${CURRENT_COMMIT} --grep="skip"(根据提交信息过滤)。
  • 邮件插件需提前配置SMTP服务器,确保Jenkins能正常发送邮件。

内容的提问来源于stack exchange,提问作者Abilash Krishnan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:55:18