Ключевые слова «Только» или «правила» странным образом удаляют задания из конвейера CI

# #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"
 

работа без политики quot;толькоquot; исчезает

Почему исчезла 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"
 

задание без ключевого слова quot;правилаquot; исчезает

Почему исчезла 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], в контексте запроса на слияние выполняются только задания с этим ключевым словом. Никаких других заданий не выполняется».