如何在 GitLab CI 中拥有"cache per package.json"文件?



我有一个Vue web应用程序,它是使用GitLab CI.构建、测试和部署的

GitLab CI具有"缓存"功能,可以缓存作业的特定产品,这样就可以避免将来在同一管道中运行作业,而是使用缓存的产品。

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

GitLab Docs建议使用${CI_COMMIT_REF_SLUG}作为缓存密钥来实现这一点。然而,这意味着"每个分支缓存",我希望对此进行改进。

我想要一个缓存"per-package.json"。也就是说,只有当package.json的内容发生变化时,缓存键才会发生变化,npm install才会运行。

我想使用package.json文件内容的散列作为缓存密钥。GitLab CI可以做到这一点吗?如果是,如何?

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

cache:
key:
files:
- Gemfile.lock
- package-lock.json // or yarn.lock
paths:
- vendor/ruby
- node_modules

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

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

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

对于该行为,请使用带有静态缓存名称的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

如果您需要阅读此内容以在runner中正确设置缓存:https://docs.gitlab.com/runner/configuration/autoscale.html#distributed-runner缓存https://docs.gitlab.com/ee/ci/caching/

最新更新