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

如何获取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;
  • 命令中的...是三个点,代表对比两个分支的合并基础到各自最新提交的差异,正好对应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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:54:47