Azure Pipelines – Шаблонные выражения x ‘dependsOn’ или ‘condition’

Вопрос или проблема

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

Оцените материал
Добавить комментарий

Капча загружается...