CI/CD 中如何正确缓存 node_modules 提升构建速度?

树鹤酱~ 阅读 50

我在 GitLab CI 里跑前端项目,每次 install 都要几分钟,想用缓存加速。但配置了 cache 后发现有时候依赖没更新,build 出错。我现在的配置是这样:

cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - node_modules/

是不是应该根据 package-lock.json 来决定缓存是否失效?该怎么改才靠谱?

我来解答 赞 4 收藏
二维码
手机扫码查看
1 条解答
令狐爱书
你说的情况挺常见的,缓存配置不对确实会导致依赖版本不一致的问题。你当前的缓存配置只用了分支名作为缓存 key,这会导致不同分支之间缓存冲突或者同一个分支上的依赖变更无法及时更新缓存。

确实应该根据 package-lock.json 来决定缓存是否失效,这样可以确保每次依赖有变化时都会重新安装最新的包。你可以修改配置如下:

cache:
key: ${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHA}
paths:
- node_modules/


不过这个配置可能会导致每次提交都会重建缓存,稍微有点浪费资源。更好的做法是基于 package-lock.json 的哈希值来生成缓存 key,这样只有当 package-lock.json 文件发生变化时才会重新安装依赖。你可以这样做:

cache:
key: ${CI_COMMIT_REF_SLUG}-${{ hashFiles('package-lock.json') }}
paths:
- node_modules/


但注意 GitLab CI 自身并不支持 ${{ hashFiles() }} 这样的语法,你需要在脚本里手动计算 package-lock.json 的哈希值,并将其设置为环境变量。可以在 .gitlab-ci.yml 文件的 before_script 部分添加如下内容:

before_script:
- npm config set cache /ci-cache
- PACKAGE_LOCK_HASH=$(shasum -a 256 package-lock.json | awk '{print $1}')
- export CACHE_KEY=${CI_COMMIT_REF_SLUG}-${PACKAGE_LOCK_HASH}

cache:
key: ${CACHE_KEY}
paths:
- node_modules/


这样配置之后,只有当你项目的 package-lock.json 文件发生变化时,node_modules 才会被重新安装并缓存起来。希望这样能解决你的问题,调试看看吧。
点赞
2026-03-24 12:14