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

求助:从触发的Pipeline B获取Pipeline A的Commit ID失败

如何在Pipeline B中获取触发它的Pipeline A的Commit ID

你在Azure DevOps流水线间传递提交ID时遇到了变量解析和变量选择的问题,我来帮你梳理下问题根源和解决办法:

首先,你的命令有两个核心问题:

  1. 单引号导致预定义变量未解析:你把$(build.sourceversion)放在了单引号'$(build.sourceversion)'里,bash会将其视为纯文本字符串,而不会触发Azure DevOps的变量解析逻辑;
  2. 变量选择不准确:当Pipeline B被Pipeline A触发时,$(build.sourceversion)默认指向的是Pipeline B自身的构建源版本,而非触发它的Pipeline A的Commit ID。

下面是具体的修正方案:

1. 使用触发流水线专属的预定义变量

Azure DevOps为流水线间触发场景提供了专门的变量:$(resources.pipeline.<PipelineA的名称>.sourceCommit),它直接对应触发Pipeline B的Pipeline A的源提交ID,完全符合你的需求。

2. 修正bash命令写法

去掉冗余的嵌套引号,直接提取提交ID的前7位并设置流水线变量:

# 提取提交ID前7位
dockertag=$(echo "$(resources.pipeline.PipelineA.sourceCommit)" | cut -c-7)
# 将值设置为流水线变量供后续任务使用
echo "##vso[task.setvariable variable=dockertag]$dockertag"

或者用更高效的bash参数展开(省去echo命令):

dockertag=${resources.pipeline.PipelineA.sourceCommit:0:7}
echo "##vso[task.setvariable variable=dockertag]$dockertag"

3. 必要的配置检查

  • 确保Pipeline B的YAML中已正确配置Pipeline A为资源触发器,且名称匹配:
    resources:
      pipelines:
        - pipeline: PipelineA  # 这个名称要和变量中的<PipelineA的名称>完全一致
          source: PipelineA    # 这里填写Azure DevOps中Pipeline A的实际名称
          trigger:
            branches:
              include:
                - develop
    
  • 如果你确实需要获取Pipeline B自身的源版本(非触发它的A的版本),只需修正原命令的引号问题即可:
    COMMAND=$(echo "$(build.sourceversion)" | cut -c-7)
    echo "##vso[task.setvariable variable=dockertag]$COMMAND"
    
    把单引号替换为双引号,Azure DevOps会先解析$(build.sourceversion)为实际值,再传给bash处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:37:49