Gitlab: монтирует / строит образ сборки как tmpfs

В нашей среде 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
5
0
2 367
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы, вероятно, захотите что-то вроде этого, чтобы добавить объем данных на бегунке:

volumes = ["/path/to/volume/in/container"]

https://docs.gitlab.com/runner/configuration/advanced-configuration.html#example-1-adding-a-data-volume

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

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?

Спасибо! Сам кеш работает нормально, просто я хочу, чтобы вся сборка запускалась в файловой системе tmpfs, поскольку дисковый ввод-вывод при проверке пакетов npm, а также транспиляция JS-кода требуют времени. Но, конечно, если я смонтирую внешний каталог, я могу настроить этот каталог как систему tmpfs, хотя я надеялся, что смогу сделать это таким образом, чтобы мне не нужно было делать настройки для этого на хост-машине (я могу если мне нужно, но это затрудняет переустановку / перенос / дублирование этой машины).

tirithen 31.10.2018 15:48
Ответ принят как подходящий

Я понял, что это можно решить, используя команду 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 вы используете? Мне не удалось заставить эту работу с исполнителем докеров, что имеет смысл, поскольку контейнеры обычно непривилегированы и не могут ничего смонтировать.

jlh 16.09.2021 14:21

Другие вопросы по теме