Вопрос или проблема
Как некоторые из вас знают, в Azure Pipelines мы можем включать условие ‘dependsOn‘ для заданий и этапов вместе с ‘condition‘, чтобы динамически выполнять этапы и задания в зависимости от некоторых значений или переменных из текущего пайплайна.
Но мы также можем устанавливать выражения шаблонов, чтобы делать почти то же самое.
Вот пример с этапом, настроенным с использованием выражения шаблона.
stages:
- ${{ if eq(variables['Build.SourceBranchName'], 'development') }}:
- stage: Deploy
dependsOn: Build
displayName: "Развертывание в среде разработки."
jobs:
- deployment:
environment: MyEnvironment
strategy:
runOnce:
deploy:
steps:
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: "AzureRM"
azureSubscription: "MySubscription"
appType: webAppContainer
WebAppName: $(environmentName)
DockerNamespace: $(ContainerRegistry)
DockerRepository: appRepo
DockerImageTag: development-$(Build.BuildId)
А вот пример этапа, который выполняется при выполнении условия:
- stage: DeployHomolog
dependsOn: Build
condition: and(succeeded(), eq(variables['Build.SourceBranchName'], 'dev'))
displayName: "Развертывание в среде Homolog"
jobs:
- deployment:
environment: MyEnvironment
strategy:
runOnce:
deploy:
steps:
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: "AzureRM"
azureSubscription: "MySubscription"
appType: webAppContainer
WebAppName: WebApp
DockerNamespace: $(acr)
DockerRepository: appRepo
DockerImageTag: dev-$(Build.BuildId)
И вопрос:
Каковы плюсы и минусы каждого из них? Какой из них вы предпочитаете использовать в пайплайнах?
Ответ или решение
В Azure Pipelines есть возможность управления порядком выполнения этапов и заданий с помощью таких механизмов, как dependsOn
и condition
. При этом также можно использовать шаблонные выражения для динамической конфигурации этих элементов. Рассмотрим плюсы и минусы каждого подхода, а также предпочтения в их использовании.
1. Использование dependsOn
Плюсы:
- Простота понимания:
dependsOn
четко указывает на зависимости между этапами и заданиями, что делает код более читаемым и интуитивно понятным. - Гарантия порядка выполнения: этапы и задания выполняются последовательно в соответствии с определенными зависимостями, что предотвращает конфликты и обеспечивает закономерности в CI/CD процессе.
Минусы:
- Ограниченная гибкость: необходимо явно указывать зависимость, что может привести к сложностям в масштабируемых сценариях, когда потенциальные зависимости могут изменяться.
- Более сложное управление: при наличии большого количества взаимозависимых этапов может возникнуть путаница в порядке их выполнения.
2. Использование condition
Плюсы:
- Гибкость: с помощью условий можно динамически контролировать выполнение этапов в зависимости от переменных среды и других факторов. Это позволяет более эффективно управлять CI/CD процессами в зависимости от контекста.
- Позволяет избегать ненужных запусков: при использовании условий возможен запуск только тех этапов, которые действительно нужны, что экономит ресурсы.
Минусы:
- Сложность чтения: из-за использования сложных условий код может быть менее читаемым и понятным. Потребуется больше времени на его анализ.
- Возможность логических ошибок: условия, особенно сложные, могут привести к непредсказуемым результатам и логическим ошибкам, если они не протестированы должным образом.
3. Использование шаблонных выражений
Шаблонные выражения, как показано в первом примере, также добавляют уровень интерактивности и гибкости, позволяя выполнять стадии на основе переменных без явных условий выполнения.
Плюсы:
- Более детализированное управление: позволяют инкапсулировать логику в шаблоны и переиспользовать их в разных частях пайплайна.
- Упрощение кода: возможность свести к минимуму повторяемость кода, используя параметры и переменные.
Минусы:
- Потенциальный предел абстракции: если шаблоны становятся слишком сложными, это может затруднить понимание логики пайплайна.
- Возможно усложнение отладки: если возникают проблемы с шаблонами, их отладка может занять больше времени.
Предпочтения
Лично я предпочитаю использовать комбинацию всех трех подходов в зависимости от ситуации:
- Использовать
dependsOn
для четко определенных зависимостей, особенно когда порядок выполнения критичен. - Применять
condition
для динамических и контекстуальных этапов, где важно минимизировать использование ресурсов. - Включать шаблонные выражения для уменьшения повторяемости и улучшения структуры кода, особенно в больших и сложных пайплайнах.
Выбор между dependsOn
, condition
и шаблонными выражениями в конечном итоге зависит от конкретных требований проекта. Оптимальное решение будет включать все три аспекта с учетом удобочитаемости и гибкости.