如何确定GitHub仓库中触发Jenkins自动构建的变更文件?
如何获取触发Jenkins构建的GitHub变更文件
完全可以拿到,不需要额外调用外部接口,以下是两种最常用的实现方式,适配不同的Jenkins项目类型。
Pipeline项目(声明式/脚本式)
安装Git插件后的Jenkins自带变更集统计能力,直接通过内置的currentBuild.changeSets对象就能遍历本次构建关联的所有改动文件,不需要额外写Git命令:
pipeline { agent any stages { stage('校验改动文件') { steps { script { def changedFileList = [] // 遍历本次构建关联的所有提交记录 currentBuild.changeSets.each { changeLog -> changeLog.each { commitEntry -> // 遍历单个提交里的所有改动文件 commitEntry.affectedFiles.each { file -> changedFileList.add(file.path) echo "检测到改动文件:${file.path},改动类型:${file.editType.name}" } } } // 针对目标文件做判断 if (changedFileList.contains('test.txt')) { echo "本次构建包含test.txt的变更,执行对应构建逻辑" // 此处添加test.txt变更后需要运行的步骤 } else { echo "本次构建未改动test.txt,跳过对应步骤" } } } } // 后续添加常规构建步骤 } }
这个方法会自动汇总本次触发构建的所有提交里的文件改动,哪怕一次push带了多个commit也不会漏统计。
自由风格项目
如果用的是传统自由风格Job,直接在构建步骤里加Shell执行步骤,通过Git命令对比本次构建commit和上一次构建commit的差异即可拿到改动文件列表:
# 获取当前分支上一次构建的commit哈希 LAST_BUILD_COMMIT=$(git rev-parse HEAD~1) # 输出两个commit之间的所有差异文件名 CHANGED_FILES=$(git diff --name-only $LAST_BUILD_COMMIT $GIT_COMMIT) for singleFile in $CHANGED_FILES; do echo "改动文件:$singleFile" if [ "$singleFile" = "test.txt" ]; then echo "检测到test.txt改动,触发对应逻辑" fi done
避坑说明
- 不建议直接解析GitHub webhook传过来的payload里的文件列表:如果出现webhook重试、多个提交合并触发一次构建的场景,payload里的文件列表可能不全,用Jenkins内置变更集或者本地Git diff拿到的结果最准确。
- 如果Job开启了PR合并后构建的选项,优先用Git diff的方式获取改动列表,避免内置changeSets统计的是PR源分支的改动,和合并后实际代码不一致。
内容的提问来源于stack exchange,提问作者Stella Hansen
相关产品推荐
相关产品推荐

