CI 中 自动安装 Python requirement.txt 如何增量安装? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
css3
V2EX    程序员

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

  •  
  •   css3 2021-06-25 09:52:07 +08:00 2424 次点击
    这是一个创建于 1570 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    • 一是会变的非常慢,
    • 二是里边有部分库安装靠运气,时而能成功,时而失败。

    想过解决办法:

    • 是先将目前的 100 多个库制作一个新的基础镜像,

    但带来的新的问题是:

    • requirement.txt 始终是全量的,因为下游业务需要也要求这个文件必须是全量的。这样的话,即使基础镜像有固定的 100 来个库,也会重跑 pip install -r requirement.txt 好像并没有解决问题
    • 再者,基础镜像变的非常的庞大且不纯净。

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

    17 条回复    2021-06-25 13:46:19 +08:00
    matrix67
        1
    matrix67  
       2021-06-25 09:57:09 +08:00   2
    一是会变的非常慢,
    这个你们需要本地搭建一个源,把上游的全拉下来。

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

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

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

    还有想办法都搞在 docker 镜像里面。小文件很多也很影响时间的,docker 镜像都变成一个大的块了,也能提速不少。
    vicalloy
        13
    vicalloy  
       2021-06-25 11:48:04 +08:00
    让各个项目自己解决。
    我都是给每个项目创建一个 base 的镜像,把基础库在 base 镜像里安装好。
    正式的镜像基于 base 去做,这样只要安装少数有更新的库就够了。
    如果 base 镜像和发布镜像差异过大,就重做一个 base 镜像。
    unifier
        14
    unifier  
       2021-06-25 12:21:17 +08:00
    我觉得你可能需要的是这个,https://jiacs.com/p/gitlab-ci-pip-cache/,CI 的构建缓存。挺久之前的了,仅供参考,建议按照最新文档配置。
    Anonym0u5
        15
    Anonym0u5  
       2021-06-25 12:41:22 +08:00
    每次 build 可以 FROM 上一次的构建镜像。
    xabcstack
        16
    xabcstack  
       2021-06-25 13:36:01 +08:00
    如果是 k8s 安装的 gitlab-runner 的话,可以给任务 runner 配置一个 pvc ,把 安装依赖的挂载到一个存储卷,这样就是把下次依赖缓存了,我们的 maven 依赖包就是这样实现的,打包编译时间非常快,主要就是免去了每次下次
    undef404
        17
    undef404  
       2021-06-25 13:46:19 +08:00
    用 nexus 自己搭个 pip 源.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2689 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 07:43 PVG 15:43 LAX 00:43 JFK 03:43
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86