Langflow 发布工程指南:RC 分支流程、回归日志审查、标签校验与 LFX 兼容性契约
2026/9/5 16:02:59 网站建设 项目流程

Langflow 发布工程指南:RC 分支流程、回归日志审查、标签校验与 LFX 兼容性契约

【免费下载链接】langflowLangflow is a powerful tool for building and deploying AI-powered agents and workflows.项目地址: https://gitcode.com/GitHub_Trending/la/langflow

本文以 Langflow 仓库根目录的 RELEASE.md 为主体,系统讲解 Langflow 的"release-when-ready"发布节奏:从 RC(release candidate)分支的切分与合并策略,到回归日志(regression log)的审查、v前缀标签的 CI 校验,再到 LFX 与 Langflow 共享 major.minor 版本线的兼容性契约。读完本篇,你可以完整复现 Langflow 一次正式发布的全部手工步骤,并理解每个产物(PyPI 包、Docker 镜像、LFX 执行器)的版本对齐机制。

发布节奏与目标

Langflow 采用release-when-ready的节奏,每个发布周期通常持续 4–6 周,具体时长取决于 QA 与稳定化需求。RELEASE.md 明确了五个核心目标:

  • main分支保持高速迭代,同时在功能成熟时产出稳定的发布构建;
  • 为 QA 与最后时刻的修复提供一个隔离分支(即 RC 分支);
  • 尽可能保持线性、可读的提交历史;
  • 确保发布代码在公开前经过充分测试;
  • 最小化关键缺陷的修复时间。

发布流程总览:OSS QA → Desktop QA → Release

整个发布周期分为四个阶段,其中两个 QA 阶段各持续约一周,main分支在此期间始终不中断新功能开发。

1. OSS QA

创建包含langflow及相关 PyPI 包(如lfx)的 OSS RC 分支。期间:

  • QA 以手工方式执行;
  • 缺陷修复合并进 RC 分支;
  • 新功能继续在main上开发。

2. Desktop QA

OSS QA 与修复完成后,基于最终的 OSS RC 创建 Desktop RC 分支,执行同样的手工 QA、修复合并进 Desktop RC、新功能留在main的流程。

3. Release

OSS 与 Desktop 两侧 QA 完成后:

  • 分别从各自的 RC 分支切出最终发布;
  • 发布时间与 Langflow DevRel 团队协调;
  • 发布后至少 24 小时需监控 Discord、GitHub 等支持渠道的关键缺陷报告。

4. 发布产物

发布工作流自动产出以下两类产物:

PyPI 包:

包名说明
langflow主包,含全部集成
langflow-base不含集成的核心框架
lfx轻量级执行器 CLI
langflow-sdk编程式访问 SDK(更新时发布)

Docker 镜像:

镜像说明
langflowai/langflow完整 Langflow 镜像
langflowai/langflow-backend仅后端(独立发布)
langflowai/langflow-frontend仅前端(独立发布)
langflowai/langflow-ep企业版镜像(独立发布)
langflowai/langflow-base不含集成的基础镜像

注意:backend、frontend 与 enterprise 镜像独立于主镜像发布——即使主版本在 Docker Hub 上已存在,它们仍会被构建。

分支模型与合并策略

RELEASE.md 定义了双分支模型:

