Как заставить Gitlab CI Pipeline всегда выполнять некоторые задания, а другие только по запросам на слияние? - PullRequest
0 голосов
/ 18 января 2020

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 действительно не поддерживает этот вариант использования?

1 Ответ

0 голосов
/ 18 января 2020

Можно добавить некоторые работы в конвейеры MR. Я получил пример здесь: https://docs.gitlab.com/ee/ci/merge_request_pipelines/index.html#excluding -termin-jobs

Общая идея: вы определяете only: [branch, merge_requests] для каждого задания, а для задания развертывания переписываете его с помощью only: [merge_requests].

.only-default: &only-default
  only:
    - branches
    - merge_requests

build:
  stage: build
  tags:
    - build
  <<: *only-default
  script:
    - echo build

deploy mr:
  stage: deploy
  tags:
    - build
  only:
    - merge_requests
  script:
    - echo "deploy on MR"

Но есть проблема. В этом примере запускаются два конвейера для каждого pu sh после создания MR. Один для only: [branch], один для only: [merge_requests]. Вот как работает only: [merge_requests], он запускает работу при каждом изменении MR. Новый коммит определенно является изменением.

Кажется, что нет решения, которое могло бы запустить конвейер ТОЛЬКО для определенного события - например, создание MR.

Но я думаю, что возможен какой-то обходной путь:

  1. Развертывание промежуточного задания существует для каждого конвейера
  2. Сценарий задания проверяет, создан ли MR для текущей ветви
  3. Если MR создан, метка набора сценариев для этого MR, например, «промежуточная развертывание развернута» '
  4. Если этот ярлык уже существует или MR не создан, просто ничего не делайте.

GitLab API, curl и jq могут помочь в этом. Если у меня будет немного свободного времени, я обязательно постараюсь написать:).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...