Удобный способ кеширования Node.js зависимостей в GitLab CI / CD - PullRequest
3 голосов
/ 20 июня 2020

Я использую npm для установки Node.js зависимостей в моем проекте. Я хочу кэшировать Node.js пакеты (node_modules) глобально, чтобы ускорить выполнение задач в конвейерах при развертывании в Heroku. Пример из официального docs GitLab:

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
  - .npm/

before_script:
  - npm ci --cache .npm --prefer-offline

А вот еще пример в GitLab:

cache:
  paths:
    - node_modules/

Нашел несколько статей ( Развернуть Node.js приложение с GitLab CI / CD , Непрерывная интеграция с Node.js, Heroku и GitLab CI / CD -Part 2 ), в котором использовалась вторая конфигурация выше. Я попробовал, и мне удалось успешно развернуть свое приложение на Heroku с этими настройками. Но я не уверен, что механизм кеширования работает правильно.

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

Моя текущая настройка для gitlab-ci.yml файла:

image: node:latest

cache:
  paths:
    - node_modules/

stages:
  - build
  - deploy

build:
  stage: build
  script:
    - npm i
    - npm i -g gulp-cli
    - gulp build

deploy:
  image: ruby:latest
  stage: deploy
  script:
    - apt-get update -qy
    - apt-get install -y ruby-dev
    - gem install dpl
    - dpl --provider=heroku --app=$HEROKU_APP_NAME --api-key=$HEROKU_API_KEY
  only:
    - master

Не уверен, что делаю это правильный путь.

1 Ответ

0 голосов
/ 22 июля 2020

Это зависит от того, хотите ли вы использовать npm install, иначе npm i, или npm ci.

npm install сначала будет искать существующую папку node_modules и использовать его повторно. Если нет, будет извлечен список зависимостей. Проверьте алгоритм полный .

npm ci вместо этого удаляет существующую папку node_modules, чтобы выполнить чистую установку зависимостей. Из docs :

Короче говоря, основные различия между использованием npm install и npm ci заключаются в следующем:

  • Проект должен иметь существующие package-lock.json или npm-shrinkwrap.json.
  • Если зависимости в блокировке пакета не совпадают с зависимостями в пакете. json, npm ci завершится с ошибкой вместо обновления блокировки пакета.
  • npm ci может устанавливать только проекты целиком: отдельные зависимости не могут быть добавлены с помощью этой команды.
  • Если node_modules уже присутствует, он будет автоматически удален до начала npm ci его установка.
  • Он никогда не будет записывать в package.json или любую из package-locks: установки по существу заморожены.

Некоторые тесты, имеющие ~/.npm и node_modules заполнено:

$ npm i --prefer-offline
#...
updated 2 packages in 17.472s

$ rm -rf ~/.npm/ # removes global npm cache
$ npm i --prefer-offline
#...
up to date in 16.271s # removing npm cache does not affects to npm i

$ rm -rf node_modules/
$ npm i --prefer-offline
#...
added 2525 packages from 1197 contributors in 55.388s # removing node_modules affetcs to npm i
$ npm ci --prefer-offline
#...
updated 2 packages in 17.201s

$ rm -rf ~/.npm/ # removes global npm cache
$ npm ci --prefer-offline
#...
added 2532 packages in 48.362s # removing npm cache affects to npm ci

$ rm -rf node_modules/
$ npm ci --prefer-offline
#...
added 2532 packages in 18.695s # removing node_modules does not affetcs to npm ci

Итак, в итоге npm ci имеет функции, ориентированные на CI, которые могут быть интересны для использования, но если для вас нет преимуществ, просто кешируйте node_modules и используйте npm install вместо этого.

...