Несколько конвейеров для одной ветки

#continuous-integration #gitlab #gitlab-ci #continuous-deployment #gitlab-pipelines

#непрерывная интеграция #gitlab #gitlab-ci #непрерывное развертывание #gitlab-конвейеры

Вопрос:

GitLab CI предлагает очень хорошую гибкость и множество функций. Из-за этого не очевидно, как должны быть достигнуты конкретные конфигурации с использованием GitLabCI yaml, планировщика и т. Д.

Мне интересно настроить рабочий процесс, который я представляю ниже в упрощенном виде.

Я использую только главную ветку, где я хочу, чтобы мой основной конвейер запускался после каждой фиксации. Этот конвейер будет собирать и тестировать мой пакет. Я также хочу иметь запланированный ночной конвейер, который публикует веб-сайт моего пакета. Таким образом, он использует самые последние артефакты, создает документацию и публикует ее вместе на страницах GitLab.

Итак, по сути, я хочу, чтобы два разных конвейера запускались в одной и той же ветке. Основной — обычный, а вторичный — тот, который выполняется планировщиком.

В моем реальном варианте использования я хочу иметь 2 запланированных ночных конвейера и один еженедельный конвейер, поэтому, включая основной (каждый коммит), всего 4 конвейера, все еще для одной и той же ветки.

Использование only / rules на самом деле не решает эту проблему. Существует новая workflow команда, которая теоретически может быть применена здесь путем ветвления

 if scheduled then
  include nightly.gitlab-ci.yml
else
  include primary.gitlab-ci.yml
  

Но я не думаю, что это возможно.

Что может быть наиболее удобным для пользователя решением, так это предоставить запланированным конвейерам возможность выбора пользовательского .gitlab-ci.yml файла вместо запуска файла по умолчанию.

Есть идеи, как достичь конфигурации, которую я ищу?

Единственный способ, который я имею в виду, — это продолжать иметь другую ветку, клон master, где мне нужно заменять .gitlab-ci.yml каждый вечер. Для автоматизации этого требуется дополнительная рабочая станция.

Ответ №1:

Я хочу иметь 2 запланированных ночных конвейера и один еженедельный конвейер, поэтому, включая основной (каждый коммит), всего 4 конвейера, все еще для одной и той же ветки

Я понимаю, что вам нужны 4 конвейера, такие как:

  • Запуск основного конвейера для внесенных изменений
  • Каждую ночь выполняется 1 конвейер каждую ночь
  • Каждую ночь выполняется конвейер Nightly 2, отличный от Nightly 1
  • Еженедельный конвейер, работающий каждую неделю

Для Primary вы можете использовать rules только для запуска заданий при фиксированном изменении с $CI_PIPELINE_SOURCE == "push" :

 # Primary job running only on push (i.e. on pushed commits)
# It won't run on schedule
primary_pipeline_job:
  stage: build
  script:
  - echo "I will run only on commited changes"
  # [...]
  rules:
  - if $CI_PIPELINE_SOURCE == "push"
  

Для нескольких запланированных конвейеров вы можете использовать как $CI_PIPELINE_SOURCE == "schedule" и пользовательские переменные, установленные в конфигурации расписания, такие как:

 # nightly_pipeline_1_job_A and job_B will be run on scheduled pipelines
# only on schedule and when RUN_NIGHTLY_PIPELINE_1 == "true"
nightly_pipeline_1_job_A:
  # [...]
  rules:
  - if: $CI_PIPELINE_SOURCE == "schedule" amp;amp; $RUN_NIGHTLY_PIPELINE_1 == "true"

nightly_pipeline_1_job_B:
  # [...]
  rules:
  - if: $CI_PIPELINE_SOURCE == "schedule" amp;amp; $RUN_NIGHTLY_PIPELINE_1 == "true"

# nightly_pipeline_2_job_A will be run on scheduled pipelines
# only on schedule and when RUN_NIGHTLY_PIPELINE_2 == "true"
nightly_pipeline_1_job_B:
  # [...]
  rules:
  - if: $CI_PIPELINE_SOURCE == "schedule" amp;amp; $RUN_NIGHTLY_PIPELINE_2 == "true"

# weekly_pipeline_job will be run on scheduled pipelines
# only on schedule and when RUN_WEEKLY_PIPELINE == "true"
weekly_pipeline_job:
  # [...]
  rules:
  - if: $CI_PIPELINE_SOURCE == "schedule" amp;amp; $RUN_WEEKLY_PIPELINE == "true"
  

В настройках GitlabCI CI / CD> Расписания> [Ваше расписание]> Переменные вы можете связать переменные. Например, для Nightly pipeline 1 :

введите описание изображения здесь


Если у вас есть несколько заданий, которые вы хотите запустить в одном конвейере, вместо дублирования rules: вы можете использовать extends такие:

 .nightly_pipeline_1:
  rules:
  - if: $CI_PIPELINE_SOURCE == "schedule" amp;amp; $RUN_NIGHTLY_PIPELINE_1 == "true"

nightly_pipeline_1_job_A:
  extends: .nightly_pipeline_1
  # [...]

nightly_pipeline_1_job_B:
  extends: .nightly_pipeline_1
  # [...]
  

Комментарии:

1. хороший ответ, это все еще обходной путь для недостающей функциональности, но, вероятно, наилучший из возможных на данный момент

Ответ №2:

Если у вас есть конвейер, который запускается после каждой фиксации, просто добавьте к нему этап развертывания, который будет выполняться только для запланированных триггеров. Таким образом, вам понадобится только одна конфигурация CI:

 build_job:
...
test_job:
...
deploy_job:
...
  only:
    - schedules
  

Я понимаю, что ваш первоначальный вопрос заключается в том, можете ли вы запускать deploy job только на запланированных конвейерах, но почему бы не протестировать его и не создать заново в таком случае? Обычно рекомендуется тестировать и создавать свои артефакты непосредственно перед развертыванием, особенно если это не занимает слишком много времени.

Комментарии:

1. Развертывание — это не просто один этап, а целый конвейер. Более того, как объяснено в моем Q, я хочу иметь 3 запланированных конвейера. Один из них, конвейер развертывания, просто собирает информацию из других конвейеров, создает таблицу успехов / неудач с упоминанием commit sha, потому что конвейеры daily / weekly / every-commit чаще всего будут иметь разные sha. Еженедельный конвейер — это тяжелый набор тестов, который занимает до 100 часов. К сожалению, ваше решение, похоже, неприменимо.

2. По моему опыту, с Gitlab Gitlab CI легко работать для простых рабочих процессов, но для более продвинутых я бы использовал Jenkins или другой инструмент, который обеспечивает гораздо большую функциональность. Если вам все еще нужно сделать это на Gitlab, существует постоянная проблема с аналогичной проблемой, и некоторые пользователи предлагают, как ее обойти, например. установка переменной по расписанию .