Gitlab 管道:如何仅在依赖项发生变化时才重新缓存节点模块?

Gitlab pipeline: How to recache node modules only when dependency changed?

我正在使用 cache 对 Gitlab 管道进行性能调优。

这是一个使用 npm 进行依赖管理的 nodejs 项目。我已使用以下设置将 node_modules 文件夹放入缓存以供后续阶段使用:

build:
  stage: build
  only:
    - develop
  script:
    - npm install
  cache:
    key: $CI_COMMIT_REF_SLUG
    paths:
      - node_modules/

首先,将缓存放在全局级别。这将确保作业共享相同的缓存。

其次,您可以使用 GitLab 12.5 引入的 cache:key:files 仅在 package.json 更改时重新创建缓存。

cache:
    key:
        files:
          - package.json
    paths:
      - node_modules/

build:
  stage: build
  only:
    - develop
  script:
    - npm install

更多信息:
https://docs.gitlab.com/ee/ci/yaml/#cachekeyfiles

其他提示:

  • 您可能想查看 package-lock.json 而不是 package.json
  • 我建议阅读 cache mismatch chapter in the documentation 以确保您不会 运行 陷入可能无法恢复缓存的常见问题。
  • 除了简单地添加 npm install,您还可以在从缓存重新创建 node_modules 文件夹时跳过此步骤。如果 node_modules 文件夹不存在,则 bash 添加到 npm install 后只会 运行 命令。
build:
  stage: build
  only:
    - develop
  script:
    - if [ ! -d "node_modules" ]; then npm install; fi