Запустить конвейер YAML в Azure Devop - PullRequest
2 голосов
/ 01 мая 2020

Я новичок в конвейере сборки YAML в Azure Devops, и я пытаюсь обернуть голову вокруг функциональности триггера. Меня беспокоит то, что мне нужны разные триггеры в разных ветках, но я хочу использовать один и тот же конвейер.

Допустим, я хочу

  1. Построить все проверки в основной ветке, и это должно быть развернутым на сервере
  2. Каждую ночь я хочу собрать и развернуть ветку разработки на другом сервере

Я в замешательстве, так как файл yaml также зарегистрирован в Git. Я читал, что если у вас есть запланированный триггер, у вас также не может быть триггера CI.

Нужно ли иметь два файла .yml? Один определяющий каждый? Кажется, не круто повторять все шаги

Или я должен иметь разные версии одного и того же файла в каждой ветке? Разве это не слилось в какой-то момент?

Бонусный вопрос: а что если у вас есть sh конвейер сборки на ветви Developmt с триггером на master? (тьфу, у меня кружится голова)

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Нужно ли иметь два файла .yml? Один определяющий каждый? Кажется нехорошо повторять все шаги

После периода исследований я лично рекомендую вам лучше использовать два .yml файла с различными конвейерами сборки.

Максимум Прямой вопрос заключается в том, что код в ветви master и ветви development не синхронизируется в реальном времени. Когда код в двух ветвях различен, результаты сборки отличаются. Если они находятся в одном и том же конвейере, нам нужно вручную проверить, из какой ветви произошла ошибка при сбое сборки. Это болезненная вещь.

Другая проблема deep заключается в том, что мы можем определить CI trigger и Scheduled trigger в одном файле yaml, например:

trigger: 
 branches:
    include:
      - master


schedules:
- cron: "* 10 * * *"
  always: true
  displayName: Daily midnight build (UTC 22:00)
  branches:
    include:
     - Development

Для этого нам нужно установить этот yaml в ветке Development. Если мы изменим какой-либо код в основной ветке, он запустит этот конвейер. Однако , он только строит код на ветке Development, он не включает измененный код в мастер . Так что этот триггер CI будет бессмысленным.

Должен ли я иметь разные версии одного и того же файла в каждой ветви? Разве это не слилось в какой-то момент?

Лично рекомендую вам лучше использовать разные файлы yaml с разными именами. Как вы сказали, те же файлы подвержены ненужным рискам при последующем слиянии веток

Мой бонусный вопрос был больше похож на: Предполагаете ли вы хранить разные версии вашего конвейера сборки в разных ветках? Я имею в виду, если я хочу собирать ветвь разработки каждый раз, когда я пу sh для разработки, можно ли определить этот триггер в основной версии ветки файла yaml?

Ответ - да. Вы можете установить триггеры CI с простым синтаксисом в версии ветки master файла yaml:

trigger: 
 branches:
    include:
      - master
      - Development

С этими настройками каждый раз, когда вы sh разрабатываете ветку, будет вызвать сборку, определенную в основной версии ветки файла yaml.

Примечание. Если вы задали бонус выше, если мы установили выше триггеры CI, конвейер будет запускать сборку из-за непрерывных фиксаций в ветке dev , Иногда мы просто изменяем файл readme, мы не хотим, чтобы такая модификация вызывала ненужные сборки, лучший способ решить такие проблемы - использовать PR триггер .

Надеюсь, это поможет.

1 голос
/ 02 мая 2020

Вы говорите, что у вас не может быть запланированного триггера и триггера CI, но это не так. Пожалуйста, проверьте документацию здесь .

Если вы хотите запустить свой конвейер, используя только запланированные триггеры, вы должны отключить PR и триггеры непрерывной интеграции, указав pr: none и trigger: нет в вашем файле YAML. Если вы используете Azure Repos Git, сборки PR настроены с использованием политики ветвления и должны быть отключены там.

Таким образом, у вас есть два варианта:

  1. Храните все это в одном файле YAML и проверьте, какая ветка или как сборка запускалась при условии развертывания на надлежащий сервер.
  2. У вас может быть две сборки, но во избежание повторения вы извлекаете общие вещи в шаблон и повторно используете их. в определении сборки (так что на самом деле в этом случае у вас будет 3 файла yaml).

Несколько примеров:

  • вы хотите выполнить задание только для мастера ветвь:
jobs:
- job: A
  steps:
  - script: echo hello

- job: B
  dependsOn: A
  condition: and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/master'))
  steps:
  - script: echo this only runs for master
  • вы хотите извлечь общие шаги и повторно использовать их в определении сборки

Общие шаги:

# File: simple-param.yml
parameters:
- name: yesNo # name of the parameter; required
  type: boolean # data type of the parameter; required
  default: false

steps:
- script: echo ${{ parameters.yesNo }}

Определение сборки:

# File: azure-pipelines.yml
trigger:
- master

extends:
  template: simple-param.yml
  parameters:
      yesNo: false # set to a non-boolean value to have the build fail

Вы можете прочитать о шаблонах в документации или проверить пример в моем блоге .

Если хотите Для того, чтобы classi c выпускные конвейеры, вам нужно определить два релизных конвейера. Инес с триггером для указания c ветви.

Continous trigger for release pipeline

Подводя итог: вы можете делать то, что вы хотите, и у вас есть несколько способов достижения это. Моя рекомендация - использовать отдельные конвейеры с шаблоном, так как это делает определение сборки более чистым, чем условие, чтобы проверить, для какой ветви или как была запущена сборка.

В этой переменной Build.Reason вы можете проверить, как была запущена ваша ветка:

  • Вручную: пользователь вручную поставил в очередь сборку.
  • IndividualCI: непрерывная интеграция (CI), инициированная Git pu sh или регистрацией TFV C.
  • BatchedCI: непрерывная интеграция (CI), запускаемая Git pu sh или регистрация TFV C, и пакетные изменения были выбраны.
  • Расписание: запуск по расписанию. ValidateShelveset: пользователь вручную поставил в очередь сборку указанного c TFV C полочного набора.
  • CheckInShelveset: закрытый триггер регистрации.
  • PullRequest: сборка была инициирована политикой ветвления Git, которая требует сборки.
  • BuildCompletion: сборка была запущена другой сборкой.
  • ResourceTrigger: сборка была инициирована триггером ресурса.

Затем вы можете использовать эту переменную в условии. Для получения дополнительной информации, пожалуйста, go здесь .

Закрывая это, имейте в виду, что существует специальный вид job, называемый deployment для развертываний. Пожалуйста, рассмотрите возможность использования этого, если вы собираетесь развернуть свое приложение с использованием конвейера yaml.

Для вашего дополнительного вопроса: вы можете переопределить настройки для вашей сборки. Я имею в виду, вы можете иметь триггер для мастера и только мастер-ветку Но все же вы можете запустить сборку для других веток (например, ветки разработки) (например, вручную). Что случилось потом? Сборка будет работать для новой определенной ветки. В конце это определение сборки и запуск автоматического управления выполнением сборки c.

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