# #gitlab #continuous-integration #gitlab-ci #continuous-deployment #cicd
Вопрос:
Я пытаюсь использовать ключевые слова «правила» и «только» для определения поведения моего конвейера между запросами на слияние, переходом в ветвь разработки и переходом в главную ветвь.
Я заметил несколько странных поведений в CI Gitlab, давайте посмотрим на мои конвейеры merge_requests.
- С помощью этого файла gitlab-ci.yml без каких-либо правил отображаются и выполняются все задания.
image: "python:3.8"
stages:
- test_without_only_policy
- test_with_only_policy
test_without_only_policy:
stage: test_without_only_policy
when: manual
script:
- echo "Yay, I am in the pipeline"
test_with_only_policy:
stage: test_with_only_policy
script:
- echo "I am always in the pipeline"
Все работает так, как ожидалось, отлично 👍
- С помощью этого файла gitlab-ci.yml, без политики «только» во 2-м задании, 1-е задание без правил исчезает.
image: "python:3.8"
stages:
- test_without_only_policy
- test_with_only_policy
test_without_only_policy:
stage: test_without_only_policy
when: manual
script:
- echo "No, I am not in the pipeline anymore"
test_with_only_policy:
stage: test_with_only_policy
only:
- merge_requests
script:
- echo "I am always in the pipeline"
Почему исчезла 1 — я работа без правил или политики «только»?
- С помощью этого файла gitlab-ci.yml с ключевым словом «правила» во 2-м задании исчезает 1-е задание без правил.
image: "python:3.8"
stages:
- test_without_only_policy
- test_with_only_policy
test_without_only_policy:
stage: test_without_only_policy
when: manual
script:
- echo "No, I am not in the pipeline anymore"
test_with_only_policy:
stage: test_with_only_policy
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
when: manual
script:
- echo "I am always in the pipeline"
Почему исчезла 1 — я работа без правил или политики «только»?
Спасибо за вашу помощь, я не понимаю, почему моя работа исчезает, когда я добавляю правила в другие задания.
Ответ №1:
Согласно документации для конвейеров запросов на слияние, если у вас есть конвейер , в котором только некоторые задания используют только/кроме/правила merge_reqeusts
, только эти задания будут в конвейере, если это конвейер запросов на слияние. Другие рабочие места будут оставлены без внимания.
Вот пример из документов:
build:
stage: build
script: ./build
only:
- main
test:
stage: test
script: ./test
only:
- merge_requests
deploy:
stage: deploy
script: ./deploy
only:
- main
В этом примере единственное задание, которое указывает, что оно должно выполняться для конвейеров запросов на слияние, — это test
задание. Для стандартных push
конвейеров build
deploy
будут выполняться задания и, но когда создается новый запрос на слияние, изменение передается в ветвь, которая является исходной ветвью существующего запроса на слияние, или вы нажимаете кнопку Запустить конвейер на вкладке Конвейеры для запроса на слияние, он запустит конвейер запроса на слияние.
Вот еще один пример с другим сценарием:
A:
stage: some_stage
only:
- branches
- tags
- merge_reqeusts
script:
- script.sh
B:
stage: some_other_stage
only:
- branches
- tags
- merge_reqeusts
script:
- script.sh
C:
stage: third_stage
only:
- merge_reqeusts
script:
- script.sh
В этом примере задания A
и B
выполняются для всех типов трубопроводов push
, tags
merge_requests
, и т.д., Но задания C
выполняются только для merge_request
трубопроводов.
Вот почему ваша test_without_only_policy
работа никогда не будет находиться в конвейере, где test_with_only_policy
она выполняется. test_with_only_policy
специально запускается для событий запроса на слияние, но test_without_only_policy
не выполняется.
Комментарии:
1. Спасибо вам за ваш ответ. Я думаю, что это необычное поведение, но, как вы сказали, в документации указано: «Когда вы используете только: [merge_requests], в контексте запроса на слияние выполняются только задания с этим ключевым словом. Никаких других заданий не выполняется».