从引用的管道资源中获取最新的版本ID

时间:2019-11-07 11:19:13

标签: azure-devops yaml azure-pipelines-release-pipeline

在经典发行管道中,可以将其他管道作为Artifact资源添加-这些可以是触发器,也可以只是引用。然后,您可以参考有关它们的信息,例如使用$(Release.Artifacts.ARTIFACTNAME.BuildId)的构建ID。

您现在可以在多阶段yaml管道中执行something similar

resources:
  pipelines:
  - pipeline: MyBuild
    source: My build pipeline name 
    trigger: 
      branches:
      - master

steps:
- task: PowerShell@2
  inputs:
    targetType: 'inline'
    script: Write-Host Referenced pipeline build id is: ???

但是,按照上面的PowerShell步骤,我找不到一种以这种方式获取相关资源的构建ID的方法,而且在文档中也找不到任何内容。

我进行了一些绝望的尝试:

$(Release.Artifacts.MyBuild.BuildId)
$(resources.MyBuild.BuildId)
$(BuildId@MyBuild)

有人知道该怎么做吗?

4 个答案:

答案 0 :(得分:2)

似乎无法直接获取引用资源的信息。 一种解决方法是使用调用Restful Api的powershell任务来获取这些信息。请参考以下内容:

steps: 
- powershell: |
    $url="https://dev.azure.com/{organization}/{project}/_apis/build/definitions/{definitionId}?includeLatestBuilds=true&api-version=5.1"
    $result = Invoke-RestMethod -Uri $url -Headers @{authorization = "Bearer $(System.AccessToken)"} -Method Get
    $buildId = $result.latestBuild.id
    echo "##vso[task.setvariable variable=buildId;isOutput=true]$buildId" #set a variable to refer to the buildid 
  name: setvarStep

#get the variable set in above task.
- script: |
    echo $(setvarStep.buildId)

上面的示例通过调用Restful api获得lastbuild的ID,并使用脚本##vso[task.setvariable variable=buildId;isOutput=true]$buildId"将其输出到以下任务。

检查here,以获取有关如何在yaml管道中设置变量的更多信息。

但是,如果您对此解决方案不满意,则可以转到here提交针对此情况的功能请求或报告问题。

enter image description here

答案 1 :(得分:1)

最新的发行说明具有一组新的预定义变量。

resources.pipeline.{Alias}.projectName 
resources.pipeline.{Alias}.projectID 
resources.pipeline.{Alias}.pipelineName 
resources.pipeline.{Alias}.pipelineID 
resources.pipeline.{Alias}.runName 
resources.pipeline.{Alias}.runID
resources.pipeline.{Alias}.runURI
resources.pipeline.{Alias}.sourceBranch 
resources.pipeline.{Alias}.sourceCommit
resources.pipeline.{Alias}.sourceProvider 
resources.pipeline.{Alias}.requestedFor
resources.pipeline.{Alias}.requestedForID

在此处查看https://docs.microsoft.com/en-us/azure/devops/release-notes/2019/sprint-160-update#pipeline-resource-meta-data-as-predefined-variables

答案 2 :(得分:0)

编辑:正如JohannesH所指出的那样,一旦Sprint 160击中了您的租户,使用新的预定义变量就可以实现此目的,因此使用REST api是过大的。

如果有人发现有必要对模板中的REST API做类似的事情,我将在此处保留此答案。


根据李维斯(Levi)的接受的答案,我整理出一个可以重复使用的模板:

parameters:
  buildName:
  outputVariable:

steps:
- powershell: |
    $url="$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/definitions?name=${{ parameters.buildName }}&includeLatestBuilds=true&api-version=5.1"
    $result = Invoke-RestMethod -Uri $url -Headers @{authorization = "Bearer $(System.AccessToken)"} -Method Get
    $buildId = $result.value[0].latestBuild.id
    echo "Determined latest build id for ${{ parameters.buildName }} as $buildId"
    echo "##vso[task.setvariable variable=${{ parameters.outputVariable }}]$buildId"
  name: Get${{ parameters.outputVariable }}
  displayName: Get latest build id for ${{ parameters.buildName }}

以及这种重复使用的示例:

variables:
  build1: My Build Name
  build2: Another Build Name

resources:
  pipelines:
  - pipeline: Build1
    source: My Build Name
    trigger: 
      branches:
      - master
  - pipeline: Build2
    source: Another Build Name
    trigger: 
      branches:
      - master

steps:
- template: yaml-templates/get-build-id.yml
  parameters:
    buildName: $(build1)
    outputVariable: build1Id
- template: yaml-templates/get-build-id.yml
  parameters:
    buildName: $(build2)
    outputVariable: build2Id
- powershell: |
    echo "Build 1 id: $(build1Id) Build 2 id: $(build2Id)"
  name: EchoBuildIds

注意:

  1. resources的源名称看起来不可能是变量,因此在构建名称方面存在一些重复。
  2. 我正在模板中设置作业范围的变量,这对我来说不是问题,但可能对您有用-YMMV!

答案 3 :(得分:0)

这是您的操作方式:

echo $(resources.pipeline.MyBuild.runID)