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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:01:05