Как динамически ссылаться на предыдущие задания в конвейерах Azure, если они есть на текущем этапе

#azure-devops #azure-pipelines #azure-pipelines-yaml

#azure-devops #azure-конвейеры #azure-pipelines-yaml

Вопрос:

Я пытаюсь настроить конвейер azure yaml, который использует два шаблона развертывания для двух соответствующих заданий (тестирование и развертывание). Задания должны выполняться последовательно для каждого этапа, поскольку тестовое задание создает артефакт, который использует задание развертывания. Это работает хорошо.

Однако для одной среды я разделил развертывание на два этапа: один этап, на котором выполняются только тесты, и один этап, на котором выполняется фактическое развертывание. Проблема, с которой я сталкиваюсь, заключается в том, что мое задание развертывания имеет «dependson», который ссылается на тестовое задание. Из-за этого мой конвейер недействителен, когда я добавляю эти два этапа для своей среды.

Мой вопрос в том, существует ли какая-то динамическая ссылка «dependson» для задания, что-то вроде «зависит от любых предыдущих заданий на этом этапе, если таковые имеются»?

Фрагменты кода из yaml-файлов ниже для справки:

Main.yaml

 #This first stage would work as it uses both templates in succession

stages:
  - stage: BothTemplates
    displayName: 'Run both templates'
    jobs:
    - template: TemplateTest.yml
    - template: TemplateDeploy.yml #depends on the job in TemplateTest.yml

# The pipeline is invalid because of OnlyDeploy, as the TemplateDeploy.yml depends in the job "Test", which does not exist in the OnlyDeploy-context

  - stage: OnlyTest
    dependsOn: BothTemplates
    displayName: 'Run only test template'
    jobs:
    - template: TemplateTest.yml

  - stage: OnlyDeploy
    dependsOn: OnlyTest
    displayName: 'Run only deploy template'
    jobs:
    - template: TemplateDeploy.yml

 

TemplateTest.yaml

 jobs:
- deployment: Test
  dependsOn: 
  displayName: Test
  continueOnError: false
  strategy:
    runOnce:
      deploy:
        steps:
          #Here the steps for the tests are
 

Текущий TemplateDeploy.yaml

 jobs:
- deployment: Deploy
  dependsOn: Test
  displayName: Deploy
  continueOnError: false
  strategy:
    runOnce:
      deploy:
        steps:
          #Here the steps for the deployment are
 

Моя идея состояла бы в том, чтобы изменить TemplateDeploy.yaml к чему-то вроде этого:

 jobs:
- deployment: Deploy
  dependsOn: previousJob() #Wait until previous job in stage has finished, if there are any
  displayName: Deploy
  continueOnError: false
  strategy:
    runOnce:
      deploy:
        steps:
          #Here the steps for the deployment are
 

Ответ №1:

Поскольку у вас уже есть зависимости между этапами

   - stage: OnlyTest
    dependsOn: BothTemplates
    displayName: 'Run only test template'
    jobs:
    - template: TemplateTest.yml

  - stage: OnlyDeploy
    dependsOn: OnlyTest
    displayName: 'Run only deploy template'
    jobs:
    - template: TemplateDeploy.yml
 

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

 
parameters:
- name: makeExplicitDependency
  displayName: 'Make excplicit job dependency'
  type: boolean
  default: true

jobs:
- deployment: Deploy
  ${{ if eq(parameters.makeExplicitDependency, true) }}:
     dependsOn: Test
  displayName: Deploy
  continueOnError: false
  strategy:
    runOnce:
      deploy:
        steps:
          #Here the steps for the deployment are

 

а потом:

 
stages:
  - stage: BothTemplates
    displayName: 'Run both templates'
    jobs:
    - template: TemplateTest.yaml
    - template: TemplateDeploy.yaml #depends on the job in TemplateTest.yml

  - stage: OnlyTest
    dependsOn: BothTemplates
    displayName: 'Run only test template'
    jobs:
    - template: TemplateTest.yaml

  - stage: OnlyDeploy
    dependsOn: OnlyTest
    displayName: 'Run only deploy template'
    jobs:
    - template: TemplateDeploy.yaml
      parameters:
        makeExplicitDependency: false
 

Таким образом, удаление dependsOn работает так, как вы ожидали dependsOn: previousJob() #Wait until previous job in stage has finished, if there are any

Комментарии:

1. Это была отличная идея, я не думал о том, чтобы ставить иждивенца в какие-то условия. Можно ли было бы поместить переменную непосредственно в часть dependsOn? Кроме того, мне нужно, чтобы задания выполнялись последовательно для некоторых частей конвейера и на разных этапах для других частей, таким образом, моя проблема

2. @Bast Да, это возможно. Здесь идея состояла в том, чтобы вообще не устанавливать его, поскольку таким образом мы получаем неявную зависимость от предыдущих заданий. Можете ли вы рассмотреть возможность проголосовать за мой ответ, если он был полезен для вас?

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