Условная сборка на GitLab

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

Однако Jekyll основан на Ruby и требует пару зависимостей Gem. Я также добавил несколько плагинов. По этой причине я создал образ Docker со всеми необходимыми зависимостями. Регулярно я обновляю версии в Gemfile.lock через Bundler. После этого мне нужно пересобрать образ Docker.

Следовательно, необходимо выполнить два задания:

  1. После push, содержащего изменение, которое влияет на образ Docker, собрать его.
  2. После любого push генерировать сайт.

Для первого задания условием запуска является изменение любого из следующих файлов: Gemfile.lock, Dockerfile и .gitlab-ci.yml.

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

  • ссылка, например, ветвь или метка.
  • Триггер, например, push, веб-интерфейс или вызов API.
  • Значение переменной
  • Изменение в определенном файле
  • Несколько других

Предпоследний вариант — это ответ на нашу проблему. Мы можем настроить набор файлов, и если какой-либо из них был изменен, сборка должна быть запущена. В противном случае ничего не делать.

Это выглядит следующим образом:

stages:
  - image                                        # 1
  - deploy                                       # 1

build:                                           # 2
  stage: image                                   # 2
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  script: # Build the Docker image
  only:
    refs:
      - master                                   # 4
    changes:
      - Gemfile.lock                             # 5
      - Dockerfile                               # 5
      - .gitlab-ci.yml                           # 5

pages:                                           # 3
  stage: deploy                                  # 3
  image:
    name: registry.gitlab.com/nfrankel/nfrankel.gitlab.io:latest
  script: # Generate the site
  only:
    refs:
      - master
Войти в полноэкранный режим Выйти из полноэкранного режима
  1. Определите два этапа
  2. Определите задание build на этапе image. Это задание создает образ Docker (через Kaniko).
  3. Определите задание pages на этапе deploy. Задание создает сайт с помощью Jekyll.
  4. Собирайте только ветку master.
  5. Собирайте образ только в том случае, если любой из этих файлов изменился

На этом этапе каждое изменение запускает сборку: задание по созданию образа запускается до генерации сайта, но GitLab пропускает первое, если образ не изменился.

Чтобы пойти дальше:

  • только:изменения / кроме:изменений
  • примеры only:changes / except:changes
  • GitHub: Запуск рабочего процесса только тогда, когда push затрагивает определенные файлы

Первоначально опубликовано на A Java Geek 8 маяth, 2022

Оцените статью
Procodings.ru
Добавить комментарий