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

