前端CI/CD提效之如何免安装依赖?

226 阅读3分钟

不知道大家在前端资源发布时有没有遇到构建时间长的问题,其中依赖安装耗时占了很大一部分。在gitlab和github的流水线上也给出了一些方法。docs.gitlab.cn/jh/ci/cachi…docs.github.com/zh/actions/… 中都是采用持久化包管理器缓存的方式,来加速依赖安装。这种方式虽然可以提升部分效率,但是还是需要依赖包的解压IO操作。本文分享一种方式,可以将依赖安装时长降为0。

docker volume

一般来说企业的CI/CD流水线都是通过k8s调用机器上的docker来运行构建逻辑的,docker提供了volume能力,可以将宿主机上的目录挂载到docker中。docker volume 是 Docker 容器中用于数据持久化和数据共享的一种机制。与容器不同,卷(volumes)是专门设计来存储和管理数据的,并且它不随容器的创建和销毁而受影响。这意味着使用 Docker 卷,即使容器被删除,卷内的数据也会被保留下来。

Docker 卷有几个关键用途:

数据持久化:将数据存储在卷中,而不是容器的文件系统中,以确保数据的持久性。这对于数据库、文件存储和任何需要保留数据状态的应用都是关键。

数据共享:卷可以被多个容器挂载和访问,这使得不同容器间可以共享数据。

数据安全:卷提供了一种将敏感数据隔离在容器外部的方法,这样即便容器被泄露,存储在卷中的数据也不会轻易暴露。

备份、恢复、迁移:卷可以很方便地进行备份和恢复,也可以迁移到其他系统,这对于数据维护和迁移至关重要。

依赖版本锁定

有了docker volume之后,我们就可以把安装好的node_modules保存在宿主机上。但是保存的node_modules应该将哪一份挂载到docker中,就需要对node_modules设置key值,这个key值对应的应该就是项目中的lock文件的hash值。这样就可以保证node_modules下与lock文件严格对应。

image.png

分区问题

docker volume 虽然可以直接将宿主机的目录挂载到docker中,但是被挂载的目录与工作区属于两个device,如果直接mv或者copy,这样会造成额外的磁盘IO开销,效率低下。因此这里需要进行特殊处理,我们做法是在docker挂载的卷中,创建一个临时工作目录,将这个目录通过mount命令挂载到docker的原工作区。这样我们的缓存就可以随意通过mv移动到工作目录中且没有开销,创建缓存时也没有开销。需要注意的是,需要在任务结束后删除这个临时目录。

image.png

总结

本文主要是借助docker以及磁盘的一些机制,实现了0秒恢复node_modules,从而达到免安装依赖的目的。我的第一篇文章,如果对您有用的话,求个一键三连~