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

N'B*_*yev 5 node.js npm gitlab gitlab-ci gitlab-ci-runner

我正在使用npm在我的项目中安装 Node.js 依赖项。我想在node_modules全局缓存 Node.js 包 ( ) 以在部署到 Heroku 时加速管道中的作业。GitLab官方文档中的一个示例:

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

before_script:
  - npm ci --cache .npm --prefer-offline
Run Code Online (Sandbox Code Playgroud)

这是GitLab 中的另一个示例

cache:
  paths:
    - node_modules/
Run Code Online (Sandbox Code Playgroud)

发现了一些文章(部署Node.js的应用程序与GitLab CI / CD持续集成用的Node.js,Heroku的和GitLab CI / CD第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
Run Code Online (Sandbox Code Playgroud)

不确定我是否以正确的方式做。

jes*_*gmz 9

这取决于你是否想使用npm install,又名npm i,或者如果你想使用npm ci

npm install将首先查找现有node_modules文件夹并重新使用它。如果没有,将获取依赖项。检查完整的算法

npm ci相反,删除现有node_modules文件夹以执行依赖项的全新安装。来自文档

简而言之,使用npm install和 之间的主要区别npm 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
Run Code Online (Sandbox Code Playgroud)
$ 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
Run Code Online (Sandbox Code Playgroud)

因此,最终,npm ci具有面向 CI 的功能,使用起来可能很有趣,但如果对您没有好处,只需缓存node_modules并使用npm install即可。