CI/CD 每次 Build 前都要 npm install 一次吗? 每次安装依赖太浪费时间了

2019-12-29 19:03:07 +08:00
 bologer
11596 次点击
所在节点    DevOps
36 条回复
springz
2019-12-29 19:05:29 +08:00
是的,所以大部分 CI/CD 工具都可以设置 cache 策略。
我这里是直接通过 nfs 挂载。
springz
2019-12-29 19:06:17 +08:00
编译 Android 将近 1G 的 .gradle
ayase252
2019-12-29 19:09:42 +08:00
一般而言会有某种依赖的 cache 机制
cz5424
2019-12-29 19:10:31 +08:00
提前 npm install 打包成镜像,然后用这个镜像来 ci/cd
locoz
2019-12-29 19:13:57 +08:00
加缓存啊
lihongjie0209
2019-12-29 19:19:17 +08:00
之前研究过, 最简单的办法就是在 npm install 之前判断一下 package.json 是否被修改过了, 如果没有就不需要 install 了。

当然这么做的前提是你每次 npm install 的文件夹是可以在下一个 build 周期可见的, 类似每次用 docker 镜像的话你需要创建一个共享磁盘挂载上去。

但我觉得 ci 最好不要有状态, 每次都重新构建可以避免一起奇怪的问题, 同时也保证了构建的可复现。

所以最后的解决方案是在局域网内部搭建了一个缓存服务器 nexus, 用于缓存 npm/maven 的包, 这样可以极大的缩短构建时 install 的时间。

但是这任然需要大量的磁盘 IO,npm install 一次几万个包都是正常现象, 所以还要优化的话就需要
1. 换固态磁盘
2. 使用内存文件系统

我目前用的是 2, 构建速度已经很快了
ccbikai
2019-12-29 19:20:39 +08:00
npm ci
jybox
2019-12-29 19:39:15 +08:00
利用 Docker 的缓存:

ADD package.json .
RUN npm install
ADD . .

package.json 不变 Docker 就不会重新运行 npm install
Rwing
2019-12-29 19:39:18 +08:00
这就是为什么很多 dockfile 都先 copy package.json 的原因,docker 自己有缓存,如果 package.json 没有变化的话。
KnightYoung
2019-12-29 19:44:32 +08:00
@lihongjie0209 #6 应该是判断 lock 文件吧?
Chingim
2019-12-29 20:53:47 +08:00
缓存 node_modules,然后在缓存的基础上 npm install,一般在 10 秒以内。
rockyou12
2019-12-29 20:56:31 +08:00
用 yarn 就是了,npm 本来就是设计傻逼了
optional
2019-12-29 21:04:48 +08:00
@rockyou12 0202 年了
rockyou12
2019-12-29 22:02:06 +08:00
@optional 怎么,难道 npm 还能大改?要是 npm 还是有下一半断掉只能清空 node_modules 这种弱智问题,它就还是 sb
indev
2019-12-29 22:22:56 +08:00
CI 设置好 cache,npm i 秒秒钟
connection
2019-12-29 22:45:35 +08:00
优先 cache 呗
springz
2019-12-29 22:49:47 +08:00
nfs 做一台缓存机,容器直接挂载也很方便的。
Opportunity
2019-12-29 23:09:03 +08:00
不是应该运行 npm ci 的吗?怎么都在用 npm install
wangyzj
2019-12-29 23:51:50 +08:00
yarn
orvice
2019-12-30 00:00:55 +08:00
如果用 docker 的话 有 cache

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/633352

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX