Вложенные этапы в работах CI - PullRequest
0 голосов
/ 14 октября 2018

В описании задания GitLab можно указать этапы, где задания будут группироваться по этапам и выполняться параллельно.Представьте, что я хотел бы сделать следующее:

  1. Построить бинарный файл релиза.
  2. Построить образ Docker релиза для бинарного файла релиза.
  3. Построить бинарный файл отладки.
  4. Создание образа Docker отладки для двоичного файла отладки.

Без вложенных этапов я могу попытаться создать двоичные файлы выпуска и отладки одновременно, а затем собрать оба образа.Но это ужасно неэффективно, потому что одна из сборок занимает намного больше времени, чем другая, но я не могу начать создавать образ для сборки, которая закончилась первой.

Если бы можно было организовать DockerРабота по созданию образа должна начаться, как только закончится первая сборка, она будет идеальной.Один из возможных вариантов - если бы я мог указать вложенные этапы, где, скажем, этап build-all имел два вложенных этапа: build-release и build-debug, каждый из которых состоит из двух заданий: build-release-binary, build-release-image,и, аналогично, build-debug-binary, build-debug-image.

Поскольку я новичок в GitLab, я также был бы признателен за отрицательный ответ, то есть знание того, что это невозможно, также полезно.

1 Ответ

0 голосов
/ 08 февраля 2019

Проблема

Чтобы сначала подтвердить вашу проблему, я полагаю, у вас есть такая настройка:

.gitlab-ci.yml:

stages:
  - build-binaries
  - build-images

# Binaries
build-release-binary:
  stage: build-binaries
  script:
    - make release

build-debug-binary:
  stage: build-binaries
  script:
    - make debug

# Docker Images
build-release-image:
  stage: build-images
  dependencies:
    - build-release-binary
  script:
    - docker build -t wvxvw:release .

build-debug-image:
  stage: build-images
  dependencies:
    - build-debug-binary
  script:
    - docker build -t wvxvw:debug .

И это должно привести к конвейеру, подобному следующему:

 build-binaries                       build-images
 ______________________              _____________________
|                      |            |                     |
| build-release-binary |----+--+--->| build-release-image |
|______________________|   /   \    |_____________________|
                           |    |
 ______________________    |    |    _____________________
|                      |   |    |   |                     |
| build-debug-binary   |---/    \-->| build-debug-image   |
|______________________|            |_____________________|

Оценка

Вы правы, что никакие задания со стадии build-images не начнутся, пока все задания со стадии build-binaries не будут завершены (несмотря на то, что зависимости задания выполнены).

Существует открытая проблема GitLab, в которой обсуждается следующее:
gitlab-org/gitlab-ce#49964: разрешить запуск задания CI, если его зависимости преуспели

Я добавил комментарий, указывающий на улучшения, которые могут быть сделаны в этом случае.В будущем конвейер может выглядеть следующим образом (обратите внимание на отдельные соединительные линии):

 build-binaries                       build-images
 ______________________              _____________________
|                      |            |                     |
| build-release-binary |----------->| build-release-image |
|______________________|            |_____________________|

 ______________________              _____________________
|                      |            |                     |
| build-debug-binary   |----------->| build-debug-image   |
|______________________|            |_____________________|

Обходной путь

Иногда, если у вас есть последовательные задачи, проще просто запустить их вхолостая работаЭто позволяет избежать лишних затрат при запуске другой работы, когда у вас уже есть все готовое к работе на первой работе.

В качестве обходного пути вы можете просто сгладить свой конвейер в одну стадию, которая создаст какдвоичный файл и образ Docker:

.gitlab-ci.yml:

stages:
  - build

build-release:
  stage: build
  script:
    - make release
    - docker build -t wvxvw:release .

build-debug:
  stage: build
  script:
    - make debug
    - docker build -t wvxvw:debug .

Ваш конвейер тогда, конечно, будет выглядеть так:

 build
 _______________
|               |
| build-release |
|_______________|

 _______________
|               |
| build-debug   |
|_______________|

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

...