如何筛选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
相关产品推荐
相关产品推荐

