Загрузите один и тот же артефакт конвейера latestFromBranch для нескольких заданий - PullRequest
1 голос
/ 08 октября 2019

В настоящее время я пишу YAML конвейера Azure, который загружает последние артефакты разработки и выполняет различные тесты в разных средах.

Поскольку каждый вид теста моделируется как его собственное задание, первым шагом задания является загрузка. артефакт ( документация ).

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

Как я могу добиться, чтобы у каждого задания был один и тот же артефакт, даже если во время выполнения конвейера создается более новый файл?


Моим первым подходом была загрузка последнего артефакта и извлечение конкретной версии. Но я не смог получить идентификатор сборки, который необходим как pipelineId для загрузки определенной версии.

Ответы [ 2 ]

2 голосов
/ 09 октября 2019

Но мне не удалось получить идентификатор сборки, который требуется в качестве pipeId для загрузки конкретной версии.

Мы могли бы использовать REST API дляполучить идентификатор сборки конвейера, прежде чем мы используем задачу DownloadPipelineArtifact. Добавьте параметр definitions, чтобы получить идентификатор сборки для указанных определений:

https://dev.azure.com/{organization}/{project}/_apis/build/builds?definitions={definitions}&api-version=5.1

Затем я получил все идентификаторы сборки, используйте Select-Object -first 1, чтобы получить последний идентификатор сборки и установить его в качестве переменной среды, поэтому мойЗадача 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"

Далее мы устанавливаем переменную $ (LatestBuildID) в параметре сборки:

enter image description here

Теперь мы можем получить последний идентификатор сборки, который требуется как pipeId для загрузки определенной версии.

Как мне добиться, чтобы у каждой работы был один и тот же артефакт, даже если во времязапуск конвейера?

Для этой проблемы нам нужно установить Build completion для сборки или триггер непрерывного развертывания для выпуска, чтобы был создан новый артефакт, должен выполняться конвейер DownloadPipelineArtifact.

Надеюсь, это поможет.

1 голос
/ 16 октября 2019

Я реализовал решение в соответствии с предложением @ 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)
...