分支用途合并策略
main集成分支,所有功能 PR 默认指向它Squash & Merge(线性历史)
release-X.Y.Z(如release-1.4.3临时 RC 分支,仅发布周期内活跃,接受带type:release标签的 QA 与阻塞缺陷 PR分支内Squash & Merge;最终合并前 rebase 到main

合并策略有三条纪律:

  1. 全局使用Squash & Merge,保证原子提交与干净历史;

  2. RC 开放期间定期与 main 再同步,尽早暴露冲突同时保持线性历史:

    git checkout release-X.Y.Z git fetch origin git rebase origin/main
  3. 回合并(merge-back)必须是 fast-forward only;若无法快进,须先把 RC rebase 到main再合并。

对应 FAQ 中的两个高频问题:RC 与 main 之间永远不 merge、只 rebase;分支删除目前尚未自动化,回合并与清理均为手工操作。

发布操作步骤(可直接照做)

1. 切出 RC 分支

git checkout main && git pull # 确保本地 main 最新 git checkout -b release-X.Y.Z # 创建 RC 分支 git push -u origin release-X.Y.Z # 推送到远端

2. 向 RC 应用缺陷修复

  1. 按常规创建功能分支;
  2. 发起指向release-X.Y.Z的 PR;
  3. 正常评审与批准;
  4. 评审后合并进 RC 分支。

3. 审查回归日志

打标签前,审查regressions/X.Y.x.yaml,确认不存在未解决的blocking条目;若存在,须获得签署(sign-off)。

4. 最终发布

git checkout release-X.Y.Z && git pull # 确保 RC 分支最新 git tag vX.Y.Z # 创建最终发布标签 git push origin vX.Y.Z # 推送标签

5. 将 RC 合并回 main

git checkout main git merge --ff-only release-X.Y.Z # 快进 main,纳入 RC 上的所有修复

回归日志(Regression Log)

发布流程中最容易被忽略、但仓库中有着完整落地实现的一环,是回归日志。regressions/README.md 定义了它:每个发布周期对应一个 YAML 文件,记录"在旧版本正常、新版本损坏"的行为,作为发布前后已知问题的唯一事实来源。回归的发现渠道包括手工 QA、自动化测试、支持工单与代码评审。

条目写入步骤:

  1. 打开回归首次出现版本的regressions/<version>.yaml(例如首次出现在 1.9.0 就打开1.9.x.yaml),不存在则创建;
  2. 按 schema 在entries:下新增条目;
  3. 若严重度与规避方案尚未确认,设status: triage
  4. 发起指向当前活跃 RC 分支的 PR(修复 PR 与 YAML 条目可以指向不同分支)。

条目 schema:

{ "id": "GH-12345", "title": "Short plain-language description", "status": "triage", "area": "flow_editor", "first_bad_version": "1.10.0", "last_known_good_version": "1.9.0", "resolved_in_version": "1.10.1", "fix_pr": "https://github.com/langflow-ai/langflow/pull/12345", "workaround": "none" }

其中resolved_in_versionfix_pr是可选字段,首次登记时可省略,修复落地后再补上。

状态取值:

Status含义
triage已发现、尚未完全评估;首次登记的默认值
ship_with_note带问题发布;文档必须传达 workaround
resolved已修复;须补resolved_in_version记录修复版本
blocking发布阻塞项;发布前须显式签署

area 取值覆盖flow_editor(可视化构建器 UI)、components(核心组件)、mcp(MCP 服务注册与侧边栏)、api(REST 端点)、lfx(CLI 执行器)、auth(登录/API key/用户管理)、database(迁移与存储)、integrations(第三方组件)、starter_projects(内置示例流)。

仓库中的真实文件可以印证这套流程:regressions/1.10.x.yaml 首条目GH-13538记录了"Python Code Structured 工具先禁用后移除(未认证 RCE 修复)",状态为ship_with_note、area 为componentsfirst_bad_version: 1.10.0,并给出 workaround——用 Python Interpreter(PythonREPLComponent)组件重建该步骤。此外还有 regressions/1.9.x.yaml 与 regressions/1.11.x.yaml,对应不同发布周期。

发布前的审查分工:QA 与支持工程师在 RC 期间持续把条目移出triage、补充 workaround、将已修复项标记为resolved并填上resolved_in_version;文档团队在发布前审查所有ship_with_note条目,将 workaround 文案写入发布说明;Release Captain 最终确认没有未解决的blocking条目,如有则须由维护者在 GitHub issue 中签署。

版本管理与标签规则

  • 遵循语义化版本(Semantic Versioning):MAJOR.MINOR.PATCH
  • RC 标签使用-rc.N后缀,例如v1.8.0-rc.1
  • 所有标签必须以v前缀开头(如v1.9.1,而非1.9.1)。

最后一条规则不只是命名偏好,而是有 CI 硬校验的:发布工作流 release.yml 中的validate-tag-format步骤用正则^v[0-9]+\.[0-9]+\.[0-9]+$校验标签格式,不符合则直接失败;随后还会检查是否存在不带v前缀的同名重复标签——若1.8.3v1.8.3同时存在,GitHub 的 release notes 生成会选错 base 比较,导致 changelog 不完整。工作流检测到重复标签时会打印指向错误 commit 的诊断信息,并提示用git push origin :refs/tags/<tag>删除。该工作流还支持dry_run(默认开启,禁用对 PyPI、Docker、GitHub Release 的一切推送)以及按包/镜像维度的独立开关(release_package_baserelease_package_mainrelease_lfxrelease_sdkrelease_bundlesbuild_docker_basebuild_docker_main),与"backend/frontend/enterprise 镜像独立发布"的说明一致。

LFX 兼容性契约

Langflow 与 LFX 共享同一条major.minor 版本线,兼容性契约为:

LFX X.Y.N 保证兼容任何由 Langflow X.Y.M 导出的 Flow。

补丁版本(NM)相互独立——LFX 的补丁不要求 Langflow 同步发补丁,反之亦然。这一对齐在仓库中是可见的:src/lfx/pyproject.toml 当前version = "1.12.0",与 pyproject.toml 中langflow1.12.0及 src/frontend/package.json 前端版本1.12.0完全一致,印证了 LFX 与宿主共享版本线的事实(而 src/sdk/pyproject.toml 的langflow-sdk为独立的0.4.0线,与 RELEASE.md 中"SDK 更新时才发布"的描述吻合)。

版本管理:make patch

make patch v=X.Y.Z会同时更新四个产物的版本。RELEASE.md 给出的版本表为:

产物设定版本
langflowX.Y.Z
langflow-base0.Y.Z
lfxX.Y.Z
frontendX.Y.Z

结合 Makefile 中patch目标的实现可以看出其具体动作:该目标先由X.Y.Z派生出兼容性下限LANGFLOW_COMPAT_VERSION(即X.Y.0),然后依次改写主pyproject.toml(并把langflow-base依赖约束更新为~=X.Y.0)、src/backend/base/pyproject.toml、src/lfx/pyproject.toml、src/sdk/pyproject.toml,同时更新component_index.json中的版本。从当前仓库的实际状态看,langflow-base已升至与langflow相同的1.12.0(src/backend/base/pyproject.toml),即 base 包已跟随主版本线对齐,文档表格中0.Y.Z的历史约定可视为该对齐完成前的形态。

切一个 LFX 补丁发布:scripts/release-lfx.sh

scripts/release-lfx.sh 封装了 LFX 补丁发布的完整准备流程,用法为scripts/release-lfx.sh <version>,并支持--dry-run只校验不落地。脚本的关键行为:

  • 前置检查:必须在仓库根目录运行(依赖src/lfx/pyproject.toml存在);非 dry-run 模式下检测到未提交改动会直接退出;
  • 版本格式校验:用正则^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9]+)?$强制语义化格式;
  • minor 对齐软校验:提取 LFX 新版本的major.minor与主pyproject.toml中 Langflow 的 minor 比较,不一致时打印告警("LFX minor version ... does not match Langflow minor version")但不阻断——同一 minor 内的补丁发布是预期且合理的;
  • 版本写入:更新src/lfx/pyproject.tomlversion,以及src/lfx/docker/Dockerfile*中的ARG LFX_VERSION
  • 发布前验证:在src/lfx下跑make test,失败即回滚改动并退出;随后uv build验证打包,成功后清理dist/
  • 提交与打标签:生成提交chore(lfx): bump version to <version>,并创建附注标签lfx-v<version>(注意 LFX 标签带lfx-前缀,与主发布的vX.Y.Z区分);
  • 收尾指引:提示推送 commit 与标签后,在 CI 中手动运行 "LFX Release" 工作流,按提示选择发布 PyPI、构建 Docker 镜像(standard 与 alpine)、创建 GitHub Release。

