从引用的管道资源中获取最新的构建 ID

Posted

技术标签:

【中文标题】从引用的管道资源中获取最新的构建 ID【英文标题】:Getting the latest build id from a referenced pipeline resource 【发布时间】:2020-03-03 23:18:40 【问题描述】:

在经典发布管道中,可以添加其他管道作为工件资源 - 这些可能是触发器,也可能只是引用。然后,您可以参考有关它们的信息,例如使用$(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)

有谁知道如何做到这一点?

【问题讨论】:

只是一个疯狂的猜测,会不会是Release.TriggeringArtifact.Alias? docs.microsoft.com/en-us/azure/devops/pipelines/release/… 感谢@YanSklyarenko - 猜得不错,但我无法让任何 Release.* 参数在 yaml 管道中工作。另一个限制是您可以配置多个资源,其中任何一个都可以是触发器,或者如果它是手动触发的,则没有。 【参考方案1】:

似乎无法直接获取引用资源的信息。 一种解决方法是使用调用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 提交针对此案例的功能请求,或报告问题。

【讨论】:

很好 - 看起来我可以做到这一点。我没有想过使用 REST API 来解决它 - 这很聪明。 我对脚本所做的唯一修改是使其更加通用,以便我可以将其模板化并在定义中重复使用:$url="$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/definitions?name=$(buildname)&includeLatestBuilds=true&api-version=5.1"$buildId = $result.value[0].latestBuild.id【参考方案2】:

编辑:正如 JohannesH 所指出的,一旦 Sprint 160 到达您的租户,这将可以通过新的预定义变量实现,因此使用 REST api 是多余的。

我将把这个答案留在这里,以防有人发现有必要在模板中使用 REST API 做类似的事情。


根据 Levi 的 accepted 回答,我整理了一个可以重复使用的模板:

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

注意事项:

    看起来resources 的源名称不能是变量,因此就构建名称而言,存在一些重复。 我正在模板中设置作业范围的变量,这对我来说不是问题,但可能适合你 - YMMV!

【讨论】:

【参考方案3】:

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

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

【讨论】:

这看起来很到位。当我回到工作岗位时,我会玩一个游戏并将其更新为接受的答案以确认 另外,我的一个疯狂猜测令人沮丧地接近了! 好的,我们的租户仍在 sprint 159 部署中,所以我相信它会在文档中显示它会起作用! @MikeGoatly 是的,你真的很亲密。在我阅读您的问题之前,我偶然发现了试图为我们的项目实施构建/部署管道的文档。 :) 160 最终被推出到我们的实例中,但是......它没有工作。但是,鉴于我之前的随机猜测非常接近,我猜测了更多,结果发现这些变量区分大小写并且在发行说明中不正确。而不是resources.pipeline.Alias.runID 使用Resources.Pipeline.Alias.RunID 它将起作用。【参考方案4】:

这就是你的做法:

echo $(resources.pipeline.MyBuild.runID)

【讨论】:

【参考方案5】:

您可以使用 PowerShell 任务从触发工件中获取构建 ID。

$alias = "$(Release.TriggeringArtifact.Alias)"
$buildIdKey = "RELEASE_ARTIFACTS_" + $alias + "_BUILDID"
$buildId = (Get-item env:$buildIdKey).Value

【讨论】:

以上是关于从引用的管道资源中获取最新的构建 ID的主要内容,如果未能解决你的问题,请参考以下文章

Android 安装包优化移除无用资源 ( 自动移除无用资源 | 直接引用资源 | 动态获取资源 id | Lint 检查资源 )

如何通过其他资源获取引用资源的ID?

获取 styled 属性中使用的可绘制引用的资源 id

如何使用构建管道部署 Azure 数据工厂资源?

在 TC 管道中(在构建配置之间)保留对共享资源的锁定

CloudFormation 能否在构建堆栈后填充资源或依赖项?