【问题标题】:How to have a "cache per package.json" file in GitLab CI?如何在 GitLab CI 中有一个“每个 package.json 的缓存”文件?
【发布时间】:2019-04-27 12:54:20
【问题描述】:

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

GitLab CI 有一个“Cache”功能,可以缓存 Job 的特定产品,这样可以避免将来在同一 Pipeline 中运行 Job,而是使用缓存的产品。

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

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

我想要一个缓存“每个 package.json”。即只有package.json的内容发生变化,缓存键才会变化,npm install才会运行。

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

【问题讨论】:

  • 一个很好的问题。做着同样的梦!
  • 现在好像不可能,但是对应的feature request已经存在了。

标签: caching gitlab gitlab-ci


【解决方案1】:

对于该行为,使用带有静态缓存名称的 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-cachinghttps://docs.gitlab.com/ee/ci/caching/

【讨论】:

    【解决方案2】:

    现在可以从 Gilab Runner v12.5 开始

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

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

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

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

    【讨论】:

    • 你也可以为这个缓存添加前缀docs.gitlab.com/ee/ci/yaml/README.html#cachekeyprefix得到类似my-test-cache-123456-files-hash的东西
    • 您选择package.json 超过package-lock.jsonyarn.lock 有什么原因吗?
    • 嗨@justinvdk。好问题,使用锁定文件更适合在 CI 中使用--frozen-lockfile 标志进行缓存。我已经更新了答案。
    • files关键字下可以使用通配符吗?我正在考虑(对于 dotnet)类似 modules/*/*.csproj?
    • 我相信你可以在那里使用通配符。但是有最大文件限制。我不再积极使用 Gitlab。但我认为您可以在他们的文档网站上找到必要的文档。祝你好运。
    猜你喜欢
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 2016-03-13
    相关资源
    最近更新 更多