V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
css3
V2EX  ›  程序员

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

  •  
  •   css3 · Jun 25, 2021 · 2736 views
    This topic created in 1773 days ago, the information mentioned may be changed or developed.

    目前 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 replies    2021-06-25 13:46:19 +08:00
    matrix67
        1
    matrix67  
       Jun 25, 2021   ❤️ 2
    一是会变的非常慢,
    这个你们需要本地搭建一个源,把上游的全拉下来。

    二是里边有部分库安装靠运气,时而能成功,时而失败。
    这个需要 pin dependency,装包咋会需要运气,你们可能就梳理出来了一级依赖,需要把所有依赖分析出来,用类似 pip-tools 工具可以解决。
    Vegetable
        2
    Vegetable  
       Jun 25, 2021
    pip 不会重新安装已经存在的依赖
    Requirement already satisfied: requests in /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages (2.25.0)
    mekingname
        3
    mekingname  
       Jun 25, 2021
    基础镜像如果有这个库的话,pip install -r requirement.txt 的时候,会自动跳过这个库。实际上还是能够提速的。
    Jirajine
        4
    Jirajine  
       Jun 25, 2021 via Android
    用 poetry,带 lock 锁定版本。
    abersheeran
        5
    abersheeran  
       Jun 25, 2021
    一楼正解。

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

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

    还有想办法都搞在 docker 镜像里面。小文件很多也很影响时间的,docker 镜像都变成一个大的块了,也能提速不少。
    vicalloy
        13
    vicalloy  
       Jun 25, 2021
    让各个项目自己解决。
    我都是给每个项目创建一个 base 的镜像,把基础库在 base 镜像里安装好。
    正式的镜像基于 base 去做,这样只要安装少数有更新的库就够了。
    如果 base 镜像和发布镜像差异过大,就重做一个 base 镜像。
    unifier
        14
    unifier  
       Jun 25, 2021
    我觉得你可能需要的是这个,https://jiacs.com/p/gitlab-ci-pip-cache/,CI 的构建缓存。挺久之前的了,仅供参考,建议按照最新文档配置。
    Anonym0u5
        15
    Anonym0u5  
       Jun 25, 2021
    每次 build 可以 FROM 上一次的构建镜像。
    xabcstack
        16
    xabcstack  
       Jun 25, 2021
    如果是 k8s 安装的 gitlab-runner 的话,可以给任务 runner 配置一个 pvc ,把 安装依赖的挂载到一个存储卷,这样就是把下次依赖缓存了,我们的 maven 依赖包就是这样实现的,打包编译时间非常快,主要就是免去了每次下次
    undef404
        17
    undef404  
       Jun 25, 2021
    用 nexus 自己搭个 pip 源.
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2338 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 88ms · UTC 15:38 · PVG 23:38 · LAX 08:38 · JFK 11:38
    ♥ Do have faith in what you're doing.