Пайплайны для Merge Requests существуют отдельно (имеют лейбл detached) и запускается независимо от основного pipeline. Из-за этого если сделать push в репу в ветку, из которой в гитлабе есть открытый МР, то запускаются 2 одинаковых пайплайна
Есть варианта, чтобы это избежать:
- Дублировать все джобы через extends, чтобы разделить на запускаемые на МРах и на обычные
- Не запускать CI на некоторых ветках, пока из них нет открытого МРа
Первый вариант предполагает дублирование job, поэтому удобнее сделать второй вариант с использованием workflow:rules, который подразумевает написание правил запуска самого пайплайна, а не отдельных джоб
workflow:
rules:
- if: $CI_MERGE_REQUEST_ID
- if: $CI_COMMIT_TAG
- if: $CI_COMMIT_BRANCH == "develop"
- if: $CI_COMMIT_BRANCH == "master"
- if: $CI_COMMIT_BRANCH =~ /^release\/.*/
В таком случае все джобы пайплайна всегда будут запускаться на:
- Всех тегах
- Ветках с именами develop, master, release*
- Открытых МРах любой ветки
При этом на перечисленных ветках (CI_COMMIT_BRANCH) при наличии МРа также будет запускаться двойной pipeline, но это не является проблемой, т.к. эти ветки обычно либо не вливаются, либо вливаются редко и у них нет долгоживущих МРов (если мы говорим про gitflow). Зато на feature ветках мы не будем попусту занимать гитлаб-раннеры
Заметка
Detached пайплайны для МРов являются приоритетными и именно они показываются в статусе МРа