Как хранить модули узлов между заданиями и этапами в gitlab с непрерывной интеграцией - PullRequest
2 голосов
/ 04 мая 2019

Я довольно новичок в GitLab CI и пробовал разные подходы к использованию каталога node_modules во всем моем конвейере.Из того, что я прочитал в официальных документах , кеш и артефакты кажутся подходящими подходами для передачи файлов между заданиями:

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

Однако моя проблема с методом кэширования заключается в том, что node_modules будет сохраняться между конвейерами по умолчанию:

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

Iне хочу сохранять node_modules между конвейерами.Что я на самом деле хочу, так это запустить новую установку с npm на моем этапе установки, а затем разрешить всем последующим работам в конвейере использовать эти модули.Поэтому я начал использовать артефакты вместо кэша, который описывается аналогично:

артефакты используются для указания списка файлов и каталогов, которые должны быть присоединены к заданию после успешного завершения.[...]

Артефакты будут отправлены в GitLab после успешного завершения задания и будут доступны для загрузки в пользовательском интерфейсе GitLab.Функция зависимости должна использоваться вместе с артефактами и позволяет вам определять артефакты для передачи между различными заданиями.

Метод зависимости от артефакта, кажется, пригоден для использования в моем случае.Однако и кеш, и артефакты крайне неэффективны и работают медленно.node_modules установлены и используются, но весь каталог затем загружается куда-то и перезагружается между каждым заданием.(Мне бы очень хотелось узнать, что здесь происходит ... Куда идут модули?)

Есть ли лучший способ запустить npm install только один раз в начале конвейера, а затем сохранить node_modules в конвейере в течение всего времени выполнения?Я не хочу сохранять node_modules после завершения всех заданий, поэтому их не нужно нигде загружать или скачивать.

Пример файла конфигурации конвейера для воспроизведения поведения:

image: node:lts

stages:
  - setup
  - build
  - test

node:
  stage: setup
  script:
    - npm install
  artifacts:
    paths:
      - node_modules/

build:
  stage: build
  script:
    - npm run build
  dependencies:
    - node

test:
  stage: test
  script:
    - npm run lint
    - npm run test
  dependencies:
    - node

1 Ответ

1 голос
/ 05 мая 2019

Куда идут модули?

По умолчанию артефакты сохраняются на главном компьютере gitlab :

/var/opt/gitlab/gitlab-rails/shared/artifacts

Есть ли лучший подход для запуска npm install только один раз в начале конвейера и последующего сохранения node_modules в конвейере в течение всего времени выполнения?

Есть несколько вариантов, которые вы можете попробовать:

  1. Объединение этапов настройки и сборки в один этап.

  2. Локальный кэш npm на машинах компоновщика. Быстрее npm install раз. Или используйте личный реестр прокси-серверов npm (например, Nexus / Artifactory)

  3. Проверьте, находятся ли основной компьютер gitlab и сборщики в одной сети, поэтому загрузка / выгрузка будет быстрее

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