如何在YAML部署流水线名称中引用关联构建的Build ID?
问题解答
你的需求可行,但直接在name字段使用$(resources.pipeline.myproject-build.runID)变量无法生效——因为name属于流水线初始化阶段就会计算的属性,而资源流水线的变量是在流水线启动后、初始化完成才加载的,所以初始化阶段无法读取到这些变量。
下面提供两种可行的解决方案:
方案1:运行时通过API修改流水线名称
先给流水线设置一个初始名称,再在步骤中调用Azure DevOps REST API更新名称,替换为包含build runID的格式:
trigger: - none resources: pipelines: - pipeline: myproject-build source: myproject-build trigger: branches: - '*' # 初始名称,后续会替换 name: $(BuildDefinitionName)_Pending_$(Date:yyyyMMdd) steps: - script: | # 获取目标build runID TARGET_BUILD_ID=$(resources.pipeline.myproject-build.runID) # 构造新名称 NEW_NAME="$(BuildDefinitionName)_${TARGET_BUILD_ID}_$(Date:yyyyMMdd)" # 调用API更新当前流水线运行的名称 az pipelines run update --id $(Build.BuildId) --name "$NEW_NAME" --org $(System.TeamFoundationCollectionUri) --project $(System.TeamProject) env: # 使用系统内置令牌进行认证 AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)
注意:需要确保流水线的服务账户拥有编辑流水线运行的权限。
方案2:触发时传递参数填充名称
在build流水线中触发deploy流水线时,直接将BuildId作为参数传递,deploy流水线通过参数来设置name字段:
步骤1:修改build流水线,添加触发deploy的步骤
# azurepipelines_build.yml 新增步骤 steps: # 原有发布工件等步骤... - task: AzureCLI@2 inputs: azureSubscription: '你的Azure订阅' scriptType: bash inlineScript: | # 触发deploy流水线并传递BuildId参数 az pipelines run --name myproject-deploy --org $(System.TeamFoundationCollectionUri) --project $(System.TeamProject) --variables BuildId=$(Build.BuildId)
步骤2:修改deploy流水线,通过参数定义名称
# azurepipelines_deploy.yml parameters: - name: BuildId type: string default: '0' # 手动触发时可手动输入 trigger: - none resources: pipelines: - pipeline: myproject-build source: myproject-build trigger: branches: - '*' # 使用参数填充name字段 name: $(BuildDefinitionName)_${{ parameters.BuildId }}_$(Date:yyyyMMdd) steps: - script: | echo "Checking build id ${{ parameters.BuildId }}"
这种方式下,无论是build自动触发还是手动触发deploy,都能保证name字段正确显示对应的build runID。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

