我目前正在编写一个Azure管道YAML,该YAML下载最新的开发工件并在不同的环境中执行不同的测试。
由于每种测试都被建模为自己的作业,因此作业的第一步是下载工件(documentation)。
- task: DownloadPipelineArtifact@2
inputs:
buildType: 'specific'
project: '[hidden]'
definition: '[hidden]'
buildVersionToDownload: 'latestFromBranch'
branchName: 'refs/heads/development'
如果在管道运行期间创建了新的产品,我如何实现每个作业都具有相同的工件?
我的第一种方法是下载最新的工件并提取具体版本。但是我无法获得pipelineId
下载特定版本所需的版本ID。
答案 0 :(得分:2)
但是我无法获得作为下载特定版本的pipelineId所需的内部版本ID。
在使用任务DownloadPipelineArtifact
之前,我们可以使用REST API获取管道构建ID。添加参数definitions
以获取用于指定定义的构建ID:
https://dev.azure.com/{organization}/{project}/_apis/build/builds?definitions={definitions}&api-version=5.1
然后我获得了所有的构建ID,使用Select-Object -first 1
获取最新的构建ID并将其设置为环境变量,因此我的powershell任务应类似于:
$url = "https://dev.azure.com/{organization}/{project}/_apis/build/builds?definitions={definitions}&api-version=5.1"
$buildPipeline= Invoke-RestMethod -Uri $url -Headers @{
Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
} -Method Get
$LatestBuildID= $buildPipeline.value.id | Select-Object -first 1
Write-Host This is Latest Build ID: $LatestBuildID
Write-Host "##vso[task.setvariable variable=LatestBuildID;]$LatestBuildID"
接下来,我们在Build选项中设置变量$(LatestBuildID):
现在,我们可以获得最新的内部版本ID,该ID是下载特定版本所需的pipelineId。
如何实现每个工作都具有相同的工件,即使 在管道运行期间创建的新版本?
对于此问题,我们需要将Build completion
用于构建或将持续部署触发器进行释放,以便创建新的工件,应执行DownloadPipelineArtifact
的管道。
希望这会有所帮助。
答案 1 :(得分:1)
我实现了@ LeoLiu-MSFT建议的解决方案。
buildId
buildId
作为参数提供下载任务以下摘录显示了一个具体示例。
# 1. steps/find-latest-build.yml
steps:
- task: Bash@3
name: LatestArtifactsBuild
displayName: 'Find latest successful master build'
env:
system_accesstoken: $(System.AccessToken)
inputs:
targetType: 'inline'
script: |
definitionId=<pipeline>
url="https://dev.azure.com/<organization>/<project>/_apis/build/builds?api-version=5.1"
url+="&definitions=$definitionId"
url+="&resultFilter=succeeded"
url+="&branchName=refs/heads/master"
url+="&\$top=1"
json=$(curl -sL -H "Authorization: Bearer $system_accesstoken" -H 'Content-Type: application/json' $url)
buildId="$(echo $json | jq '.value[0].id' )"
echo "##vso[task.setvariable variable=id;isOutput=true]$buildId"
# 2. steps/download-artifacts-from-pipeline-build.yml
parameters:
definitionId: <pipeline>
buildId: $(Build.BuildId)
artifactName: ''
steps:
- task: DownloadPipelineArtifact@2
displayName: 'Download build artifact archives'
inputs:
buildType: 'specific'
project: $(System.TeamProjectId)
definition: ${{ parameters.definitionId }}
buildVersionToDownload: 'specific'
pipelineId: ${{ parameters.buildId }}
artifactName: ${{ parameters.artifactName }}
# 3. examples/reuse-build-artifacts.yml
trigger: none
jobs:
- job: PrepareBuild
displayName: 'Provide build information'
steps:
- checkout: none
- template: ../steps/find-latest-build.yml
- job: DownloadAllArchivesOfSpecificBuild
dependsOn: PrepareBuild
variables:
download_build_id: $[ dependencies.PrepareBuild.outputs['LatestArtifactsBuild.id'] ]
steps:
- checkout: none
- template: ../steps/download-artifacts-from-pipeline-build.yml
parameters:
buildId: $(download_build_id)