GitHub Actions 中如何让多个 job 共享同一个缓存?

端木欧辰 阅读 47

我在 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
我来解答 赞 9 收藏
二维码
手机扫码查看
2 条解答
雨涵(打工版)
你在 GitHub Actions 里遇到的问题确实有点棘手,不过好在有解决办法。你说的 cache key 一致理论上是可以共享缓存的,但实际上有时候会因为一些细节问题导致缓存没有被正确命中。

首先确认一下,你的两个 job 是在同一个 workflow 文件里定义的吗?如果是这样,那应该是可以共享缓存的。你已经设置了相同的 key,看起来没有问题。

但是,需要注意的是,actions/cache 默认只会复用当前 job 之前的缓存,而不会复用其他 job 的缓存。虽然同一个 workflow 里的 job 之间可以共享缓存,但有时候可能需要手动调整下策略。

你可以试试在 build job 完成后,使用 actions/cacherestore-keys 参数来确保缓存被正确保存。然后在 test job 里,确保它先尝试恢复这个缓存。

这里有一个调整后的示例,供你参考:

jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Cache node modules
uses: actions/cache@v3
with:
path: ~/.npm
key: npm-cache-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
npm-cache-
# ... install and build steps

test:
needs: build # 确保 test 在 build 之后运行
runs-on: ubuntu-latest
steps:
- name: Restore node modules cache
uses: actions/cache@v3
with:
path: ~/.npm
key: npm-cache-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
npm-cache-
# ... install and test steps


注意 needs: build 这一行,它确保 test job 在 build job 之后运行。这样可以确保 build job 有机会缓存依赖,然后 test job 可以恢复这个缓存。

希望这能帮到你,省去每次都重新装依赖的麻烦。
点赞
2026-03-21 22:05
Air-美美
问题很简单:你缓存的路径不对。

你缓存的是 ~/.npm,但实际需要缓存的是 node_modules 目录。npm 的全局缓存和项目依赖是两码事。

改一下 path 就好了:

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/cache@v3
with:
path: node_modules
key: npm-cache-${{ hashFiles('**/package-lock.json') }}
- run: npm install
- run: npm run build

test:
runs-on: ubuntu-latest
needs: build
steps:
- uses: actions/checkout@v4
- uses: actions/cache@v3
with:
path: node_modules
key: npm-cache-${{ hashFiles('**/package-lock.json') }} - run: npm install
- run: npm test


不过更省心的做法是用 actions/setup-node,它自带缓存功能,只需要加一行 cache: 'npm' 就行:

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm install
- run: npm run build

test:
runs-on: ubuntu-latest
needs: build
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm install
- run: npm test


这样不用手动配 cache action,setup-node 会自动处理缓存的读写,key 也是基于 package-lock.json 生成的,完全不用你操心。
点赞
2026-03-20 10:07