Jenkins:从下游多分支流水线获取GIT_COMMIT值
提问翻译
我有一个Jenkins流水线,会触发若干定义为多分支流水线的下游任务。我希望获取当前运行任务的提交记录(该记录通常存储在env.GIT_COMMIT中)。除了将env.GIT_COMMIT变量写入文件并注册为构建制品外,是否还有其他方法获取构建的提交记录?我查阅了Run类的文档,但未找到明确的获取途径。以下是我的流水线片段,包含触发下游任务和获取制品的部分:
retry(count: 3) { build job: "${jobNameFrontend}", wait: true, parameters: [ [$class: 'BooleanParameterValue', name: 'PACKAGE', value: true], [$class: 'BooleanParameterValue', name: 'SKIP_TESTS', value: params.SKIP_TESTS] ] } copyArtifacts projectName: "${jobNameFrontend}", filter: 'frontend.zip', fingerprintArtifacts: true, target: 'dist' unzip dir: "${SOURCE_DIR}", glob: '', zipFile: './dist/frontend.zip'
可行的替代方法
1. 从build步骤返回的构建对象直接提取
build步骤执行后会返回下游构建的Run实例,通过该实例可直接访问SCM变更集,提取Git提交ID。修改你的流水线代码如下:
retry(count: 3) { def downstreamBuild = build job: "${jobNameFrontend}", wait: true, parameters: [ [$class: 'BooleanParameterValue', name: 'PACKAGE', value: true], [$class: 'BooleanParameterValue', name: 'SKIP_TESTS', value: params.SKIP_TESTS] ] // 筛选Git类型的变更集 def gitChangeSet = downstreamBuild.changeSets.find { it.kind == 'git' } if (gitChangeSet && gitChangeSet.items) { def commitId = gitChangeSet.items[0].commitId echo "下游构建的Git提交记录: ${commitId}" // 可将提交ID存入环境变量供后续步骤使用 env.DOWNSTREAM_COMMIT = commitId } }
如果下游构建存在多个变更记录,可根据实际需求调整逻辑获取对应提交;若使用非Git的SCM,需修改kind的匹配值。
2. 触发下游时约定暴露提交记录
在下游流水线中添加步骤,将自身的env.GIT_COMMIT写入构建描述,上游即可从返回的构建对象中读取:
- 下游流水线添加:
currentBuild.description = "Git Commit: ${env.GIT_COMMIT}"
- 上游流水线修改:
retry(count: 3) { def downstreamBuild = build job: "${jobNameFrontend}", wait: true, parameters: [ [$class: 'BooleanParameterValue', name: 'PACKAGE', value: true], [$class: 'BooleanParameterValue', name: 'SKIP_TESTS', value: params.SKIP_TESTS] ] def commitId = downstreamBuild.description.split(": ")[1] echo "下游构建的Git提交记录: ${commitId}" }
3. 通过Jenkins Groovy API查询构建SCM信息
如果知道下游任务的名称和构建号,可直接通过Jenkins内部API获取提交记录:
retry(count: 3) { def downstreamBuild = build job: "${jobNameFrontend}", wait: true, parameters: [ [$class: 'BooleanParameterValue', name: 'PACKAGE', value: true], [$class: 'BooleanParameterValue', name: 'SKIP_TESTS', value: params.SKIP_TESTS] ] def job = Jenkins.instance.getItemByFullName("${jobNameFrontend}") def targetBuild = job.getBuildByNumber(downstreamBuild.number) def scmRevision = targetBuild.scm.buildChooser.getCandidateRevisions(null, targetBuild)[0] def commitId = scmRevision.getHash() echo "下游构建的Git提交记录: ${commitId}" }
注意:这种方法需要流水线具备访问Jenkins实例的权限,可能需要在全局安全配置中调整脚本权限。
内容的提问来源于stack exchange,提问作者JoSSte
相关产品推荐
相关产品推荐

