GitLab CI Cache 和 Artifacts 有什么区别?流水线提速别用错
Cache 用于复用依赖和中间缓存,Artifacts 用于传递构建结果。理解两者区别,可以让 CI/CD 更快也更可靠。
GitLab CI 里,Cache 和 Artifacts 都能保存文件,所以很多人会混用。结果常见问题是:依赖缓存没命中、构建产物丢失、流水线变慢,或者不同分支互相污染。
简单说,Cache 是为了提速,Artifacts 是为了交付。
Cache 适合什么
Cache 适合保存可复用、可重新生成的内容,例如包管理器缓存、编译缓存、依赖下载目录。Cache 不应该保存唯一构建结果,因为它可能被清理、覆盖或命中失败。
例如 Node 项目可以缓存 npm cache,Java 项目可以缓存 Maven 仓库,Go 项目可以缓存 module cache。
Artifacts 适合什么
Artifacts 适合保存当前流水线产生的结果,例如前端 dist/、测试报告、覆盖率报告、构建后的二进制文件。下游 job 需要使用这些结果时,应该通过 artifacts 传递。
Artifacts 通常有明确过期时间,也可以被用于下载、审计和发布。
常见错误
第一,把 node_modules 作为 artifacts 传来传去,导致流水线很慢。
第二,把构建产物放进 cache,结果偶尔拿到旧文件。
第三,所有分支使用同一个 cache key,导致依赖互相污染。
第四,没有区分锁文件变化。依赖锁文件变化时,cache key 应该变化。
建议
设计流水线时,先画出每个 job 的输入和输出。能重新生成的是 cache,需要向后传递的是 artifacts。这样 CI/CD 结构会清楚很多。
