Получение последнего идентификатора сборки из указанного ресурса конвейера - PullRequest
2 голосов
/ 07 ноября 2019

В классическом конвейере выпуска можно было добавлять другие конвейеры в качестве ресурсов артефакта - это могут быть триггеры или просто ссылки. Затем вы можете ссылаться на информацию о них, например, идентификатор сборки, используя $(Release.Artifacts.ARTIFACTNAME.BuildId).

Теперь вы можете сделать нечто подобное в многоступенчатом конвейере yaml:

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, описанному выше, я не могу найти способ получить идентификатор сборки ресурса, связанного таким образом, и пока не могу ничего найти в документации.

Некоторые отчаянныепопытки, которые я сделал:

$(Release.Artifacts.MyBuild.BuildId)
$(resources.MyBuild.BuildId)
$(BuildId@MyBuild)

Кто-нибудь знает, как это можно сделать?

Ответы [ 3 ]

2 голосов
/ 08 ноября 2019

Кажется, что информация о ссылочных ресурсах не может быть получена напрямую. Обходной путь - использовать задачу 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)

В приведенном выше примере получите id lastbuild, вызвав restful api, и используйте скрипт ##vso[task.setvariable variable=buildId;isOutput=true]$buildId" для вывода его в следующую задачу.

Проверка здесь для получения дополнительной информации о том, как установить переменные в конвейере yaml.

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

enter image description here

1 голос
/ 09 ноября 2019

В новейших заметках о выпуске есть новый набор предопределенных переменных.

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

0 голосов
/ 08 ноября 2019

Редактировать : Как указал JohannesH, как только Sprint 160 попадет в вашего арендатора, это станет возможным с новыми предопределенными переменными, поэтому использование API REST является излишним.

I'mоставив здесь этот ответ, если кто-то сочтет необходимым сделать что-то похожее с REST API в шаблоне.


На основе ответа принятого Леви Я собрал шаблон, который может бытьповторно использованный:

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

Примечания:

  1. Это не похоже на имена источниковиз resources могут быть переменными, поэтому в отношении имен сборок есть некоторое дублирование.
  2. Я устанавливаю переменные в задании в шаблоне, для меня это не проблема, но может бытьдля вас - YMMV!
...