#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. Хорошо, спасибо вам. Я поддержал ваш ответ, однако, поскольку я новый пользователь на этом сайте, похоже, что мои голоса не учитываются при подсчете отображаемых итогов.