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

ev7lccsx  于 2022-11-24  发布在  Git
关注(0)|答案(2)|浏览(678)

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

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

我不确定我这样做对不对。

oxosxuxt

oxosxuxt1#

这取决于您是要使用npm install(又名npm i)还是要使用npm ci
npm install将首先查找现有的node_modules文件夹并重用该文件夹。如果没有,将提取依赖项。请检查完整算法。
npm ci,而是删除现有的node_modules文件夹以执行依赖项的全新安装。
简而言之,使用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 ci具有面向CI的特性,使用这些特性可能会很有趣,但如果没有任何好处,您只需缓存node_modules并使用npm install

s4n0splo

s4n0splo2#

无论您选择哪种解决方案,都应该使用npm ci而不是npm install
在GitLab推荐的方法中:

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

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

您正在缓存npm安装您的项目(并有效创建node_modules)所需的所有文件。后续作业将运行before_script(npm ci)并从缓存中重新生成node_modules。如果缓存存在,这将更快。
这种方法的主要优点是灵活性。缓存是 * 真正 * 可选的。如果它不能正确下载或者因为一些TTL而不存在(也许你正在重新运行一个作业),使用npm ci的流水线阶段将从互联网上获取所有必要的文件。操作参数是--prefer-offline
您可以使用后一种方法编写一种具有弹性的方法,但它会更加复杂。

    • EDIT**修改我的答案。我怀疑后一种方法更快,因为你不需要在每个阶段重新构建node_modules/。虽然我还没有验证这一点。

相关问题