缓存什么最划算
CI 测试提速的缓存分三层:依赖(npm、pip、Maven 本地库)、工具运行时(Playwright 浏览器、构建产物)、构建层(编译输出、Docker 层)。核心是 key 设计——以锁文件的哈希为主键,锁文件一变缓存自动换代。错误缓存的代价比不缓存更高:过期依赖会制造「幽灵失败」。把命中率当指标持续观察,异常波动时先查缓存再查代码。
基本信息
| 依赖缓存 | npm、pip、Gradle 缓存目录,key 用锁文件哈希 |
|---|---|
| 浏览器缓存 | Playwright 浏览器二进制目录,避免每次重新下载 |
| 构建缓存 | 编译中间产物、Docker 分层,跨作业复用 |
| key 设计 | 锁文件哈希加平台与版本前缀,示例见下方片段 |
| 恢复策略 | 精确 key 未命中时按前缀回退,兼容小版本更新 |
| 风险 | 陈旧依赖、被污染的半成品缓存、跨平台二进制混用 |
缓存片段示例
缓存片段示例
- uses: actions/cache@v4
with:
path: ~/.cache/ms-playwright # 缓存浏览器二进制
key: pw-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
# 锁文件变化时 key 自动失效,避免旧依赖引发幽灵失败典型使用场景
- 依赖安装提速:三分钟压到二十秒,流水线周转明显变快
- 浏览器准备提速:几百 MB 的浏览器只下载一次
- monorepo 构建复用:编译缓存跨作业共享
- PR 与主干预热分离:防止不可信代码污染主干缓存
- 命中率监控:命中率骤降说明 key 设计或环境有变动
缓存对象与 key 依据
| 对象 | 典型路径 | key 依据 |
|---|---|---|
| npm | ~/.npm 或 node_modules | package-lock.json 哈希 |
| pip | ~/.cache/pip | requirements 文件哈希 |
| Playwright | ~/.cache/ms-playwright | 版本加锁文件哈希 |
| Gradle | ~/.gradle | 构建脚本与版本哈希 |
缓存里放构建产物要格外小心:key 没跟着代码变,旧产物被复用的「假绿」比失败更危险。
PR 作业默认只读主干缓存不写:不可信代码不污染公共缓存,这是平台的常见策略,利用好它。
缓存体积要控制:拉取比重建还慢的缓存属于负优化,大对象考虑按需裁剪。