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

如何获取Jenkins流水线中所有Git仓库的历史提交ID?

获取Jenkins流水线多仓库上一次成功构建的提交ID

要拿到上一次成功构建中所有仓库的提交ID,核心思路是在每次构建时保存当前拉取的各仓库提交ID,后续构建读取上一次成功构建的保存记录,具体实现分两步:

一、当前构建保存各仓库提交ID

在每个仓库checkout完成后,执行git rev-parse HEAD获取当前提交ID,把所有仓库的ID写入一个文件并归档为构建artifact,确保Jenkins保留该文件。

修改你的流水线代码如下:

stages {
    stage('Checkout RepoA') {
        steps {
            dir("${runDir}/${JOB_NAME}/${BUILD_NUMBER}/checkout/RepoA") {
                checkout(
                    [
                        $class: 'GitSCM',
                        branches: [[name: 'refs/heads/main']],
                        extensions: [
                            [$class: 'RelativeTargetDirectory', relativeTargetDir: 'RepoA'],
                            [$class: 'LocalBranch', localBranch: 'main']
                        ],
                        userRemoteConfigs: [[credentialsId: 'credentials', url: 'url to repo']]
                    ]
                )
                // 获取RepoA提交ID并写入记录文件
                script {
                    def repoACommit = sh(script: 'git rev-parse HEAD', returnStdout: true).trim()
                    writeFile file: "${runDir}/${JOB_NAME}/${BUILD_NUMBER}/repo_commits.txt", text: "RepoA: ${repoACommit}\n", append: true
                }
            }
        }
    }
    // 其他仓库的checkout阶段同理,比如RepoB
    stage('Checkout RepoB') {
        steps {
            dir("${runDir}/${JOB_NAME}/${BUILD_NUMBER}/checkout/RepoB") {
                checkout(/* RepoB的Git配置 */)
                script {
                    def repoBCommit = sh(script: 'git rev-parse HEAD', returnStdout: true).trim()
                    writeFile file: "${runDir}/${JOB_NAME}/${BUILD_NUMBER}/repo_commits.txt", text: "RepoB: ${repoBCommit}\n", append: true
                }
            }
        }
    }
}
post {
    always {
        // 将提交ID文件归档为artifact,确保Jenkins持久化保存
        archiveArtifacts artifacts: "${runDir}/${JOB_NAME}/${BUILD_NUMBER}/repo_commits.txt", fingerprint: true
    }
}

二、读取上一次成功构建的提交ID

在流水线启动阶段,添加步骤获取上一次成功构建的归档文件,读取其中的提交ID记录:

pipeline {
    agent any
    stages {
        stage('获取上一次成功构建提交ID') {
            steps {
                script {
                    def previousBuild = currentBuild.previousSuccessfulBuild
                    if (previousBuild) {
                        // 下载上一次构建的提交ID记录文件
                        copyArtifacts(
                            projectName: env.JOB_NAME,
                            selector: specific(previousBuild.number.toString()),
                            filter: '**/repo_commits.txt',
                            target: 'previous_commits/'
                        )
                        // 读取并输出记录内容
                        def previousCommits = readFile file: 'previous_commits/repo_commits.txt'
                        echo "上一次成功构建的仓库提交ID:\n${previousCommits}"
                        // 可选:解析为键值对方便后续使用
                        def commitMap = [:]
                        previousCommits.eachLine { line ->
                            def parts = line.split(': ')
                            if (parts.size() == 2) {
                                commitMap[parts[0]] = parts[1]
                            }
                        }
                        echo "RepoA上一次提交ID: ${commitMap.RepoA}"
                    } else {
                        echo "未找到上一次成功构建记录"
                    }
                }
            }
        }
        // 后续的checkout等阶段...
    }
}

注意事项

  • 确保Jenkins已安装Copy Artifacts Plugin,否则copyArtifacts步骤无法使用。
  • 路径需和你的流水线工作目录结构匹配,避免文件读写或归档失败。
  • 若不想用文件存储,也可将提交ID保存为构建自定义参数,但归档文件是最直接的持久化方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:25:26