CI 缓存应该只影响速度,不能影响构建结果。缓存键过宽会复用不兼容依赖,过窄则几乎没有收益。
设计缓存键
缓存键至少包含操作系统、运行时版本、包管理器和锁文件摘要。分支名可以作为回退层,但不应成为唯一键。
cache-v3-linux-node22-${LOCKFILE_HASH}
依赖下载缓存与编译输出分开管理。前者通常安全复用,后者需要包含编译器、构建参数和源码摘要。
固定依赖
CI 使用 lockfile 的严格安装模式,禁止构建过程中隐式更新版本。基础镜像和工具链也使用固定版本或 digest。
缓存失效
缓存格式升级时修改显式版本前缀。出现疑似污染时先禁用缓存重跑,比较制品哈希和依赖树。
验证可复现性
定期在空缓存环境构建两次,比较产物摘要。构建时间、随机 ID 和文件排序应被规范化,确保相同输入得到相同输出。