通过多个作业下载相同的管道工件LatestFromBranch

时间:2019-10-08 11:06:46

标签: azure-devops yaml azure-pipelines

我目前正在编写一个Azure管道YAML,该YAML下载最新的开发工件并在不同的环境中执行不同的测试。

由于每种测试都被建模为自己的作业,因此作业的第一步是下载工件(documentation)。

- task: DownloadPipelineArtifact@2
  inputs:
    buildType: 'specific'
    project: '[hidden]'
    definition: '[hidden]'
    buildVersionToDownload: 'latestFromBranch'
    branchName: 'refs/heads/development'

如果在管道运行期间创建了新的产品,我如何实现每个作业都具有相同的工件?


我的第一种方法是下载最新的工件并提取具体版本。但是我无法获得pipelineId下载特定版本所需的版本ID。

2 个答案:

答案 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):

enter image description here

现在,我们可以获得最新的内部版本ID,该ID是下载特定版本所需的pipelineId。

  

如何实现每个工作都具有相同的工件,即使   在管道运行期间创建的新版本?

对于此问题,我们需要将Build completion用于构建或将持续部署触发器进行释放,以便创建新的工件,应执行DownloadPipelineArtifact的管道。

希望这会有所帮助。

答案 1 :(得分:1)

我实现了@ LeoLiu-MSFT建议的解决方案。

  1. 找到最后一个成功的主版本并存储buildId
  2. buildId作为参数提供下载任务
  3. 在所有测试作业中使用下载任务

以下摘录显示了一个具体示例。

# 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)