从引用的管道资源中获取最新的构建 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 检查资源 )