【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.pswp.cn/bicheng/94917.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94917.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94917.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

rust語言 (1.88) egui (0.32.1) 學習筆記(逐行注釋)(十七)設置主題

設置主題set_visuals ctx.set_visuals(Visuals::dark()); 設置暗色主題ctx.set_visuals(Visuals::light()); 設置亮色主題 fn main() -> eframe::Result<()> {// 配置原生窗口參數let options eframe::NativeOptions::default();eframe::run_simple_native("主題…

Linux入門教程 第十五章 Linux 系統調優工具

文章目錄一、系統調優概述與 CPU 負載查看1.使用 uptime 查看系統負載2.使用 top 按 CPU 使用率排序3.使用 ps 查看 CPU 使用最多的進程4.使用 mpstat 查看 CPU 詳細狀態一、查看內存運行狀態1.使用 free 查看內存使用2.查看 /proc/meminfo 獲取詳細內存信息3.使用 top 按內存使…

【Docker基礎】Docker-compose進階配置:健康檢查與服務就緒

目錄 引言 1 Docker健康檢查基礎概念 1.1 什么是健康檢查 1.2 健康檢查的狀態 2 healthcheck配置詳解 2.1 基本語法 2.2 配置參數解釋 2.3 健康檢查命令的編寫 2.4 健康檢查的工作流程 3 服務依賴與健康檢查 3.1 depends_on的基本用法 3.2 結合健康檢查的依賴 3.3…

Redis大Key處理流程與注意事項

概述 Redis大Key問題是在生產環境中經常遇到的技術挑戰&#xff0c;它可能導致內存占用過高、網絡延遲增加、阻塞其他操作等嚴重問題。本文將深入探討Redis大Key的識別、處理流程以及相關注意事項。 什么是Redis大Key 定義標準 String類型: 單個Key的Value超過10KBHash類型: 單…

領悟8種常見的設計模式

很多 Java 初學者覺得設計模式 “抽象難學”&#xff0c;其實是沒抓住核心邏輯 —— 設計模式不是 “炫技代碼”&#xff0c;而是前輩們總結的 “解決高頻復雜問題的通用思路”&#xff0c;好吧&#xff0c;你可以過一遍了解這些大概是個什么東西不求我們能夠完全理解&#xff…

復雜BI報表SQL

復雜SQL 一行多個人員&#xff0c;平均瓜分總產量。 -- 西寧硅料三期 with b as ( select(row_number() OVER(PARTITION BY t1.tool ORDER BY t1.tool ) - 1) AS help_topic_id from((select1 AS tool union allselect1 AS tool union allselect1 AS tool union allselect1 AS …

bin log 和 redo log有什么區別

問題bin log 和 redo log有什么區別我的回答首先&#xff0c;這兩種日志的作用不同。redo log是InnoDB引擎特有的&#xff0c;主要用于崩潰恢復&#xff0c;保證事務的持久性。而bin log是MySQL服務層的日志&#xff0c;主要用于主從復制和數據恢復。從層次上看&#xff0c;red…

導入文件允許合并表格

本來呢&#xff0c;已經有幾年沒咋寫博客了&#xff0c;但是好像網上沒什么好的合并導入可以抄的&#xff0c;周末加班了一天弄出來了&#xff0c;想一想也不算造輪子&#xff0c;可以露一手出來&#xff0c;最近也挺喜歡寫注釋的&#xff0c;應該方便大家抄的public class Tra…

WebIDEPLOY 技術驅動櫻桃溯源管理系統的價值重塑與落地實踐—— 以櫻桃溯源管理系統構建產業信任體系的路徑探索

一、WebIDEPLOY 技術支撐下的櫻桃溯源系統核心架構櫻桃種植從開花到銷售的全流程數據記錄&#xff0c;需要兼顧專業性與易操作性&#xff0c;WebIDEPLOY 技術以 “零代碼降低門檻、云原生優化成本” 的特性&#xff0c;成為連接數字工具與櫻桃種植的關鍵紐帶。系統核心架構圍繞…

零知開源——基于STM32F407VET6實現ULN2003AN驅動28BYJ-48步進電機控制系統

?零知IDE 是一個真正屬于國人自己的開源軟件平臺&#xff0c;在開發效率上超越了Arduino平臺并且更加容易上手&#xff0c;大大降低了開發難度。零知開源在軟件方面提供了完整的學習教程和豐富示例代碼&#xff0c;讓不懂程序的工程師也能非常輕而易舉的搭建電路來創作產品&am…

如何多個手機設備的實現不同公網IP

為了避免多個手機設備使用相同的公網IP地址導致平臺檢測關聯&#xff0c;可以通過以下方法實現不同公網IP的分配和管理. 一、移動網絡&#xff08;SIM 卡&#xff09;方案 1.移動數據與Wi-Fi切換&#xff1a;通過切換移動數據和不同Wi-Fi網絡&#xff08;如家庭Wi-Fi、公共Wi-F…

沙箱操作指南

這是一份通用且詳細的沙箱操作指南。沙箱(Sandbox)是一種安全隔離環境,常用于測試未經驗證的代碼、軟件、文件或訪問可疑網址,而不會對真實系統造成危害。 本指南將分為以下幾個部分: 沙箱是什么? 為什么需要使用沙箱? 如何使用沙箱?(三種主要類型) 最佳實踐與注意事…

【數字IC后端】引導時鐘樹CTS的生成方向之anchor driver

如何控制數字IC后端CTS的生成方向&#xff1f;我們可以引入anchor driver來實現引導。景芯12nm車規APR實戰中&#xff0c;我們可以看到&#xff0c;絕大部分的sink都受控于xxxx_tessent_occ_clk_cpu_inst/tessent_persistent_cell_clock_out_mux/C10_ctmi_1這個mux&#xff0c;…

「Java EE開發指南」如何使用MyEclipse啟用自動JSP驗證?

自動JSP驗證可以在兩種情況下啟用&#xff0c;在本文中您將學習如何正確使用它。 該特性在MyEclipse中可用。 MyEclipse v2025.1離線版下載 您可以在保存JSP編輯器的內容或執行“Clean”操作時啟用自動JSP驗證。要進行正確的驗證&#xff0c;必須使用完整的JDK JVM啟動MyEcl…

leetcode_73 矩陣置零

1. 題意 給定一個 m x n 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 2. 題解 想不到O(1)的空間復雜度的做法&#xff0c; 只有抄抄題解這樣子才能維持的了生活。 2.1 暴力 維護兩個標記數組&#xff0c;分…

優雅地實現ChatGPT式的打字機效果:Spring Boot 流式響應

01 引言 之前專門介紹過流式響應的數據的接收、發送以及使用SSE由服務端推送數據的文章&#xff0c;但是要求前端必須使用EventSource訂閱實現。 有沒有通過直接通過瀏覽器訪問或者Fetch API直接調用的方式呢&#xff1f;效果還能和ChatGPT一樣&#xff0c;實現打字機的效果呢&…

Git 刪除文件

在 Git 中&#xff0c;刪除文件同樣被視為一種修改操作。下面我們通過實際操作演示如何刪除文件。假設要刪除文件 file5&#xff0c;如果你直接在文件系統中執行了刪除&#xff1a;這種直接刪除的方式并不會在 Git 中生效&#xff0c;反而會導致工作區與版本庫不一致。使用 git…

虛幻基礎:角色變換角色視角蒙太奇運動

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄角色視角機臂使用pawn控制旋轉&#xff1a;旋轉體將失去作用旋轉體攝像機&#xff1a;可以使用旋轉體控制&#xff1a;pawn不起作用角色變換角色移動&#xff1a;由移動組件控制移動方向&#xff1a;給組件任意一個方…

【LeetCode】31. 下一個排列

文章目錄31. 下一個排列題目描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a;提示&#xff1a;解題思路1. 問題本質與字典序回顧2. 經典算法三步曲&#xff08;必須原地、常數空間&#xff09;3. 直觀示例與過程可視化4. 與“62. 不同路徑”風格對應的分析維度4.1 …

CVPR2025丨VL2Lite:如何將巨型VLM的“知識”精煉后灌入輕量網絡?這項蒸餾技術實現了任務專用的極致壓縮

關注gongzhonghao【CVPR頂會精選】小模型&#xff08;Small Models&#xff09;通常指參數量較小、計算與存儲成本更低的深度學習模型。近年來&#xff0c;它們在移動端部署、邊緣計算和隱私保護等場景中快速發展&#xff0c;逐漸成為大模型的輕量化補充。隨著蒸餾、剪枝、量化…