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
相关产品推荐
相关产品推荐

