如何在GitLab CI中具有“每个package.json缓存”文件?

uri*_*rig 7 caching gitlab gitlab-ci

我有一个使用GitLab CI构建,测试和部署的Vue Web应用程序。

GitLab CI具有“ 缓存 ”功能,可以在其中缓存作业的特定产品,从而可以避免该作业在同一管道中的未来运行,而可以使用缓存的产品。

我想通过缓存node_modules目录来提高工作流程的性能,以便可以在管道之间共享目录。

GitLab文档建议使用${CI_COMMIT_REF_SLUG}作为缓存键来实现这一目标。但是,这意味着“每个分支都缓存”,我想对此进行改进。

我想要一个缓存“ per package.json”。即,仅当内容package.json发生变化时,缓存键npm install才会更改并运行。

我当时正在考虑使用package.json文件内容的哈希值作为缓存键。使用GitLab CI可以做到吗?如果是这样,怎么办?

Shi*_*r G 9

从 Gilab Runner v12.5 开始,这现在是可能的

cache:
  key:
    files:
      - Gemfile.lock
      - package-lock.json // or yarn.lock
  paths:
    - vendor/ruby
    - node_modules
Run Code Online (Sandbox Code Playgroud)

这意味着缓存key将是根据更改给定文件的最近提交(最多两个,如果列出两个文件)计算得出的 SHA 校验和。每当这些文件之一发生变化时,就会计算一个新的缓存键并创建一个新的缓存。任何未来的作业都使用相同的Gemfile.lockpackage.jsonwith运行,cache:key:files将使用新的缓存,而不是重建依赖项。

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

还要确保--frozen-lockfile在 CI 作业中使用 always标志。(或npm ci) 常规npm installyarn install / yarn命令生成新的锁定文件,您通常不会注意到它,直到您再次安装软件包。从而使您的构建工件和缓存不一致。


jwi*_*ker 5

对于该行为,请使用only:changes带有静态缓存名称的参数。

前任:

install:
  image: node:latest
  script:
    - npm install
  cache:
    untracked: true 
    key: npm  #static name, can use any branch, any commit, etc..
    paths:
      - node_modules
  only:  #Only execute this job when theres a change in package.json
    changes:
      - package.json
Run Code Online (Sandbox Code Playgroud)

如果您需要阅读本文以在跑步者中正确设置缓存:https : //docs.gitlab.com/runner/configuration/autoscale.html#distributed-runners-caching https://docs.gitlab.com/ee/ci/caching /