依赖缓存
actions/cache、Maven .m2、npm node_modules。
依赖缓存
这一课你将能做到
- 说明为什么每次 CI 重下 Maven/npm 依赖又慢又费分钟数,以及缓存命中/未命中分别意味着什么
- 用
actions/setup-java的cache: maven与actions/setup-node的cache: npm为本站 monorepo 两侧加速 - 读懂
hashFiles('…/pom.xml'|lock)作 cache key 的失效逻辑,并知道哪些目录不该缓存
为什么要学
干净 runner 上没有你本机积攒的 ~/.m2 仓库或 npm 缓存。没有缓存时,每次 npm ci、每次 Maven 解析都像「第一次下载依赖宇宙」,日志刷屏、分钟数飙升。
缓存不是魔法:key 对了才命中;依赖变了应主动失效,否则会用到旧依赖,出现「本地更新了、CI 却像没更新」的诡异现象。
本课学会官方推荐的 setup-* 内置缓存,并理解底层 actions/cache 的 key 思维——后者在缓存任何非依赖目录(如构建工具链)时都要用。
先建立图像
第一次跑 CI
下载依赖 → 按key写入缓存后端
构建…
第二次跑(pom / lock 未变)
同一 key 命中 → 恢复缓存 → 下载很少 → 构建更快
pom / package-lock 变了
key 变了 → 未命中 → 重新下载 → 写入新 key
人话:缓存像快递柜格子。锁文件没变就开同一格取包裹;锁文件变了就换新格子,避免拿到过期货。
| 工具 | 常见缓存什么 | 推荐入口 |
|---|---|---|
| Maven | ~/.m2/repository | setup-java → cache: maven |
| npm | npm 全局缓存目录 | setup-node → cache: npm + lock 路径 |
| 通用 | 任意 path | actions/cache@v4 |
跟着做
步骤 1:先看「无缓存」基线(可选但推荐)
临时用最简 Node job(无 cache)跑一次,记下 npm ci 耗时。有基线才知道后面省了多少——否则容易主观感觉「好像快了」。
步骤 2:为 platform 打开 npm 缓存
jobs:
platform:
runs-on: ubuntu-latest
defaults:
run:
working-directory: platform
steps:
- uses: actions/checkout@v4
- name: 安装 Node 并缓存 npm
uses: actions/setup-node@v4
with:
node-version: "20"
# 让 setup-node 按 lockfile 管理缓存
cache: npm
cache-dependency-path: platform/package-lock.json
- run: npm ci
第二次跑:Cache 相关 step 应出现 cache hit,npm ci 时间明显缩短。
步骤 3:为 backend 打开 Maven 缓存
jobs:
backend:
runs-on: ubuntu-latest
defaults:
run:
working-directory: backend
steps:
- uses: actions/checkout@v4
- name: 安装 JDK 并缓存 Maven 仓库
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "21"
cache: maven
- run: |
chmod +x mvnw
./mvnw -B verify