对用户的含义:pinlfx~=X.Y.0

用户可以lfx~=X.Y.0的方式在requirements.txt中固定,从而只接收对应 Langflow minor 下所有兼容的 LFX 补丁发布,而不跨 minor 线。

一个必须向用户明示的历史事件是lfx 0.5.x 到 1.10.0 的版本跳变:LFX 从独立的0.5.x线重新对齐到 Langflow 的 major.minor 线,版本号一步从0.5.0跳到1.10.0——这是编号规则变更,而非 95 个 minor 的功能积压。该跳变会影响下游 pin,且 pip 与 uv 都不会主动提示,因此必须在发布公告中声明,而不仅仅写在 RELEASE.md:

  • lfx==0.5.xlfx<1.0的 pin不会升级(有意为之,那些部署原地保持);
  • lfx>=0.5,<1的 pin不会升级;
  • lfx>=0.5无上界的 pin在下次安装时拉到1.10.0——一次无警告的 major 跳跃。

因此 RELEASE.md 的建议是:此后一律使用lfx~=X.Y.0(例如lfx~=1.10.0)这类兼容区间 pin,跟踪某个 Langflow minor 下的兼容补丁而不静默跨越 minor 线。

角色分工与 FAQ

角色职责
Release Captain(每周期轮换)拥有时间线、分支切分、打标签、回合并
PR Author确保测试通过;若缺陷需要进 RC,为 PR 标记type:release
CI在测试失败或缺少标签时阻断合并

FAQ 摘要:

  • 是否会把 main 合并进 RC?不会。始终把 RC rebase 到main,以保留线性历史。
  • 能否自动化分支删除?目前不能——回合并与清理仍是手工操作。
  • 时间线有多灵活?非常灵活。QA 与稳定化阶段可按质量需要延长。

小结

Langflow 的发布体系可以归纳为三条主线:其一,流程主线——main快速迭代、RC 分支隔离 QA、rebase 保持线性、fast-forward 回合并,配套回归日志 YAML 作为已知问题的唯一事实来源;其二,产物主线——PyPI 四包(langflowlangflow-baselfxlangflow-sdk)与五个 Docker 镜像按开关独立发布,make patch统一抬升版本,scripts/release-lfx.sh单独支撑 LFX 补丁线;其三,契约主线——LFX 与 Langflow 共享 major.minor 版本线,v前缀标签由 CI 强制校验,用户侧以lfx~=X.Y.0锁定兼容区间。仓库中的 regressions/、Makefile、.github/workflows/release.yml 与 scripts/release-lfx.sh 为上述每个环节都提供了可直接核对的实现证据,读者可沿这些文件进一步深入发布工程细节。

【免费下载链接】langflowLangflow is a powerful tool for building and deploying AI-powered agents and workflows.项目地址: https://gitcode.com/GitHub_Trending/la/langflow

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询