Только "npm install" в GitLab CI при обновлении package.json

Я использую GitLab CI для проекта, а первый шаг процесса - npm install. Я кэширую node_modules для более быстрого запуска той же работы позже, а также определяю их как артефакты сборки, чтобы использовать их на более поздних этапах. Однако, даже если я кэширую node_modules и обновляюсь, вызывая npm install каждый раз при выполнении задания install_packages требуется много времени, так как команда проходит через все package.json и проверяет наличие обновлений пакетов и т.д. (предположим).

Есть ли способ только запускать npm install в задании install_packages в зависимости от какого-либо условия? Более конкретно (что, по моему мнению, было бы лучшим решением), изменился ли или нет package.json с момента последней сборки?

Ниже приведена соответствующая часть моего файла .gitlab-ci.yml:

image: node:6.9.1

stages:
  - install
  - prepare
  - deploy

install_packages:
  stage: install
  script:
    - npm prune
    - npm install
  cache:
    key: ${CI_BUILD_REF_NAME}
    paths:
      - node_modules/
  artifacts:
    paths:
      - node_modules/
  only:
    - master
    - develop

build_and_test:
  stage: prepare
  script:
    #do_stuff...

deploy_production:
  stage: deploy
  #do_stuff...

deploy_staging:
  stage: deploy
  #do_stuff...

Ответ 1

Установлена ​​ли npm с параметром --cache? Я слышал эту проблему с несколькими бегунами Gitlab CI, которые есть у людей, и это решение чаще всего.

Надеюсь, что это поможет!

Ответ 2

Просто используйте only:changes флаг doc

Работа будет:

install_packages:
  stage: install
  script:
    - npm prune
    - npm install
  cache:
    key: ${CI_BUILD_REF_NAME}
    paths:
      - node_modules/
  artifacts:
    paths:
      - node_modules/
  only:
    refs:
      - master
      - develop
    changes:
      - package.json

Еще один момент: вы правильно установили кеш? Прочитайте это: https://docs.gitlab.com/runner/configuration/autoscale.html#distributed-runners-caching https://docs.gitlab.com/ee/ci/caching/