В нашей среде GitLab CI у нас есть сервер сборки с большим количеством ОЗУ, но с механическими дисками, запуск npm install занимает много времени (я добавил кеш, но ему все еще нужно перебирать существующие пакеты, поэтому кеш не может решить все это в одиночку).
Я хочу смонтировать / построить в образе докера сборщика как tmpfs, но мне трудно понять, где разместить эту конфигурацию. Могу ли я сделать это в самом образе построителя или, возможно, в .gitlab-ci.yml для каждого проекта?
В настоящее время мой gitlab-ci.yml выглядит так:
image: docker:latest
services:
- docker:dind
variables:
DOCKER_DRIVER: overlay
cache:
key: node_modules-${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
stages:
- test
test:
image: docker-builder-javascript
stage: test
before_script:
- npm install
script:
- npm test
Вы, вероятно, захотите что-то вроде этого, чтобы добавить объем данных на бегунке:
volumes = ["/path/to/volume/in/container"]
Я бы, вероятно, использовал второй вариант из статьи и добавил объем данных из хост-контейнера, на случай, если ваш кеш по какой-то причине будет поврежден, поскольку его будет легче очистить.
volumes = ["/path/to/bind/from/host:/path/to/bind/in/container:rw"]
Я делал это раньше для кеша композитора, и он работает очень хорошо. Вы должны иметь возможность установить кеш для своего npm, используя следующую переменную среды в вашем .gitlab-ci.yaml:
npm_config_cache=/path/to/cache
Другой вариант - использовать артефакты между сборками, как описано здесь: Как смонтировать том в контейнере докеров в .gitlab-ci.yml?
Я понял, что это можно решить, используя команду mount прямо в разделе before_script, хотя для этого нужно скопировать исходный код, а мне удалось значительно сократить время тестирования.
image: docker:latest
services:
- docker:dind
variables:
DOCKER_DRIVER: overlay
stages:
- test
test:
image: docker-builder-javascript
stage: test
before_script:
# Mount RAM filesystem to speed up build
- mkdir /rambuild
- mount -t tmpfs -o size=1G tmpfs /rambuild
- rsync -r --filter = ":- .gitignore" . /rambuild
- cd /rambuild
# Print Node.js npm versions
- node --version
- npm --version
# Install dependencies
- npm ci
script:
- npm test
Поскольку теперь я использую команду npm ci
вместо npm install
, я больше не использую кеш, поскольку он все равно очищает кеш при каждом запуске.
Какой GitLab Runner Executor вы используете? Мне не удалось заставить эту работу с исполнителем докеров, что имеет смысл, поскольку контейнеры обычно непривилегированы и не могут ничего смонтировать.
Спасибо! Сам кеш работает нормально, просто я хочу, чтобы вся сборка запускалась в файловой системе tmpfs, поскольку дисковый ввод-вывод при проверке пакетов npm, а также транспиляция JS-кода требуют времени. Но, конечно, если я смонтирую внешний каталог, я могу настроить этот каталог как систему tmpfs, хотя я надеялся, что смогу сделать это таким образом, чтобы мне не нужно было делать настройки для этого на хост-машине (я могу если мне нужно, но это затрудняет переустановку / перенос / дублирование этой машины).