多仓库场景下如何获取Jenkins多分支流水线的上一次构建revision?
多仓库克隆场景下Jenkins获取上一次构建revision的解决方法
currentBuild.changeSets默认仅记录流水线主仓库的提交变更,多仓库同时克隆的场景下,额外仓库的变更不会同步到该集合中,因此无法直接通过该方法拿到所有仓库的历史revision,可按以下方案实现:
构建阶段持久化存储所有仓库的revision
每次执行checkout操作时捕获返回值,其中自带对应仓库的commit信息,将所有仓库的标识和revision整理为映射关系后归档为构建产物,示例代码如下:// 定义存储所有仓库revision的映射 def repoRevisions = [:] // 克隆第一个仓库 def checkoutRepo1 = checkout scm: [ $class: 'GitSCM', branches: [[name: '*/${BRANCH_NAME}']], userRemoteConfigs: [[url: 'https://xxx/repo1.git']] ] repoRevisions['repo1'] = checkoutRepo1.GIT_COMMIT // 克隆其余仓库,重复上述逻辑填充repoRevisions def checkoutRepo2 = checkout scm: [ $class: 'GitSCM', branches: [[name: '*/${BRANCH_NAME}']], userRemoteConfigs: [[url: 'https://xxx/repo2.git']] ] repoRevisions['repo2'] = checkoutRepo2.GIT_COMMIT // 写入文件后归档,避免构建重启后数据丢失 writeFile file: 'build-revisions.json', text: new groovy.json.JsonBuilder(repoRevisions).toPrettyString() archiveArtifacts artifacts: 'build-revisions.json', fingerprint: true, allowEmptyArchive: false新构建启动时读取上一次成功构建的归档数据
直接从对应任务的历史成功构建中拉取归档的revision文件,解析后即可拿到所有仓库的上一次构建版本,示例代码如下:def lastRevisions = [:] def lastSuccessBuild = Jenkins.instance.getItemByFullName(env.JOB_NAME).getLastSuccessfulBuild() if (lastSuccessBuild) { def revisionFile = lastSuccessBuild.artifactManager.root().child('build-revisions.json') if (revisionFile.exists()) { lastRevisions = new groovy.json.JsonSlurper().parseText(revisionFile.open().text) } } // lastRevisions中存储的就是上一次构建所有仓库的revision信息补充方案:直接遍历构建的GitSCM动作记录
如果不想额外归档文件,也可以直接从构建的内置动作中遍历所有Git仓库的提交记录,适配Bitbucket多分支插件的自动 checkout 场景:def allRepoCommits = currentBuild.rawBuild.getActions(hudson.plugins.git.GitSCMAction.class).collectEntries { action -> [(action.remoteUrl): action.commitId] }注意该方法需要在脚本安全配置中放开对应类的访问权限,推荐封装到受信任的Jenkins共享库中使用。
内容的提问来源于stack exchange,提问作者jayveersolanki
相关产品推荐
相关产品推荐

