加密SDK版本管理策略:命名、分支与发布周期

版本管理这事儿,看起来就是定个号、拉个分支,但真踩过坑才知道,随便定一套规则后面有多痛苦。我在维护一个金融级加密SDK时,早期版本号就乱——hotfix和feature版分不清,用户一看版本号完全不知道能不能升,每次升级都心惊胆战。嗯,后来我们痛定思痛,搞了一套标准。今天就跟大家聊聊这套体系。

版本命名规则:一看就懂

我个人习惯用语义化版本规范(SemVer)。说白了就是版本号得有意义,不能是拍脑袋的。

格式:MAJOR.MINOR.PATCH,再加一个可选的预发布后缀。

  • MAJOR(主版本号):不兼容的API变更。比如字段加密算法从AES-256-GCM换成了SM4,或者密钥结构大改。升了这个号,用户必须改代码。
  • MINOR(次版本号):向后兼容的新功能。比如新增了一个加密字段类型,或者优化了性能。升这个号,通常不需要改业务代码。
  • PATCH(修订号):向后兼容的问题修复。比如修了一个边界条件下的解密bug。升这个号,用户可以无脑升级。

预发布后缀呢,我用 -alpha、-beta、-rc.1 这种。比如 2.1.0-beta.2,意思就是第二个beta版本。

版本示例 含义 升级风险
1.0.0 第一个稳定版 基线
1.0.1 修复了一个内存泄漏 低
1.1.0 新增PBKDF2密钥派生功能 中
2.0.0 加密算法全面升级为SM系列 高(需重构)

我的小建议:千万别把版本号和发布日期混在一起。我见过有人用 2024.01.15 当版本号,结果同一天发了两个修复版怎么办?根本区分不开。SemVer才是正解。

分支策略:并行开发与隔离

分支搞不好,版本就乱套了。我个人喜欢用 Git Flow 的变体,针对SDK项目做了些简化。

核心分支就这几个:

  1. main:只放发行版。每个提交都对应一个发布版本,打上版本tag。不允许直接提交代码到main。
  2. develop:日常开发集成分支。新功能从develop拉分支,合回来也先合到develop。
  3. feature/*:新功能分支。比如 feature/sm4-support。开发完了合并回develop。
  4. release/*:发布分支。从develop拉出来,只做最后的测试和bug修复,不添加新功能。测试通过后,合并到main并打tag,再合并回develop。
  5. hotfix/*:紧急修复分支。从main拉出来,修完合并回main和develop。
# 创建发布分支的例子
git checkout develop
git checkout -b release/2.1.0
# 在release分支上修bug
git commit -m "fix: 修复国密证书解析异常"
# 测试通过后
git checkout main
git merge release/2.1.0 --no-ff
git tag -a v2.1.0 -m "Release version 2.1.0"
git checkout develop
git merge release/2.1.0 --no-ff
git branch -d release/2.1.0

避坑指南:我曾经见过一个团队,hotfix修完忘了合并回develop。结果下次发版时,那个紧急修复的代码又丢了。用户气得够呛。记住,hotfix是双线合并——main和develop都得合。

发布周期:节奏要稳

发布周期太随意也不行。我的经验是,SDK发布要兼顾稳定性和响应速度。

我一般这样安排:

  • PATCH版本:按需发布,随时响应。安全漏洞需要24小时内出修复版。
  • MINOR版本:每2~4周一个。攒够新功能就发一个,别拖太久。
  • MAJOR版本:每3~6个月一个。需要提前一个月发beta版让用户测试兼容性。

为什么会这样定?你想想看,加密SDK涉及安全,patch太快可能引入新bug,太慢又怕漏洞被利用。minor版本卡在2~4周,既给了测试时间,又不让用户等太久。

关键点:每个release分支的生命周期里,必须跑完整套回归测试,包括单元测试、集成测试和兼容性测试。没跑完测试的版本,不允许打tag发布。

版本管理策略总览 版本命名规则 SemVer: MAJOR.MINOR.PATCH 分支策略 Git Flow 简化版 发布周期 稳定 + 响应式 MAJOR: 不兼容变更 MINOR: 新功能 PATCH: bug修复 预发布: -alpha/-beta main / develop 核心分支 feature / release hotfix 分支 PATCH: 随时 安全漏洞紧急修复 MINOR: 2~4周 MAJOR: 3~6月 核心原则 版本号可追溯 · 分支职责清晰 · 发布节奏可预期

这套策略跑下来,我最大的体会是——用户能看懂你的版本号,知道该不该升、怎么升,这就是成功。版本管理不是给自己看的,是给用你SDK的人看的。