求助:从触发的Pipeline B获取Pipeline A的Commit ID失败
如何在Pipeline B中获取触发它的Pipeline A的Commit ID
你在Azure DevOps流水线间传递提交ID时遇到了变量解析和变量选择的问题,我来帮你梳理下问题根源和解决办法:
首先,你的命令有两个核心问题:
- 单引号导致预定义变量未解析:你把
$(build.sourceversion)放在了单引号'$(build.sourceversion)'里,bash会将其视为纯文本字符串,而不会触发Azure DevOps的变量解析逻辑; - 变量选择不准确:当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的版本),只需修正原命令的引号问题即可:
把单引号替换为双引号,Azure DevOps会先解析COMMAND=$(echo "$(build.sourceversion)" | cut -c-7) echo "##vso[task.setvariable variable=dockertag]$COMMAND"$(build.sourceversion)为实际值,再传给bash处理。
内容的提问来源于stack exchange,提问作者ramesh reddy
相关产品推荐
相关产品推荐

