You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitLab缓存是否全局?如何实现Spring+Angular项目缓存全局共享?

问题背景与疑问

我们有一个Spring+Angular应用,已经在gitlab-ci.yml中添加了以下配置,尝试缓存gateway/node_modules:

build:
  stage: build
  script:
    - mvn $MAVEN_CLI_OPTS clean install -Dmaven.test.skip=true -P prod
  artifacts:
    expire_in: 800 mins 0 sec
    paths:
      - gateway/target/app.jar
      - gateway/target/Dockerfile
      - gateway/src/main/docker
  cache:
    key: "${CI_JOB_NAME}"
    paths:
      - gateway/node_modules # cache based on files and directories inside node_modules
    policy: pull-push
  rules:
    - if: '$CI_PIPELINE_SOURCE == "push" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != "master" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != "develop"'
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
    - if: '$CI_PIPELINE_SOURCE != "push" && $CI_PIPELINE_SOURCE != "merge_request_event" && $CI_COMMIT_REF_NAME == "master"'
    - if: '$CI_PIPELINE_SOURCE != "push" && $CI_PIPELINE_SOURCE != "merge_request_event" && $CI_COMMIT_REF_NAME == "develop"'

但我们的Runner都运行在Docker容器中,缓存存储在Runner的本地卷里,导致只有使用同一Runner的流水线才能利用缓存。想知道有没有办法实现全局缓存?

实现GitLab CI全局缓存的方法
  • 配置GitLab分布式缓存后端:GitLab支持将缓存存储在服务器端的分布式存储(如Redis、AWS S3、Google Cloud Storage等),只要管理员完成后端缓存服务的配置,所有Runner都会自动接入这个全局缓存池,无需修改现有gitlab-ci.yml的缓存规则,同key的缓存就能被所有流水线共享。
  • 统一缓存key并验证Runner配置:如果已经配置了分布式缓存后端,确保缓存key是全局通用的(比如当前使用的${CI_JOB_NAME},只要同名称的job都用这个key就能共享)。同时检查Runner的config.toml配置文件,确认[runners.cache]部分没有限制为本地存储,而是指向GitLab的分布式缓存服务。
  • 用工件(Artifacts)共享依赖:若不想配置分布式缓存,可将node_modules打包为工件,在后续job或流水线中拉取使用。只需在build job的artifacts.paths中添加- gateway/node_modules,再在需要的job里通过dependencies或needs引入该工件即可,注意合理设置工件过期时间。
  • 使用依赖代理加速:配置npm私有镜像(如Verdaccio)或GitLab内置的依赖代理,让所有流水线直接从代理拉取依赖,避免重复下载,也能达到类似全局缓存的效果,且不依赖CI缓存机制。

内容的提问来源于stack exchange,提问作者user19577108

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:48:21