【问题标题】:Convenient way to cache Node.js dependencies in GitLab CI/CD在 GitLab CI/CD 中缓存 Node.js 依赖项的便捷方式
【发布时间】:2020-10-10 22:23:50
【问题描述】:

我正在使用npm 在我的项目中安装 Node.js 依赖项。我想在部署到 Heroku 时全局缓存 Node.js 包 (node_modules) 以加快管道中的作业。来自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

不确定我的做法是否正确。

【问题讨论】:

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


    【解决方案1】:

    这取决于您是要使用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

    【讨论】:

    • 感谢您的详细解答。好的,我现在知道npm inpm ci 之间的区别了。但是请看一下我当前的设置(gitlab-ci.yml 文件),在我的情况下哪一个最方便?或者我什至需要缓存它?因为我只有两个阶段。我在第一阶段使用node_modules
    猜你喜欢
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    相关资源
    最近更新 更多