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

时间:2018-11-25 20:27:48

标签: caching gitlab gitlab-ci

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

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

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

GitLab Docs suggests使用${CI_COMMIT_REF_SLUG}作为缓存键来实现。但是,这意味着“按分支缓存”,我想对此进行改进。

我想要一个缓存“ per package.json”。也就是说,仅当package.json的内容发生更改时,缓存密钥才会更改,npm install将运行。

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

2 个答案:

答案 0 :(得分:0)

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

如果您需要阅读以下内容以正确设置跑步者中的缓存,请执行以下操作: https://docs.gitlab.com/runner/configuration/autoscale.html#distributed-runners-caching https://docs.gitlab.com/ee/ci/caching/

答案 1 :(得分:0)

从Gilab Runner v12.5开始,这已经成为可能

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

这意味着高速缓存key将是根据更改了给定文件的最新提交(最多两个,如果列出了两个文件)计算出的SHA校验和。只要这些文件之一发生更改,就会计算新的缓存键并创建新的缓存。将来任何使用与Gemfile.lock相同的package.jsoncache:key:files运行的作业都将使用新的缓存,而不是重建依赖关系。

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