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