Versioning & Release Policy
Fulla 的版本号方案、bump 判定规则、发布节奏、预发布与补丁通道,以及 版本发布的标准操作流程(SOP)。
本文档是版本治理(governance)的单一出处。版本工程的"怎么做"(CI 流水
线、签名、SBOM)由 .github/workflows/release.yml
实现;本文回答的是"何时发版、bump 什么、为什么"。 二者冲突时,以本文为
准并修流水线。
相关文档:
- SDK Runtime Contract §2 声明了 ABI / 源码级 SemVer 承诺与弃用流程,本文是其版本治理侧的展开。
- CI/CD Guide 描述 release 流水线在整体 CI 中的位置。
1. 版本号方案
1.1 SemVer 2.0.0
Fulla 遵循 Semantic Versioning 2.0.0:
MAJOR.MINOR.PATCH[-prerelease]
1 . 0 . 0 -rc.1
| 段 | bump 依据(简述,详见 §2 决策表) | 兼容性承诺 |
|---|---|---|
| MAJOR | 破坏性变更(breaking change) | 无 —— 用户需改代码 |
| MINOR | 新增功能、向后兼容 | 源码兼容 |
| PATCH | 向后兼容的缺陷修复 | 源码兼容 |
| prerelease | -alpha.N / -beta.N / -rc.N | 无承诺 |
v1.x 的"源码兼容"边界由 SDK Runtime Contract §2 明确:仅覆盖
libs/*/include/fulla/**公共头的源码级 API,不承诺 二进制 ABI。
1.2 版本号单一来源(SSoT)
| 组件 | 版本来源 | 同步校验 |
|---|---|---|
| C++ 库 + server | cmake/Version.cmake 的 MAJOR/MINOR/PATCH | ✅ tools/api-diff/api_diff.py 交叉校验 Version.cmake / CMakeLists.txt project(VERSION) / conanfile.py version |
| Docker 镜像 | 由 release.yml 从 Version.cmake 读取 | GHCR tag = <version> |
| DB schema | apps/server/migrations/V0NN_*.sql 编号 | 不耦合产品版本(见 §6) |
任何版本发布的第一步都是改 cmake/Version.cmake;三处版本号漂移会被
api-diff 在 release.yml 的 version-check job 拦截。
2. 版本号 bump 决策表
一个改动到底触发 MAJOR / MINOR / PATCH bump?按下表判定。当多行命中时, 取最高级别(MAJOR > MINOR > PATCH)。
| 改动类型 | → MAJOR | → MINOR | → PATCH |
|---|---|---|---|
| SDK 公共头删除 / 重命名 / 签名变更 / 默认实参变更(api-diff 判为 BREAKING) | ✅ | ||
| 公共 API 行为语义变更(返回值含义、错误码、副作用、协议字段语义) | ✅ | ||
| 最低 C++ 标准 / 编译器版本提升 | ✅ | ||
| Drogon / Postgres / Redis 大版本依赖升级 | ✅ | ||
| 配置项删除或改默认值且旧行为无法兼容 | ✅ | ||
| DB schema 的破坏性 migration(删列 / 改类型无回填 / 重命名) | ✅ | ||
| 新增 SDK API / 新 OAuth2 端点 / 新 OIDC claim | ✅ | ||
| 已有 API 的新增可选参数 / 字段(带默认值) | ✅ | ||
| 新增可选配置项(旧配置仍可工作) | ✅ | ||
| 新增可选依赖 | ✅ | ||
| 性能优化(不改公共 API) | ✅ | ||
feat: conventional commit(无 !) | ✅ | ||
fix: conventional commit —— API 行为回归到"正确" | ✅ | ||
| 安全漏洞修复(CVE 类,不改 API) | ✅ | ||
| 文档 / 测试 / CI 修复(若决定发版) | ✅ | ||
纯 docs: / test: / chore: / build: / ci: 提交 | 不发版 |
Conventional Commits → bump 自动映射
提交前缀与 bump 的默认映射(! 后缀或 BREAKING CHANGE: footer 强制升
MAJOR):
feat: → MINOR feat!: → MAJOR
fix: → PATCH fix!: → MAJOR
perf: → PATCH perf!: → MAJOR
refactor: → 不发版(除非 !)
docs/test/chore/build/ci: → 不发版
scope 不改变默认映射,但 maintainer 可按 scope 上调(见 §3)。cliff.toml
的 commit parser 已与上表对齐。