|
springzDec 29, 2019
1
是的,所以大部分 CI/CD 工具都可以设置 cache 策略。
我这里是直接通过 nfs 挂载。 |
|
springzDec 29, 2019
2
编译 Android 将近 1G 的 .gradle
|
|
ayase252Dec 29, 2019 via iPhone
3
一般而言会有某种依赖的 cache 机制
|
|
cz5424Dec 29, 2019 via iPhone
4
提前 npm install 打包成镜像,然后用这个镜像来 ci/cd
|
|
locozDec 29, 2019
5
加缓存啊
|
|
6
之前研究过, 最简单的办法就是在 npm install 之前判断一下 package.json 是否被修改过了, 如果没有就不需要 install 了。
当然这么做的前提是你每次 npm install 的文件夹是可以在下一个 build 周期可见的, 类似每次用 docker 镜像的话你需要创建一个共享磁盘挂载上去。 但我觉得 ci 最好不要有状态, 每次都重新构建可以避免一起奇怪的问题, 同时也保证了构建的可复现。 所以最后的解决方案是在局域网内部搭建了一个缓存服务器 nexus, 用于缓存 npm/maven 的包, 这样可以极大的缩短构建时 install 的时间。 但是这任然需要大量的磁盘 IO,npm install 一次几万个包都是正常现象, 所以还要优化的话就需要 1. 换固态磁盘 2. 使用内存文件系统 我目前用的是 2, 构建速度已经很快了 |
|
messagebusDec 29, 2019 via iPhone
7
npm ci
|
|
8
利用 Docker 的缓存:
ADD package.json . RUN npm install ADD . . package.json 不变 Docker 就不会重新运行 npm install |
|
RwingDec 29, 2019
9
这就是为什么很多 dockfile 都先 copy package.json 的原因,docker 自己有缓存,如果 package.json 没有变化的话。
|
|
KnightYoungDec 29, 2019
10
@lihongjie0209 #6 应该是判断 lock 文件吧?
|
|
ChingimDec 29, 2019 via Android
11
缓存 node_modules,然后在缓存的基础上 npm install,一般在 10 秒以内。
|
|
rockyou12Dec 29, 2019
12
用 yarn 就是了,npm 本来就是设计傻逼了
|
|
indevDec 29, 2019
15
CI 设置好 cache,npm i 秒秒钟
|
|
connectionDec 29, 2019
16
优先 cache 呗
|
|
springzDec 29, 2019
17
nfs 做一台缓存机,容器直接挂载也很方便的。
|
|
OpportunityDec 29, 2019
18
不是应该运行 npm ci 的吗?怎么都在用 npm install
|
|
wangyzjDec 29, 2019
19
yarn
|
|
orviceDec 30, 2019
20
如果用 docker 的话 有 cache
|
|
sekiDec 30, 2019
21
@Opportunity npm ci 的原理是删掉 node_modules 然后重新安装一遍,对 node_modules 文件夹做的缓存就没意义了
|
|
sekiDec 30, 2019
22
可以自己内部搭一个 npm 源, nuxus 或者 verdaccio ——不过 postinstall 就没办法了
ci 能设置缓存的话也可以缓存一下 node_modules |
|
dcalskyDec 30, 2019 via Android
23
想知道 go 和 python 都是怎么搞的
|
|
LanayaaaDec 30, 2019
24
可以根据 yarn.lock 生成一个对应 node_modules 的缓存包。
|
|
bllessDec 30, 2019 via Android
25
@dcalsky go 设计之初就考虑了快速编译,本机编译还有缓存优化。但是走 ci 也是重头编译。另外就是 go 的依赖很轻,直接 vendor 跟项目集成就可以。所以也不用下载。
python 也要下载,但是应该没有依赖地狱,具体也不太清楚了。要加速也得用 docker 那样做缓存。 |
|
gkiwiDec 30, 2019
26
残暴的方法,就是把 node_module 打成 tar 包,然后。。
=== 最初设计的方式也是基于 package.json md5 之类搞,但是越想越复杂,比如多人共享时候怎么办,最终偷懒了、、 |
|
conn4575Dec 30, 2019 via Android
27
go 和 python 也有类似的问题,不过依赖不像 node 这么恐怖,所以不明显,最佳方案还是使用 docker 这样的方式
|
|
Trim21Dec 30, 2019 via Android
28
@dcalsky
python 安装使用 pip install --user,然后把整个.local 文件夹缓存下来 或者用虚拟环境,把 venv 缓存下来(这个遇到过缓存里面的 python 突然没法用的情况)。 或者单纯的把 pip 的 http 缓存存下来,但这样每次还是要重新安装一遍,太慢了。 |
|
pmispigDec 30, 2019
29
我的方案
1: 把主要几个项目的 package.json add,npm install 在用户目录生成缓存,把这个做成基础镜像 2: 项目在基础镜像的基础上,构建时,将外部目录 node_modules 挂载进来 3:校验 package.json 的 md5 值,如果不变,就直接 build.变了就 install |
|
vevlinsDec 30, 2019 via iPhone
30
我提一个问题,按照上面说的各种 package.json 不变就不重新构建,无法依靠 semantic 版本号进行小版本的自动更新了。
|
|
KuroNekoFanDec 30, 2019
32
npm 本身就有 cache 啊...
|
|
lewinlanDec 31, 2019 via Android
35
本地 runner 可以用 docker-volume 做缓存
|
|
leohxjJul 5, 2020
36
利用 Docker Layer 缓存特性, 把 install 相关的文件单独 COPY
``` COPY package.json yarn.lock RUN yarn install --frozen-lockfile ``` |