构建缓存结合CI工具实现增量构建的核心在于复用中间产物,关键在缓存命中与复用:依赖层缓存需持久化包管理目录并统一路径;构建层缓存需Webpack/Vite/ccache等配置文件系统级持久化;镜像层缓存须启用BuildKit配合--cache-from/--cache-to推拉远程registry;Monorepo需结合Git diff与workspace-aware工具精准触发变更子项目。
构建缓存结合 ci 工具实现增量构建,核心在于让每次流水线运行能复用之前构建产生的中间产物(如依赖包、编译对象、打包产物),避免重复下载、编译或打包。关键不在于“有没有缓存”,而在于“缓存能否被正确命中并复用”。
依赖层缓存:让包管理器不重下
CI 工具需为 npm/yarn/pnpm/Go mod 等提供持久化缓存目录,并在作业间保持路径一致。
- GitHub Actions 中用
actions/cache指定缓存 key(如node-${{ hashFiles('package-lock.json') }}),自动保存和恢复node_modules或~/.pnpm-store - GitLab CI 使用
cache:配置,按文件路径缓存(如key: $CI_COMMIT_REF_SLUG+paths: [node_modules]),注意需配合restore_cache和save_cache步骤逻辑 - 对 Go 项目,需显式挂载
~/.cache/go-build和~/go/pkg/mod到同一路径,否则 BuildKit 默认无法继承
构建层缓存:让工具跳过未变代码
Webpack/Vite/Vue CLI 等前端工具默认支持内存或文件系统缓存,但 CI 中需启用持久化输出。
- Vite 项目开启
build.cache并指定cacheDir(如.vite-cache),再通过 CI 缓存该目录 - Webpack 可配置
cache.type = 'filesystem',并确保cache.buildDependencies包含配置文件变更(如webpack.config.js) - C++ 项目用
ccache时,需在 CI runner 环境预装,并设置环境变量:CC="ccache gcc"、CXX="ccache g++",同时挂载统一的CCACHE_DIR
镜像层缓存:让 Docker 构建真正分层复用
Docker 默认构建无法跨流水线复用 layer,必须借助 BuildKit + 缓存挂载或远程 registry 缓存导出。
- 启用 BuildKit:
export DOCKER_BUILDKIT=1,并在docker build中加--cache-from和--cache-to - 推荐用
type=registry模式,将缓存推送到私有镜像仓库(如 Harbor),下次构建直接拉取对应 layer - 关键技巧:把依赖安装(
npm install、go mod download)单独成层,且放在源码 COPY 之前,确保依赖不变时该层完全复用
Monorepo 场景下的精准增量
单一仓库多项目时,不能只靠全局缓存,还需识别变更范围。
- 用
nx affected:build或turborepo run build自动分析 Git diff,仅触发受影响的 package 构建 - CI 中先执行
git diff --name-only $CI_PIPELINE_SOURCE_SHA $CI_COMMIT_SHA,提取变更文件,再匹配对应子项目 - 配合 workspace-aware 缓存(如 Turborepo 的远程缓存服务),不同分支/PR 的相同输入可跨环境共享构建结果

















