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

2019-12-29 19:03:07 +08:00
 bologer
11624 次点击
所在节点    DevOps
36 条回复
seki
2019-12-30 00:37:42 +08:00
@Opportunity npm ci 的原理是删掉 node_modules 然后重新安装一遍,对 node_modules 文件夹做的缓存就没意义了
seki
2019-12-30 00:42:47 +08:00
可以自己内部搭一个 npm 源, nuxus 或者 verdaccio ——不过 postinstall 就没办法了
ci 能设置缓存的话也可以缓存一下 node_modules
dcalsky
2019-12-30 01:04:47 +08:00
想知道 go 和 python 都是怎么搞的
PainAndLove
2019-12-30 01:16:05 +08:00
可以根据 yarn.lock 生成一个对应 node_modules 的缓存包。
blless
2019-12-30 01:17:29 +08:00
@dcalsky go 设计之初就考虑了快速编译,本机编译还有缓存优化。但是走 ci 也是重头编译。另外就是 go 的依赖很轻,直接 vendor 跟项目集成就可以。所以也不用下载。
python 也要下载,但是应该没有依赖地狱,具体也不太清楚了。要加速也得用 docker 那样做缓存。
gkiwi
2019-12-30 01:34:46 +08:00
残暴的方法,就是把 node_module 打成 tar 包,然后。。
===
最初设计的方式也是基于 package.json md5 之类搞,但是越想越复杂,比如多人共享时候怎么办,最终偷懒了、、
conn4575
2019-12-30 02:29:24 +08:00
go 和 python 也有类似的问题,不过依赖不像 node 这么恐怖,所以不明显,最佳方案还是使用 docker 这样的方式
Trim21
2019-12-30 07:23:19 +08:00
@dcalsky
python
安装使用 pip install --user,然后把整个.local 文件夹缓存下来

或者用虚拟环境,把 venv 缓存下来(这个遇到过缓存里面的 python 突然没法用的情况)。

或者单纯的把 pip 的 http 缓存存下来,但这样每次还是要重新安装一遍,太慢了。
pmispig
2019-12-30 09:25:28 +08:00
我的方案
1: 把主要几个项目的 package.json add,npm install 在用户目录生成缓存,把这个做成基础镜像
2: 项目在基础镜像的基础上,构建时,将外部目录 node_modules 挂载进来
3:校验 package.json 的 md5 值,如果不变,就直接 build.变了就 install
vevlins
2019-12-30 09:47:38 +08:00
我提一个问题,按照上面说的各种 package.json 不变就不重新构建,无法依靠 semantic 版本号进行小版本的自动更新了。
winiex
2019-12-30 09:53:59 +08:00
总算知道 npmjs.com 上庞大的下载数是怎么来的了= =
KuroNekoFan
2019-12-30 09:54:14 +08:00
npm 本身就有 cache 啊...
dcalsky
2019-12-30 11:55:15 +08:00
@Trim21 缓存.local 之后打包到 docker 里怎么办? add .local 吗?
Trim21
2019-12-30 17:46:25 +08:00
@dcalsky #33 你都用 docker 了,pip install 之后打个镜像不就行了吗
lewinlan
2019-12-31 09:00:02 +08:00
本地 runner 可以用 docker-volume 做缓存
leohxj
2020-07-05 14:59:24 +08:00
利用 Docker Layer 缓存特性, 把 install 相关的文件单独 COPY

```
COPY package.json yarn.lock
RUN yarn install --frozen-lockfile
```

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

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

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

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

© 2021 V2EX