GitHub Actions 中如何让多个 job 共享同一个缓存?
我在 GitHub Actions 里写了两个 job,分别跑 build 和 test,但它们都依赖 node_modules。我试过在每个 job 里单独加 actions/cache,结果缓存没复用上,每次都要重新装依赖,特别慢。
看文档说 cache key 一致就能共享,但我这两个 job 的 key 都设成一样的了,还是不行。是不是 job 之间默认不能共享缓存?得怎么配置才行?
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/cache@v3
with:
path: ~/.npm
key: npm-cache-${{ hashFiles('**/package-lock.json') }}
# ... install and build
test:
runs-on: ubuntu-latest
steps:
- uses: actions/cache@v3
with:
path: ~/.npm
key: npm-cache-${{ hashFiles('**/package-lock.json') }}
# ... install and test
首先确认一下,你的两个 job 是在同一个 workflow 文件里定义的吗?如果是这样,那应该是可以共享缓存的。你已经设置了相同的 key,看起来没有问题。
但是,需要注意的是,
actions/cache默认只会复用当前 job 之前的缓存,而不会复用其他 job 的缓存。虽然同一个 workflow 里的 job 之间可以共享缓存,但有时候可能需要手动调整下策略。你可以试试在
buildjob 完成后,使用actions/cache的restore-keys参数来确保缓存被正确保存。然后在testjob 里,确保它先尝试恢复这个缓存。这里有一个调整后的示例,供你参考:
注意
needs: build这一行,它确保testjob 在buildjob 之后运行。这样可以确保buildjob 有机会缓存依赖,然后testjob 可以恢复这个缓存。希望这能帮到你,省去每次都重新装依赖的麻烦。
你缓存的是
~/.npm,但实际需要缓存的是node_modules目录。npm 的全局缓存和项目依赖是两码事。改一下 path 就好了:
不过更省心的做法是用
actions/setup-node,它自带缓存功能,只需要加一行cache: 'npm'就行:这样不用手动配 cache action,setup-node 会自动处理缓存的读写,key 也是基于 package-lock.json 生成的,完全不用你操心。