如何获取PR中所有提交的修改文件列表(Jenkinsfile场景)
获取Jenkins PR构建中所有提交的修改文件列表
哥们,我之前踩过这个坑!你现在用的changeSets只能拿到触发当前构建的那批增量提交(也就是你新推送的修复提交),而不是整个PR里的所有变更。这是因为Jenkins默认会把每次推送触发的构建的变更集限定在这次推送的提交里,不会自动回溯整个PR的历史提交。下面给你两个靠谱的解决方案:
方案一:用Git命令直接对比PR分支与目标分支(最推荐)
PR的本质就是源分支和目标分支的差异,所以直接用Git的diff命令就能拿到两个分支间所有的修改文件,不管你推了多少次提交。
具体代码(Jenkinsfile中使用)
// 获取PR的目标分支和源分支(依赖GitHub/GitLab等集成插件提供的环境变量) def targetBranch = env.CHANGE_TARGET ?: 'main' // 没有PR时默认主分支,可根据你的仓库调整 def prSourceBranch = env.CHANGE_BRANCH ?: env.BRANCH_NAME // 先拉取最新的远程分支信息,确保本地有最新的分支状态 sh 'git fetch origin' // 执行diff命令,获取两个分支间所有修改的文件路径(--name-only只返回文件名) def allModifiedFiles = sh( script: "git diff --name-only origin/${targetBranch}...origin/${prSourceBranch}", returnStdout: true ).trim().split('\n') // 遍历输出所有修改文件 allModifiedFiles.each { filePath -> println "修改文件:${filePath}" }
注意事项
- 确保你的Jenkins节点有权限访问Git远程仓库,并且已经完成了代码拉取操作;
- 不同Git平台的环境变量略有不同:
- GitHub:
env.CHANGE_TARGET是PR目标分支,env.CHANGE_BRANCH是PR源分支; - GitLab:用
CI_MERGE_REQUEST_TARGET_BRANCH_NAME和CI_MERGE_REQUEST_SOURCE_BRANCH_NAME;
- GitHub:
- 命令中的
...是三个点,代表对比两个分支的合并基础到各自最新提交的差异,正好对应PR的所有变更内容。
方案二:通过Jenkins API获取PR的所有提交(适合需要逐提交处理的场景)
如果你需要逐个处理PR里的每一个提交,而不仅仅是文件列表,可以通过Jenkins的SCM API结合Git命令获取PR的所有提交哈希,再逐个拉取每个提交的修改文件。
示例代码
def targetBranch = env.CHANGE_TARGET ?: 'main' def prSourceBranch = env.CHANGE_BRANCH ?: env.BRANCH_NAME sh 'git fetch origin' // 获取PR源分支相对于目标分支的所有提交哈希 def commitHashes = sh( script: "git log --pretty=format:'%H' origin/${targetBranch}..origin/${prSourceBranch}", returnStdout: true ).trim().split('\n') // 遍历每个提交,获取该提交的修改文件 commitHashes.each { commitHash -> println "===== 提交 ${commitHash} 的修改文件 =====" def commitFiles = sh( script: "git show --name-only ${commitHash}", returnStdout: true ).trim().split('\n') commitFiles.each { file -> println file } }
为什么你的原有代码不行?
你用的currentBuild.rawBuild.changeSets是Jenkins构建记录中存储的本次触发构建的变更集。当你第一次提交3个创建PR时,Jenkins会把这3个提交当成一次变更集;但当你推送新的修复提交时,Jenkins只把这个新提交当成本次构建的变更,所以只能拿到这一个提交的文件,不会自动包含之前的PR提交。
内容的提问来源于stack exchange,提问作者extmkv
相关产品推荐
相关产品推荐

