GitLab CI缓存配置

先说说缓存到底是个啥玩意儿。在GitLab CI里,缓存其实就是把流水线中某些目录或文件临时存起来,让后续的job可以直接复用,不用每次都从头下载或编译。比如你有个Java项目,把目录缓存下来,下次构建就能跳过依赖下载;或者前端项目缓存,npm install的时间直接砍半。不过要注意,缓存和制品(artifacts)可不是一码事------制品是job生成的输出文件,会长期存储,而缓存只是临时加速用,可能被后续任务覆盖。

配置缓存主要靠修改文件,用关键字来定义。最简单的写法是指定列表,比如缓存node_modules目录:

这样每个job都会尝试复用这个目录。但问题来了:如果不同分支的依赖版本不一样,混用缓存可能出乱子。所以最好加上字段,用变量来区分缓存版本。比如按分支设置:

这时候是GitLab预定义的环境变量,代表分支名。假如你在feature分支和main分支之间切换,缓存就会自动隔离。

实际项目中,缓存的策略得根据技术栈调整。像Maven项目通常缓存,Gradle项目缓存。不过有些目录体积太大,比如Python的virtualenv,全缓存可能超限,这时候可以只缓存包索引。另外,如果job之间需要共享缓存,得注意的匹配规则。曾经碰到一个坑:测试job和构建job用了不同的key,结果缓存根本没共享,白折腾半天。

进阶用法是结合。默认是模式,即job开始时拉取缓存,结束时推送更新。但如果某个job只是用缓存而不修改,比如代码扫描任务,可以设为策略来提升速度:

反之,如果某个job专门更新缓存(比如安装依赖),可以用策略,不过这种场景比较少。

缓存失效也是个头疼问题。比如依赖更新后,旧缓存可能导致构建失败。这时候可以通过改变来强制刷新,比如把项目版本号加进key:

或者在安装依赖的job里用控制条件,比如只在依赖文件变更时才更新缓存。

最后提醒几个注意点:一是缓存大小有限制(默认每个项目20GB),别把编译输出之类的大文件塞进去;二是多阶段流水线中,缓存可能在并行job间竞争写入,建议用指定依赖文件哈希值来自动更新key。例如用的哈希作为key:

这样只要锁文件没变,就一直用旧缓存。

总之,缓存配置看似简单,但细节决定成败。花半小时调优一下,可能每天能省下几十分钟的构建时间。尤其是微服务项目,十几个仓库都优化一遍,累积的效益相当可观。如果你们团队还在手动清理缓存目录,赶紧把这篇配置方法扔群里试试吧!

相关推荐
Flying pigs~~7 小时前
RAG智慧问答项目
数据库·人工智能·缓存·微调·知识库·rag
许彰午8 小时前
CacheSQL(二):主从复制——OpLog 环形缓冲区与故障自动恢复
java·数据库·缓存
凯瑟琳.奥古斯特14 小时前
Redis是什么及核心特性
前端·css·redis·缓存
手握风云-19 小时前
Redis:不只是缓存那么简单(六)
redis·缓存
行者-全栈开发19 小时前
Linux 核弹级高危漏洞 CVE-2026-31431 完整修复指南
linux·运维·服务器·ci/cd·devops·cve·核弹级高危漏洞
啥都会一点的老程,自在地镜强者19 小时前
【Agent 缓存技术核心差异化】—商业软件壁垒之前缀缓存(二)Codex和Claude code方案比对篇+过度解读
缓存·ai编程
手握风云-21 小时前
Redis:不只是缓存那么简单(五)
缓存
Rust研习社21 小时前
Rust 高性能内存缓存 moka 完全指南
开发语言·后端·缓存·rust
测试那点事儿2 天前
第2章零基础接口自动化到 Jenkins 持续集成【本地环境准备与首次跑通】
ci/cd·自动化·jenkins
快乐非自愿2 天前
Redis--SDS字符串与集合的底层实现原理
数据库·redis·缓存