Условно зависимая работа в Azure Devops YAML конвейерах - PullRequest
0 голосов
/ 28 мая 2020

Я создаю сложный конвейер в yaml, и я пытаюсь создать зависимость между двумя заданиями, чтобы последнее задание выполнялось после первого, но только если первое настроено для запуска на основе параметра. Я не могу понять, выполнимо ли это или нет. parameters.doJobA истинно, или немедленно, если parameters.doJobA ложно. Простое добавление условия dependsOn приводит к пропуску JobB, если условие JobA не выполняется, что имеет смысл, но я бы хотел, чтобы оно выполнялось независимо.

Можно ли определить условное dependsOn таким образом?

РЕДАКТИРОВАТЬ: Я столкнулся с дополнительной проблемой, которая делает решение ниже непригодным для использования. Мне нужно, чтобы условие зависело от переменной, установленной ранее запущенным скриптом PowerShell, а не на основе параметров.

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Вот пример кода, который я придумал (вы можете увидеть пример ). Задание 2 запускается всегда, и запускается после задания 1, если выполняется задание 1.

обновленный YAML

- job: One
  condition: eq('${{ parameters.DoJobOne }}', true)
  pool:
    vmImage: 'windows-2019'
  steps:
  - powershell: |
      throw "simulate Job One failing"
      echo "##vso[task.setvariable variable=JobOneRan;isOutput=true]true"
    name: setvarStep
  - script: |
      echo $(setvarStep.JobOneRan)          
    name: echovariable


- job: Two
  condition: and(always(), eq('${{ parameters.DoJobOne }}', eq(dependencies.One.outputs['setvarStep.JobOneRan'], true)))
  dependsOn: One
  pool:
    vmImage: 'windows-2019'
  variables:
    myVariableFromJobOne: $[ dependencies.One.outputs['setvarStep.JobOneRan'] ]
  steps:
  - script: echo $(myVariableFromJobOne)
    name: echovariable

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

Wes

1 голос
/ 28 мая 2020

Я нашел несколько неэлегантное решение. Комбинируя выражения с логическими параметрами, я могу делать то, что мне нужно, но это немного сложно:

parameters:
- name: doJobA
  type: boolean

stages:
  jobs:
  - job: JobA
    condition: eq('${{ parameters.doJobA }}', true)
    # ... details removed for brevity

  - job: JobB
    ${{ if eq(parameters.doJobA, true) }}:
      dependsOn: JobA
      condition: succeeded()
    # ... details removed for brevity

Здесь я вставляю зависимое предложение, только если параметр doJobA истинен. В противном случае его нет. Чтобы гарантировать, что JobB выполняется только в случае успеха JobA, я должен также добавить условие, но только если присутствует supportsOn.

В результате задание запускается немедленно, если doJobA ложно, потому что итоговый yaml не будет содержать никаких записей dependsOn или condition, но в другом случае это будет зависеть от успешного выполнения JobA.

Я все еще надеюсь, что есть лучший способ достичь этого, хотя, поскольку это кажется немного сложным (imo).

Edit: это решение работает только для свойств stati c, а не для динамических c переменных.

...