我有一个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.lock
和package.json
运行的任何未来作业都将使用新的缓存,而不是重建依赖关系。
更多信息:https://docs.gitlab.com/ee/ci/yaml/#cachekeyfiles
还要确保在CI作业中始终使用--frozen-lockfile
标志。(或npm ci
(常规的npm install
或yarn 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/