TL / DR: Моя цель - иметь конвейер Gitlab (CE-12.4.2), который выполняет некоторые задания только по запросам на слияние и другим заданиям всегда (по запросам на слияние и всем обычным). толчки). Как должен .gitlab-ci.yml
выглядеть, чтобы сделать это?
Мой вариант использования: У меня большой конвейер, на котором выполняется много заданий (тесты, проверка, отладка, сборка, выполнение * 1063). * х, ...). Теперь я добавил промежуточную среду (с использованием kubernetes) и заставил конвейер создать новый образ и развернуть его в промежуточной среде. Это позволяет мне мгновенно открывать измененное (веб-) приложение и видеть, как изменения ведут себя и выглядят, не проверяя их локально. Теперь создание образа и его развертывание в стадии подготовки было бы слишком ресурсоемким для каждого pu sh, поэтому я хочу, чтобы развертывания для стадии развертывания только когда кто-то создает запрос на слияние, чтобы я мог их просмотреть.
Очень упрощенный пример:
install:
script: ...
test:
script: ...
build-image:
script: ...
only: [merge_requests]
deploy-staging:
script: ...
only: [merge_requests]
Для всех обычных нажатий должны выполняться задания install
и test
.
Для запросов на слияние задания install
, test
, build-image
и deploy-staging
должны быть выполнены.
То, что я пробовал: Gitlab имеет эту функцию, чтобы определять only: [merge_requests]
на работе, это заставляет эту работу только будет выполняться, когда конвейер выполняется для запроса на слияние. Похоже, именно то, что я ищу, но есть большой улов. Как только этот атрибут будет применен к одному заданию в конвейере, все остальные задания в этом конвейере, которые не имеют этого атрибута, будут удалены из конвейера при выполнении внутри запросов на слияние. Сначала это показалось мне ошибкой, но на самом деле это задокументированное поведение :
In the above example, the pipeline contains only a test job. Since the build and deploy jobs don’t have the only: [merge_requests] parameter, they will not run in the merge request.
Чтобы заново представить все остальные задания в конвейере для запросов на слияние, я должны применить only: [merge_requests]
ко всем другим работам. Проблема с этим подходом состоит в том, что теперь эти обычные задания больше не выполняются для обычных git -толков. И у меня нет никакого способа повторно представить эти обычные задания в конвейерах для обычных толчков, потому что Gitlab не поддерживает only: [always]
или что-то подобное.
Теперь я также заметил, что синтаксис only
кандидат на оскорбление, и вместо этого следует предпочесть синтаксис rules
, поэтому я взглянул на это. При таком подходе возникает множество проблем:
- Единственный способ определить с помощью
rules
, выполняется ли конвейер для запроса на слияние или нет, - это оценить переменные, связанные с запросами на слияние, например $CI_MERGE_REQUEST_ID
. К сожалению, эти переменные существуют только при использовании only: [merge_requests]
, что может привести к появлению вышеупомянутых проблем. - Правила допускают только условное применение других атрибутов, поэтому мне все равно придется использовать
only
, except
или when
атрибуты для фактического удаления или добавления заданий из или в конвейер. К сожалению, Gitlab не поддерживает ничего вроде only: [never]
или when: never
, поэтому у меня нет возможности фактически удалить или добавить задания.
Я также пытался сделать так, чтобы задания зависели от другого, используя need
или dependencies
атрибутов, это, казалось, не влияло на то, включено ли задание в конвейер или нет.
Последнее, что я отчаянно пытался, всегда включал все задания и просто помечал их как when: manual
быть вызванным вручную нажатием кнопки. Это в некоторой степени работает, но очень утомительно, потому что развертывание в промежуточный процесс представляет собой многозадачный процесс, и каждая работа занимает довольно много времени до завершения sh. Таким образом, я бы увидел запрос на объединение, pu sh кнопку для первой работы, подождите 5 минут, нажмите следующую кнопку, снова подождите 5 минут, и только тогда я смогу использовать постановку. Для многих небольших запросов на слияние это отнимет у меня много времени и не будет эффективным решением. Я также не могу просто пометить первое из этих заданий как ручное, потому что Gitlab просто пропустит это задание и выполнит последующие из вышеперечисленного (и опять же, needs
и dependencies
, похоже, не влияют на это при работе с запущенные задания).
Что меня немного смущает, так это то, что после поиска по net я не нашел никого, кто бы имел такую же проблему. Либо я единственный пользователь Gitlab, который хочет выполнять некоторые задания только для запросов на слияние, не исключая все другие задания (что представляется крайне маловероятным), или я упускаю что-то очевидное (что представляется более вероятным). Я что-то упустил или Gitlab действительно не поддерживает этот вариант использования?