当前位置: 首页 > backend >正文

【RAGFlow代码详解-30】构建系统和 CI/CD

Docker 构建系统

RAGFlow 使用主 Dockerfile 1-214 中定义的复杂多阶段 Docker 构建过程,该过程创建应用程序的完整和精简变体。

多阶段构建架构

在这里插入图片描述
Docker 构建过程

构建过程由 Dockerfile 2-214 中 定义的三个主要阶段组成:

  • 基础阶段 ( Dockerfile 2-139 ):使用系统依赖项(包括 Python 3.10、Node.js 20、Rust 工具链和数据库驱动程序)设置 Ubuntu 22.04 基础。

  • 构建器阶段 ( Dockerfile 142-179 ):使用 uv 包管理器处理依赖项安装,并使用 npm 构建 React 前端。

  • 生产阶段 ( Dockerfile 181-214 ):通过复制构建的项目和应用程序代码来创建最终的运行时映像。

构建变体

系统支持由 LIGHTEN` build 参数控制的两个构建变体:

  • 完整映像 :包括所有 ML 模型和嵌入 ( Dockerfile 21-26 )
  • Slim Image:排除大型嵌入模型以减小图像大小 ( Dockerfile 158-162 )

依赖关系管理

RAGFlow 通过专用的下载脚本和预构建的依赖关系映像来管理外部依赖项。

外部依赖项下载

在这里插入图片描述

依赖项类别
download_deps.py 1-78 脚本管理几类依赖项:

  • ML 模型 :通过 ( download_deps.py 50-53 ) 下载 huggingface_hub.snapshot_download()
  • 系统库 :SSL 证书、用于数据库连接的 ODBC 驱动程序
  • 文档处理 :Apache Tika 服务器和 Chrome 浏览器,用于 PDF/Web 内容处理
  • NLP 数据 :用于文本处理的 NLTK 语料库 ( download_deps.py 70-73 )

该脚本支持针对基于中国的部署( download_deps.py 20-40 )进行镜像选择。

持续集成

RAGFlow 通过测试多种配置和存储后端的 GitHub Actions 工作流实现全面的 CI。

测试工作流架构

在这里插入图片描述
测试执行流程

.github/workflows/tests.yml 1-176 中 的主要测试工作流执行以下顺序:

  1. 静态分析 :使用 Ruff 进行 Python 代码质量检查 ( .github/workflows/tests.yml 52-56 )
  2. Docker 构建 :创建精简和完整变体 ( .github/workflows/tests.yml 58-66 )
  3. 多后端测试 :针对 Elasticsearch 和 Infinity 存储引擎进行测试
  4. 测试类别 :
    • 通过 pytest 进行 SDK API 测试 ( .github/workflows/tests.yml 96 )
    • 前端 API 测试 ( .github/workflows/tests.yml 106 )
    • HTTP API 测试 ( .github/workflows/tests.yml 121 )

测试配置

根据触发器类型配置了不同的测试级别:

  • Pull Request/Push:P2 级测试 ( .github/workflows/tests.yml 94 )
  • 定时运行 :P3 级综合测试( .github/workflows/tests.yml 92 )

发布自动化

RAGFlow 通过专用的 GitHub Actions 工作流自动发布,该工作流处理版本控制、Docker 映像发布和 PyPI 包分发。

发布管道架构

在这里插入图片描述
发布类型

系统支持 .github/workflows/release.yml 1-119 中 定义的两种类型的版本:

  1. 版本发布 :通过创建 v*.. 标签触发,发布稳定版本
  2. Nightly Releases:使用可变的 nightly 标签计划每日构建

Docker 镜像发布

该工作流发布两个 Docker 变体:

  • 全图 : infiniflow/ragflow:$RELEASE_TAG ( .github/workflows/release.yml 86-94 )
  • 超薄图像 : infiniflow/ragflow:$RELEASE_TAG-slim ( .github/workflows/release.yml 96-104 )

PyPI 包分发

对于版本发布,工作流使用 uv buildpypa/gh-action-pypi-publish ( .github/workflows/release.yml 106-118 ) 构建 Python SDK 并将其发布到 PyPI。

版本管理

RAGFlow 实现了一个灵活的版本跟踪系统,该系统适用于开发和生产环境。

版本解析逻辑

在这里插入图片描述
版本解析流程

api/versions.py 23-39 中的 get_ragflow_version() 函数实现了分层版本解析:

  1. 缓存检查 :如果已解析,则返回缓存版本
  2. VERSION 文件 :从 Docker 构建生成的 VERSION 文件( api/versions.py 27-34 )中读取
  3. Git 回退 : git describe --tags --match=v* --first-parent --always 用于开发 ( api/versions.py 42-52 )
  4. 构建变体 :根据 LIGHTEN 环境变量 ( api/versions.py 37-38 ) 附加“slim”或“full”后缀

运行时集成

版本信息通过调用 get_ragflow_version() ( api/db/runtime_config.py 37-38 )RuntimeConfig.init_env() 集成到运行时配置中。

Docker 构建版本生成

在 Docker 构建期间,使用 Git 命令捕获版本并写入 VERSION 文件 ( Dockerfile 171-178 )

version_info=$(git describe --tags --match=v* --first-parent --always)
echo $version_info > /ragflow/VERSION

构建优化

缓存策略

Docker 构建实现了全面的缓存以提高构建性能:

  • APT 缓存 :持久包缓存 ( Dockerfile 45 )
  • UV 缓存 :Python 包缓存 ( Dockerfile 152 )
  • NPM 缓存 :Node.js 包缓存 ( Dockerfile 166 )

多架构支持

构建系统处理不同的 CPU 架构:

  • x86_64:标准 Intel/AMD 处理器
  • ARM64/AArch64:Apple Silicon 和 ARM 服务器 ( Dockerfile 109-117 )

特定于体系结构的包是动态选择的,特别是对于 ODBC 驱动程序和 SSL 库。

http://www.xdnf.cn/news/18810.html

相关文章:

  • 微服务-28.配置管理-共享配置
  • poi生成word固定表格列宽
  • TensorFlow 面试题及详细答案 120道(61-70)-- 高级特性与工具
  • css3背景线性渐变:linear-gradient
  • 【密集目标检测】停车场车辆(车位)识别数据集:12k+图像,yolo标注
  • 04 网络信息内容安全--入侵检测技术
  • 依托边缘计算方案,移动云全面化解算力、效率、安全平衡难题
  • from中烟科技翼支付 面试题2
  • 高频面试题:说一下线程池吧?(线程池原理,核心参数,创建方式,应用场景都要说到才能让面试官心服口服)
  • Pytorch深度学习(小土堆)
  • Java 企业应用单点登录(SSO)实现方案详解
  • 如何对springboot mapper 编写单元测试
  • Ansible 文件管理与 Jinja2 模板全解析:从模块应用到动态配置生成
  • 由倍讯科技研制的CCLinkIE转ModbusTCP网关,可达成与脉冲计数器的连接
  • JVM分层编译深度解析:完整机制与实践指南
  • 《零基础入门AI:长短期记忆网络(LSTM)与门控循环单元(GRU)(原理、结构与实现)》
  • 【大前端】实现一个前端埋点SDK,并封装成NPM包
  • 【机械故障】旋转机械故障引起的振动信号调制效应概述
  • 在线教育系统源码助力教培转型:知识付费平台开发的商业实践
  • 达索 Enovia 许可管理技术白皮书:机制解析与智能优化实践
  • 面试 总结(1)
  • 项目集升级:顶部导览优化、字段自定义、路线图双模式、阶段图掌控、甘特图升级、工作量优化、仪表盘权限清晰
  • 31.Encoder-Decoder(Seq2Seq)
  • Docker详细学习
  • 【Protues仿真】定时器
  • 构建智能提示词工程师:LangGraph 的自动化提示词生成流程
  • [在实践中学习] 中间件理论和方法--Redis
  • WPF基于LiveCharts2图形库,实现:折线图,柱状图,饼状图
  • Python爬虫实战:研究开源的高性能代理池,构建电商数据采集和分析系统
  • Pycharm