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