Как обновить только конвейер в Azure Devops при использовании конвейеров YAML и gitflow? - PullRequest
1 голос
/ 14 июля 2020

В настоящее время мы используем конвейеры Classi c Azure (конвейеры сборки и выпуска). Они работают хорошо, потому что, если нам нужно внести изменения в конвейер, легко просто изменить конвейер и запланировать сборку из пользовательского интерфейса.

Теперь Microsoft продвигает конвейеры YAML и инфраструктуру как код, поэтому мы планируем использовать YAML и многоступенчатые конвейеры в нашем следующем проекте.

Я не нашел способа обновить только конвейер сейчас, когда конфигурация находится в системе управления версиями. Например, предположим, что конвейер для среды test по какой-то причине ломается, и мне нужно исправить это, внеся изменения только в конфигурацию YAML. Могу ли я внести изменения только в ветку Release, а затем объединить их обратно в ветку develop?

Раньше у нас был выделенный конвейер сборки и выделенный конвейер выпуска в режиме Classi c, так что конвейер сборки будет создавать пакет независимо от ветки, на которой он был запущен. Затем будет запущен Release Pipeline, который проверит ветку, откуда исходит артефакт сборки, и развернет пакет, используя соответствующую конфигурацию.

Выпускной трубопровод (classi c)

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

Например, мы могли бы создать производственную сборку (master ветвь) и использовать эту сборку в тестовой среде, чтобы попытаться воспроизвести ошибки.

Как это будет работать с конвейерами YAML, если я не могу просто изменить только конвейер, но должен принимать все изменения, поступающие из ветки разработки? Возможно ли (или возможно) использовать только конвейеры сборки YAML и использовать конвейер выпуска classi c?

Ответы [ 3 ]

2 голосов
/ 15 июля 2020

Прежде всего, если вы не видите какой-либо конкретной c причины (например, функции, доступной в конвейере на основе YAML), не делайте этого. Это не 1 к 1, и в выпуске classi c есть некоторые функции, которые недоступны в YAML. Есть шанс, что разрыв будет устранен в будущем, но это еще не сделано.

Если вы хотите использовать конвейер yaml для сборки и сохранить подход classi c для выпусков, это вполне выполнимо. Вы потребляете артефакт так же, как и артефакт, опубликованный в сборке classi c. И если вы решите внести это изменение, это действительно просто, поскольку вы можете предварительно просмотреть YAML для шагов в конвейере classi c.

enter image description here

But if you want to multi-stage approach and integrate you release as deployments there you should be familiar with two key things:

С шаблонами YAML вы поместите все свои 5 задач со стадии выпуска в один блок, который позже вы будете использовать как отдельный этап развертывания. Вы зададите параметры вместо жестко заданных значений, поэтому на уровне почты вы определите, где именно вы развертываете артефакт.

И с помощью условия вы будете контролировать, какой этап будет запущен. В качестве простого примера вы можете проверить этот YAML из документации (у вас есть ссылка выше):

variables:
  isMain: $[eq(variables['Build.SourceBranch'], 'refs/heads/master')]

stages:
- stage: A
  jobs:
  - job: A1
    steps:
      - script: echo Hello Stage A!

- stage: B
  condition: and(succeeded(), eq(variables.isMain, true))
  jobs:
  - job: B1
    steps:
      - script: echo Hello Stage B!
      - script: echo $(isMain)

Но имейте в виду, что с YAML вы не можете запускать только задание c. Это означает, что вы не можете запустить, например, развертывание в DEV env. Если вы хотите сделать это, вам нужно запустить весь конвейер (он может измениться в будущем, поскольку Azure команда DevOps работает над этим, если я припоминаю).

1 голос
/ 14 июля 2020

Мы используем кольца развертывания для нашего приложения, у нас есть единый конвейер сборки, который использует условную логику c для включения или исключения определенных c задач в зависимости от исходной ветки. Если вам абсолютно необходимы разные конвейеры, я бы рекомендовал использовать файлы шаблонов для общих шагов (очень похоже на группы задач в конвейерах classi c). С помощью YAML вы можете создавать шаблоны этапов, заданий или этапов, так что эти go выходят за рамки возможностей групп задач. Реализованное мной решение выглядит примерно так:

  • build-repo
    • templates
      • stage
        • parallel-unit-test. yml
        • build-artifacts.yml
        • publi sh -artifacts.yml
        • deploy.yml
      • шаг
        • pre-build.yml
        • build.yml
        • post-build.yml
        • unit-test.yml
        • артефакты загрузки. yml
        • publi sh -artifacts.yml
        • deploy.yml
  • app- репо
    • конвейеры
      • master-release.yml
      • ring-deploy.yml
    • [Файлы проекта]

Все шаблоны в репозитории сборки закодированы так, чтобы соответствовать c сервисной агности, насколько это возможно. Все, что может измениться / изменится, параметризовано. Мы даже используем YAML logi c выражения ${[ if eq(parameters.shouldRun, true) }}: для включения или выключения шагов, которые применимы только к определенным c средам / кольцам. Я бы рекомендовал прочитать эти документы:

Шаблоны

Выражения YAML

1 голос
/ 14 июля 2020

Для непосвященных в Classi c Release Pipelines мы обсуждаем функцию, похожую на фильтр артефактов. Щелкните Условия перед развертыванием для этапа, а затем щелкните Добавить под фильтрами артефактов. Выберите свой артефакт и укажите, на каких ветвях должна запускаться сцена. Здесь мы можем указать, что Stage должен срабатывать только в том случае, если артефакт был создан из определенной ветки.

enter image description here

There isn't a similarly named feature for YAML CD in Azure Pipelines. We can achieve a similar effect using a stage condition as described здесь . Из этих связанных документов мы можем увидеть пример;

variables:
  isMain: $[eq(variables['Build.SourceBranch'], 'refs/heads/master')]

stages:
- stage: A
  jobs:
  - job: A1
    steps:
      - script: echo Hello Stage A!

- stage: B
  condition: and(succeeded(), eq(variables.isMain, true))
  jobs:
  - job: B1
    steps:
      - script: echo Hello Stage B!
      - script: echo $(isMain)

В примере этап A будет всегда выполняться, но этап B будет выполняться только в том случае, если SourceBranch равен master.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...