依赖缓存实现秒级依赖安装加速 CI 构建

date
Apr 11, 2022
slug
cache-nodemodules-speed-ci-build
status
Published
tags
CI
type
Post
lang
summary
通过手动缓存 node_modules 目录来加速 CI 构建,真滴快(秒级 < 10s)!
但是使用这个缓存是没法减少依赖分析的时间的,所以使用缓存后的安装时间还是比较长。

使用 pnpm

pnpm 在机制上就比 yarn 和 npm 快很多,可以看一下相关测试:https://pnpm.io/benchmarks
notion image
虽然使用 pnpm 能减少构建时间,但是依赖项太多的时候,分析依赖还是需要不少时间,剩下的分析依赖的时间能不能也节省掉呢?答案是可以的。

手动缓存 node_modules

有没有一种方案可以实现 10s 内依赖安装完成?答案是有的,且我们在业务上已经稳定运行两年多了,之前一直想写文章记录一下,一直拖到现在。

解决方案

一句话概括:在满足相同条件时,直接使用之前安装的 node_modules,不需要再运行 yarn install,减少依赖安装和索引需要的时间。

实现原理

  1. 在安装依赖时,先将所有的 package.json 文件进行 hash,获得唯一标识;
  1. 在 cache 中寻找是否有对应的 hash cache,如果有,那么就直接使用此 hash cache,将此 cache 软链到我们的项目中就可以完成依赖安装
  1. 如果发现没有,那么就算首次安装依赖,这次安装是比较慢的;
  1. 将安装完成后的依赖存储到 cache 中,当依赖无变更时,下次安装就可以直接使用 cache;
notion image
给出的思路是最简单的版本,如果你的项目是 monorepo 则还需要考虑多个 package.json 和每个子项目中的 node_modules,如果项目严格使用 lock 文件的话,其实也可以使用 lock 文件来生成 cache hash 值。
当然这些都是细节上的事情,解决起来都很快,主要是这种缓存的想法。实际代码我就不贴了,因为真的不难。

参考

  • 勇神的鬼点子

© CC BY-SAJin 2019 - 2023

Powered by Vercel & Notion