首页/开发/CI/CD 与发布速查/缓存策略与失效控制(policy)
流水线设计54 条

缓存策略与失效控制(policy)

通过 pull / push / pull-push 控制缓存读写角色:由受信任的作业负责写缓存,其余只读,降低污染面。

CI/CD 与发布速查开发更新于 2026-10-13

缓存策略是什么

CI 缓存通过 pull / push / pull-push 控制读写角色:受信任的作业负责写缓存,其余作业只读,降低污染面。缓存是用一致性换速度:跳过重复下载与编译,但缓存内容错了,构建结果就会错——所以键设计、失效策略与写入权限都是治理点。GitLab 的 cache:policy 与 GitHub 缓存的分支隔离规则是两种典型实现。

基本信息

GitLabcache:policy 可选 pull、push、pull-push(默认)
GitHub缓存按分支隔离,但默认分支的缓存可被其他分支(含 PR)恢复
失效手段改键前缀、调整键输入文件、清理缓存
键设计键里放锁文件哈希或工具版本,依赖变化时自动偏离旧缓存

缓存写入权限分配

作业policy理由
默认分支构建push 或 pull-push唯一受信任的缓存源
PR 构建pull不可信代码不能写共享缓存
发布作业pull只消费已验证的缓存
工具链预热push独立低风险缓存键

典型使用场景

  • 依赖安装加速:node_modules、Go 模块、Maven 仓库挂缓存,缩短安装阶段
  • 编译加速:增量编译产物与镜像层结合,减少重复构建
  • 工具链分发:CI 镜像或二进制工具缓存到内网,降低外网依赖
  • 污染控制:只让默认分支写缓存,PR 与外部贡献只读
  • 失效管理:依赖升级时自动切换缓存键,避免读到旧依赖
  • 本地与 CI 共用键命名规范:减少「我这能跑」的环境差异问题

GitLab 只读缓存

GitLab 只读缓存
default:
  cache:
    key: deps-$CI_COMMIT_REF_SLUG
    policy: pull
    paths: [.cache/]

# 仅默认分支允许写缓存
build-main:
  rules: [{if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'}]
  cache:
    policy: pull-push
缓存由不可信代码写入可能被投毒:限制可写缓存的作业范围(例如仅默认分支)。
键的粒度要匹配复用范围:按分支键隔离好、复用面小;带锁文件哈希命中稳定、依赖一变即失效,按步骤取舍。

易错点

  • 所有作业都写同一缓存键:并行写入产生竞态,内容以最后写入者为准
  • 改了缓存结构却不换键:旧结构缓存被新工具读到,出现难以复现的构建差异
  • 缓存当制品库用:构建产物靠缓存传递,节点清理缓存即断链,产物走制品仓库
  • 不加大小与存活控制:缓存无限膨胀占满配额,设置过期策略并定期清理
  • 缓存跨环境串用:测试缓存被生产构建命中,键前缀按环境隔离

数据来源与参考

  • GitLab Docs《Cache:policy》
  • GitHub Docs《Caching dependencies》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