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 |
合并策略有三条纪律:
全局使用Squash & Merge,保证原子提交与干净历史;
RC 开放期间定期与 main 再同步,尽早暴露冲突同时保持线性历史:
git checkout release-X.Y.Z git fetch origin git rebase origin/main回合并(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 应用缺陷修复
- 按常规创建功能分支;
- 发起指向
release-X.Y.Z的 PR; - 正常评审与批准;
- 评审后合并进 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、自动化测试、支持工单与代码评审。
条目写入步骤:
- 打开回归首次出现版本的
regressions/<version>.yaml(例如首次出现在 1.9.0 就打开1.9.x.yaml),不存在则创建; - 按 schema 在
entries:下新增条目; - 若严重度与规避方案尚未确认,设
status: triage; - 发起指向当前活跃 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_version与fix_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 为components、first_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.3与v1.8.3同时存在,GitHub 的 release notes 生成会选错 base 比较,导致 changelog 不完整。工作流检测到重复标签时会打印指向错误 commit 的诊断信息,并提示用git push origin :refs/tags/<tag>删除。该工作流还支持dry_run(默认开启,禁用对 PyPI、Docker、GitHub Release 的一切推送)以及按包/镜像维度的独立开关(release_package_base、release_package_main、release_lfx、release_sdk、release_bundles、build_docker_base、build_docker_main),与"backend/frontend/enterprise 镜像独立发布"的说明一致。
LFX 兼容性契约
Langflow 与 LFX 共享同一条major.minor 版本线,兼容性契约为:
LFX X.Y.N 保证兼容任何由 Langflow X.Y.M 导出的 Flow。
补丁版本(N与M)相互独立——LFX 的补丁不要求 Langflow 同步发补丁,反之亦然。这一对齐在仓库中是可见的:src/lfx/pyproject.toml 当前version = "1.12.0",与 pyproject.toml 中langflow的1.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 给出的版本表为:
| 产物 | 设定版本 |
|---|---|
langflow | X.Y.Z |
langflow-base | 0.Y.Z |
lfx | X.Y.Z |
| frontend | X.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.toml的version,以及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.x或lfx<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 四包(langflow、langflow-base、lfx、langflow-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),仅供参考