Azure YAML Получить переменную из задания, выполненного на предыдущем этапе - PullRequest
1 голос
/ 30 октября 2019

Я создаю конвейер YAML в DevOps Azure, который состоит из двух этапов.

Первый этап (Prerequisites) отвечает за чтение коммита git и создает переменную через запятую, содержащую список сервисов, на которые повлиял коммит.

Второй этап (сборка)отвечает за сборку и модульное тестирование проекта. Эта стадия состоит из множества templates, по одному на каждую услугу. В шаблонном сценарии задание будет проверять, включена ли соответствующая служба в переменную, созданную на предыдущем этапе. Если задание обнаружит Службу, оно продолжит сборку и проверку службы. Однако, если он не может найти службу, он пропустит эту работу.

Run.yml:

stages:
- stage: Prerequisites
  jobs:
  - job: SetBuildQueue
    steps:
    - task: powershell@2
      name: SetBuildQueue
      displayName: 'Set.Build.Queue'
      inputs:
        targetType: inline
        script: |
            ## ... PowerShell script to get changes - working as expected
            Write-Host "Build Queue Auto: $global:buildQueueVariable"
            Write-Host "##vso[task.setvariable variable=buildQueue;isOutput=true]$global:buildQueueVariable"

- stage: Build
  jobs:
  - job: StageInitialization

  - template: Build.yml
    parameters:
      projectName: Service001
      projectLocation: src/Service001

  - template: Build.yml
    parameters:
      projectName: Service002
      projectLocation: src/Service002

Build.yml:

parameters:
  projectName: ''
  projectLocation: ''

jobs:
- job:
  displayName: '${{ parameters.projectName }} - Build'
  dependsOn: SetBuildQueue
  continueOnError: true
  condition: and(succeeded(), contains(dependencies.SetBuildQueue.outputs['SetBuildQueue.buildQueue'], '${{ parameters.projectName }}'))
  steps:
  - task: NuGetToolInstaller@1
    displayName: 'Install Nuget'

Проблема:

При запуске первых этапов создается переменная с именем buildQueue, которая заполняется, как видно из вывода консоли сценария PowerShell:

Service001 Changed
Build Queue Auto: Service001;

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

Started: Today at 12:05 PM
Duration: 16m 7s
Evaluating: and(succeeded(), contains(dependencies['SetBuildQueue']['outputs']['SetBuildQueue.buildQueue'], 'STARS.API.Customer.Assessment'))
Expanded: and(True, contains(Null, 'service001'))
Result: False

Итак, мой вопрос, как мне установить dependsOn и condition, чтобы получитьинформация с предыдущего этапа?

1 Ответ

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

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

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

Чтобы передать переменную FOO из задания другому на другом этапе:

  1. Создать папку, которая будет содержать все переменныеты хочешь пройти;любая папка может работать, но что-то вроде mkdir -p $(Pipeline.Workspace)/variable s может быть хорошей идеей.
  2. Записать содержимое переменной в файл, например echo "$FOO" > $(Pipeline.Workspace)/variables/FOO. Несмотря на то, что имя может быть любым, вы можете присвоить файлу то же имя, что и переменная.
  3. Опубликовать папку $(Pipeline.Workspace)/variables как артефакт конвейера с именем variables
  4. На втором этапе загрузите артефакт конвейера переменных
  5. Считайте каждый файл в переменную, например, FOO=$(cat $(Pipeline.Workspace)/variables/FOO)
  6. Представьте переменную в текущем задании, как мы это делали впервый пример: echo "##vso[task.setvariable variable=FOO]$FOO"
  7. Затем можно получить доступ к переменной, развернув ее в пределах конвейеров Azure ($(FOO)) или использовать ее в качестве переменной среды внутри сценария bash ($FOO).
...