CI 中 自动安装 Python requirement.txt 如何增量安装?

2021-06-25 09:52:07 +08:00
 css3

目前 gitlab 配置了 cicd, 监控 requirement.txt ,一旦该文件有变化,就会触发 stage 进行 docker 镜像 build, 这期中有进行 pip install -r requirement.txt 的步骤,requirement.txt 里边有接近 100 个库,但可能此次更新就只添加了 12 个新库,但 CI 是全量重新 install, 这就意味着每次要安装原有的 100 来个库,再加上新的库, 带来的问题是:

想过解决办法:

但带来的新的问题是:

特来请教下 V 友,有什么好的解决方案

2087 次点击
所在节点    程序员
17 条回复
matrix67
2021-06-25 09:57:09 +08:00
一是会变的非常慢,
这个你们需要本地搭建一个源,把上游的全拉下来。

二是里边有部分库安装靠运气,时而能成功,时而失败。
这个需要 pin dependency,装包咋会需要运气,你们可能就梳理出来了一级依赖,需要把所有依赖分析出来,用类似 pip-tools 工具可以解决。
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)
mekingname
2021-06-25 10:04:16 +08:00
基础镜像如果有这个库的话,pip install -r requirement.txt 的时候,会自动跳过这个库。实际上还是能够提速的。
Jirajine
2021-06-25 10:07:01 +08:00
用 poetry,带 lock 锁定版本。
abersheeran
2021-06-25 10:12:49 +08:00
一楼正解。

另外补充一点,如果部分库靠运气,大概率是需要编译之类的步骤,而不同的安装顺序可能导致有时候依赖有、有些时候没有。建议搭一个私有 PyPi,把所有需要编译的库都自己编译完丢到自己的 PyPi 里,安装的时候能简化不少步骤。
l4ever
2021-06-25 10:24:34 +08:00
pip 不会重新安装已经存在的依赖, 结帖.
wellsc
2021-06-25 10:34:47 +08:00
css3
2021-06-25 10:41:06 +08:00
@Vegetable
@mekingname
@abersheeran
@l4ever
试了下,有的话,确实检测一遍就跳过了,不存在我说的重装的情况,除了影响基础镜像大小纯净度,暂时可以接受,谢谢各位
css3
2021-06-25 11:12:53 +08:00
我其实想请教下各位,CI 里边有没有增量处理的方法,包括但不局限于安装 package 这些,有可能是业务相关,比如读 gitlab,写文件这些耗时较长的操作,按常规来处理,触发了就开始全量重新执行的
debuggerx
2021-06-25 11:18:02 +08:00
brucedone
2021-06-25 11:23:16 +08:00
如果 CI 触发的是 docker 镜像构建,你可以考虑将常规的 requirements 和环境打包一个 base 镜像,剩下的就是你当前项目需要用到的增量,下次构建就直接引用这个 base 镜像
matrix67
2021-06-25 11:32:05 +08:00
@css3 //CI 里边有没有增量处理的方法

楼主这不就是和代码里面增加缓存一个思路,把耗时的东西从网络拉变成本地拉,把需要重复计算的结果先存下来,下次要用的时候直接取。

还有想办法都搞在 docker 镜像里面。小文件很多也很影响时间的,docker 镜像都变成一个大的块了,也能提速不少。
vicalloy
2021-06-25 11:48:04 +08:00
让各个项目自己解决。
我都是给每个项目创建一个 base 的镜像,把基础库在 base 镜像里安装好。
正式的镜像基于 base 去做,这样只要安装少数有更新的库就够了。
如果 base 镜像和发布镜像差异过大,就重做一个 base 镜像。
zacharyjia
2021-06-25 12:21:17 +08:00
我觉得你可能需要的是这个,https://jiacs.com/p/gitlab-ci-pip-cache/,CI 的构建缓存。挺久之前的了,仅供参考,建议按照最新文档配置。
Anonym0u5
2021-06-25 12:41:22 +08:00
每次 build 可以 FROM 上一次的构建镜像。
xabcstack
2021-06-25 13:36:01 +08:00
如果是 k8s 安装的 gitlab-runner 的话,可以给任务 runner 配置一个 pvc ,把 安装依赖的挂载到一个存储卷,这样就是把下次依赖缓存了,我们的 maven 依赖包就是这样实现的,打包编译时间非常快,主要就是免去了每次下次
undef404
2021-06-25 13:46:19 +08:00
用 nexus 自己搭个 pip 源.

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

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

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

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

© 2021 V2EX