目前 gitlab
配置了 cicd
, 监控 requirement.txt
,一旦该文件有变化,就会触发 stage
进行 docker
镜像 build
, 这期中有进行 pip install -r requirement.txt
的步骤,requirement.txt
里边有接近 100
个库,但可能此次更新就只添加了 1
到 2
个新库,但 CI
是全量重新 install
, 这就意味着每次要安装原有的 100
来个库,再加上新的库,
带来的问题是:
想过解决办法:
100
多个库制作一个新的基础镜像,但带来的新的问题是:
requirement.txt
始终是全量的,因为下游业务需要也要求这个文件必须是全量的。这样的话,即使基础镜像有固定的 100
来个库,也会重跑 pip install -r requirement.txt
好像并没有解决问题特来请教下 V
友,有什么好的解决方案
1
matrix67 2021-06-25 09:57:09 +08:00 2
一是会变的非常慢,
这个你们需要本地搭建一个源,把上游的全拉下来。 二是里边有部分库安装靠运气,时而能成功,时而失败。 这个需要 pin dependency,装包咋会需要运气,你们可能就梳理出来了一级依赖,需要把所有依赖分析出来,用类似 pip-tools 工具可以解决。 |
2
Vegetable 2021-06-25 10:02:03 +08:00
pip 不会重新安装已经存在的依赖
Requirement already satisfied: requests in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (2.25.0) |
3
mekingname 2021-06-25 10:04:16 +08:00
基础镜像如果有这个库的话,pip install -r requirement.txt 的时候,会自动跳过这个库。实际上还是能够提速的。
|
4
Jirajine 2021-06-25 10:07:01 +08:00 via Android
用 poetry,带 lock 锁定版本。
|
5
abersheeran 2021-06-25 10:12:49 +08:00
一楼正解。
另外补充一点,如果部分库靠运气,大概率是需要编译之类的步骤,而不同的安装顺序可能导致有时候依赖有、有些时候没有。建议搭一个私有 PyPi,把所有需要编译的库都自己编译完丢到自己的 PyPi 里,安装的时候能简化不少步骤。 |
6
l4ever 2021-06-25 10:24:34 +08:00
pip 不会重新安装已经存在的依赖, 结帖.
|
7
wellsc 2021-06-25 10:34:47 +08:00
拆
|
8
css3 OP @Vegetable
@mekingname @abersheeran @l4ever 试了下,有的话,确实检测一遍就跳过了,不存在我说的重装的情况,除了影响基础镜像大小纯净度,暂时可以接受,谢谢各位 |
9
css3 OP 我其实想请教下各位,CI 里边有没有增量处理的方法,包括但不局限于安装 package 这些,有可能是业务相关,比如读 gitlab,写文件这些耗时较长的操作,按常规来处理,触发了就开始全量重新执行的
|
10
debuggerx 2021-06-25 11:18:02 +08:00
|
11
brucedone 2021-06-25 11:23:16 +08:00
如果 CI 触发的是 docker 镜像构建,你可以考虑将常规的 requirements 和环境打包一个 base 镜像,剩下的就是你当前项目需要用到的增量,下次构建就直接引用这个 base 镜像
|
12
matrix67 2021-06-25 11:32:05 +08:00
@css3 //CI 里边有没有增量处理的方法
楼主这不就是和代码里面增加缓存一个思路,把耗时的东西从网络拉变成本地拉,把需要重复计算的结果先存下来,下次要用的时候直接取。 还有想办法都搞在 docker 镜像里面。小文件很多也很影响时间的,docker 镜像都变成一个大的块了,也能提速不少。 |
13
vicalloy 2021-06-25 11:48:04 +08:00
让各个项目自己解决。
我都是给每个项目创建一个 base 的镜像,把基础库在 base 镜像里安装好。 正式的镜像基于 base 去做,这样只要安装少数有更新的库就够了。 如果 base 镜像和发布镜像差异过大,就重做一个 base 镜像。 |
14
zacharyjia 2021-06-25 12:21:17 +08:00
我觉得你可能需要的是这个,https://jiacs.com/p/gitlab-ci-pip-cache/,CI 的构建缓存。挺久之前的了,仅供参考,建议按照最新文档配置。
|
15
Anonym0u5 2021-06-25 12:41:22 +08:00
每次 build 可以 FROM 上一次的构建镜像。
|
16
xabcstack 2021-06-25 13:36:01 +08:00
如果是 k8s 安装的 gitlab-runner 的话,可以给任务 runner 配置一个 pvc ,把 安装依赖的挂载到一个存储卷,这样就是把下次依赖缓存了,我们的 maven 依赖包就是这样实现的,打包编译时间非常快,主要就是免去了每次下次
|
17
undef404 2021-06-25 13:46:19 +08:00
用 nexus 自己搭个 pip 源.
|