从引用的管道资源中获取最新的构建 ID
Getting the latest build id from a referenced pipeline resource
在经典发布管道中,可以添加其他管道作为工件资源 - 这些可以是触发器,也可以只是引用。然后您可以参考有关它们的信息,例如使用 $(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)
有谁知道如何做到这一点?
似乎无法直接获取引用资源的信息。
解决方法是使用 powershell 任务调用 Restful Api 来获取这些信息。请参考以下:
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)
上面的例子通过调用restfulapi得到lastbuild的id,然后使用脚本##vso[task.setvariable variable=buildId;isOutput=true]$buildId"
输出到下面的任务
查看 here 了解有关如何在 yaml 管道中设置变量的更多信息。
但是,如果您对此解决方法不满意,可以去 here 提交针对此案例的功能请求,或报告问题。
编辑:正如 JohannesH 所指出的,一旦 Sprint 160 影响了您的租户,这将有可能使用新的预定义变量,因此使用 REST api 是多余的.
我把这个答案留在这里,以防有人发现有必要对模板中的 REST API 做一些类似的事情。
根据 Levi's 已接受 的回答,我整理了一个可以重复使用的模板:
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!
最新的发行说明有一组新的预定义变量。
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
你是这样做的:
echo $(resources.pipeline.MyBuild.runID)
您可以使用 PowerShell 任务从触发工件中获取构建 ID。
$alias = "$(Release.TriggeringArtifact.Alias)"
$buildIdKey = "RELEASE_ARTIFACTS_" + $alias + "_BUILDID"
$buildId = (Get-item env:$buildIdKey).Value
在经典发布管道中,可以添加其他管道作为工件资源 - 这些可以是触发器,也可以只是引用。然后您可以参考有关它们的信息,例如使用 $(Release.Artifacts.ARTIFACTNAME.BuildId)
.
您现在可以在多阶段 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)
有谁知道如何做到这一点?
似乎无法直接获取引用资源的信息。 解决方法是使用 powershell 任务调用 Restful Api 来获取这些信息。请参考以下:
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)
上面的例子通过调用restfulapi得到lastbuild的id,然后使用脚本##vso[task.setvariable variable=buildId;isOutput=true]$buildId"
输出到下面的任务
查看 here 了解有关如何在 yaml 管道中设置变量的更多信息。
但是,如果您对此解决方法不满意,可以去 here 提交针对此案例的功能请求,或报告问题。
编辑:正如 JohannesH 所指出的,一旦 Sprint 160 影响了您的租户,这将有可能使用新的预定义变量,因此使用 REST api 是多余的.
我把这个答案留在这里,以防有人发现有必要对模板中的 REST API 做一些类似的事情。
根据 Levi's 已接受 的回答,我整理了一个可以重复使用的模板:
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!
最新的发行说明有一组新的预定义变量。
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
你是这样做的:
echo $(resources.pipeline.MyBuild.runID)
您可以使用 PowerShell 任务从触发工件中获取构建 ID。
$alias = "$(Release.TriggeringArtifact.Alias)"
$buildIdKey = "RELEASE_ARTIFACTS_" + $alias + "_BUILDID"
$buildId = (Get-item env:$buildIdKey).Value