Файлы, упомянутые в главе

  • werf.yaml

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

Что за стадии?

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

Стадии — это этапы сборочного процесса, кирпичи, из которых в итоге собирается конечный образ. Стадия собирается из группы сборочных инструкций, указанных в конфигурации. Причем группировка этих инструкций не случайна, имеет определенную логику и учитывает условия и правила сборки. С каждой стадией связан конкретный Docker-образ.

Подробнее о том, какие стадии для чего предполагаются, можно посмотреть здесь. Если вкратце, то werf предлагает использовать для стадий следующую стратегию:

  • использовать стадию beforeInstall для инсталляции системных пакетов;
  • install — для инсталляции системных зависимостей и зависимостей приложения;
  • beforeSetup — для настройки системных параметров и установки приложения;
  • setup — для настройки приложения.

Другие подробности о стадиях описаны в документации.

Одно из основных преимуществ использования стадий в том, что мы можем перезапускать сборку не с нуля, а только с той стадии, которая зависит от изменений в определенных файлах.

В Node.js в качестве менеджера зависимостей используется npm. Пропишем его использование в файле werf.yaml и затем оптимизируем его использование.

Подключение менеджера зависимостей

Пропишем команду npm ci в нужные стадии сборки в werf.yaml:

shell:
<...>
  install:
  - cd /app && npm ci
shell: <...> install: - cd /app && npm ci

Однако, если оставить всё так — стадия не будет запускаться при изменении lock-файла package.json. Подобная зависимость пользовательской стадии от изменений указывается с помощью параметра git.stageDependencies:

git:
- add: /
  to: /app
  stageDependencies:
    install:
    - package.json
git: - add: / to: /app stageDependencies: install: - package.json

Теперь при изменении файла package.json стадия install будет запущена заново.

Оптимизация сборки

Чтобы не хранить ненужные кэши пакетного менеджера в образе, можно при сборке смонтировать директорию, в которой будет храниться кэш.

Для того, чтобы оптимизировать работу с этим кешем при сборке, мы добавим специальную конструкцию в werf.yaml:

mount:
- from: build_dir
  to: /var/cache/apt
mount: - from: build_dir to: /var/cache/apt

Теперь при каждом запуске сборки эта директория будет монтироваться с сервера, где запускается build, и она не будет очищаться между сборками. Таким образом, кэш будет сохраняться между сборками.