V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
css3
V2EX  ›  程序员

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

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

    目前 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 里,安装的时候能简化不少步骤。
    l4ever
        6
    l4ever  
       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 镜像。
    zacharyjia
        14
    zacharyjia  
       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   ·   我们的愿景   ·   实用小工具   ·   2717 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 15:30 · PVG 23:30 · LAX 08:30 · JFK 11:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.