在GitLab CI / CD中缓存Node.js依赖项的便捷方法

时间:2020-06-20 20:01:27

标签: node.js npm gitlab gitlab-ci gitlab-ci-runner

我正在使用npm在我的项目中安装Node.js依赖项。我想全局缓存Node.js软件包(node_modules),以便在部署到Heroku时加快管道中的作业。来自GitLab官方docs的示例:

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

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

这是GitLab中的另一个example

cache:
  paths:
    - node_modules/

找到了一些使用上述第二种配置的文章(Deploy Node.js App with GitLab CI/CDContinuous Integration with Node.js, Heroku and 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 :(得分:0)

这取决于您是要使用npm install(又名npm i,还是要使用npm ci

npm install将首先查找现有的node_modules文件夹并重新使用它。如果不是,将获取依赖项。检查full algorithm

npm ci会删除现有的node_modules文件夹以执行依赖关系的全新安装。来自docs

简而言之,使用npm installnpm ci之间的主要区别是:

  • 项目必须具有现有的package-lock.jsonnpm-shrinkwrap.json
  • 如果程序包锁定中的依赖项与package.json中的依赖项不匹配,则npm ci将退出并显示错误,而不是更新程序包锁定。
  • npm ci一次只能安装整个项目:此命令无法添加单个依赖项。
  • 如果已经存在node_modules,它将在npm ci开始安装之前被自动删除。
  • 它将永远不会写入package.json或任何package-locks:安装实际上是冻结的。

一些填充了~/.npmnode_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