4. 标签与发布:语义化版本控制(SemVer)、如何给固件打标签、发布流程
好,咱们进入一个非常实操的话题——标签与发布。
说实话,很多嵌入式团队在版本管理上吃过亏。我见过不少项目,固件版本号乱得像天书,什么「V2.3_fix_2023_最终版」这种名字,你看着就想摔键盘。更可怕的是,没有规范的发布流程,生产线上烧错了固件,整批货报废。
嗯,这节课我们就来彻底解决这个问题。
4.1 语义化版本控制(SemVer)—— 给固件一个身份证
语义化版本控制,英文叫 SemVer(Semantic Versioning)。说白了,就是用一套统一的规则来定义版本号,让所有人都能一眼看懂这个版本到底改了啥。
标准格式是:主版本号.次版本号.修订号,比如 2.1.3。
- 主版本号:做了不兼容的 API 或功能改动。比如你改了剃须刀的电机控制协议,旧版 App 连不上新固件了,那就得升主版本。
- 次版本号:增加了新功能,但向后兼容。比如你加了个「旅行锁」功能,不影响原有操作,那就升次版本。
- 修订号:做了 bug 修复。比如修复了电量显示不准的问题,只升修订号。
我个人的习惯是,在版本号后面还可以加预发布标识,比如 2.1.0-alpha.1 或 2.1.0-rc.2。alpha 是内部测试版,beta 是公开测试版,rc 是候选发布版。这样团队内部沟通时,一听就知道这个固件能不能量产。
重要原则:版本号一旦发布,就不能再修改。如果发现 bug,必须发布一个新版本。这是底线。
我在项目中遇到过一件事:有个同事为了省事,把 1.2.3 的固件改了改,重新编译后还是叫 1.2.3,结果生产线上烧录了两次不同的固件,出了大问题。从那以后,我要求每次编译都必须自动生成版本号,绝不允许手动改。
4.2 如何给固件打标签 —— Git Tag 实战
版本号定好了,怎么把它和代码关联起来?答案就是 Git 标签(Tag)。
标签就像给代码库里的某个提交贴一个书签。你随时可以回到这个版本,重新编译出完全一样的固件。
Git 标签分两种:
- 轻量标签:只是一个指针,指向某个提交。适合临时标记。
- 附注标签:包含标签名、标签信息、签名等完整信息。我强烈建议用附注标签,因为它记录了谁在什么时候打了这个标签,方便追溯。
打标签的命令很简单:
# 打一个附注标签
git tag -a v2.1.0 -m "Release version 2.1.0: 新增旅行锁功能,修复电量显示bug"
# 推送到远程仓库
git push origin v2.1.0
# 查看所有标签
git tag -l
# 查看某个标签的详细信息
git show v2.1.0
你想想看,如果团队里每个人都按这个规范来,是不是清晰多了?
我的小技巧:我会在每次发布前,先在本地打一个 v2.1.0-rc.1 的候选标签,测试通过后再打正式标签 v2.1.0。这样万一测试没通过,删掉候选标签就行,不影响正式版本。
4.3 发布流程 —— 从代码到固件的最后一公里
好了,版本号有了,标签也打了,接下来就是发布流程。这个流程我建议用自动化工具来跑,比如 Jenkins、GitLab CI 或者 GitHub Actions。手动操作太容易出错了。
我总结了一个标准的发布流程,分五步:
- 代码冻结:在发布前,所有新功能停止合并,只允许修 bug。这个阶段通常持续 1-3 天。
- 打候选标签:在冻结后的代码上打
v2.1.0-rc.1标签,触发自动化构建和测试。 - 回归测试:自动化测试跑一遍,包括单元测试、集成测试、硬件在环测试。如果有问题,修 bug 后重新打候选标签。
- 打正式标签:所有测试通过后,打正式标签
v2.1.0,触发生产构建。 - 发布固件:将构建好的固件文件(通常是 .hex 或 .bin)上传到 OTA 服务器或发给生产部门。
这里有个表格,可以更直观地看每个步骤的输入和输出:
| 步骤 | 输入 | 输出 | 负责人 |
|---|---|---|---|
| 1. 代码冻结 | 开发分支 | 冻结分支 | 技术负责人 |
| 2. 打候选标签 | 冻结分支 | rc 标签 | 版本管理员 |
| 3. 回归测试 | rc 标签 | 测试报告 | 测试工程师 |
| 4. 打正式标签 | 测试通过 | 正式标签 | 版本管理员 |
| 5. 发布固件 | 正式标签 | 固件文件 | 发布工程师 |
我曾经踩过的坑:有一次,我忘了在打正式标签前确认测试报告,结果发布的固件有个严重的蓝牙连接 bug。那批货已经发到客户手里了,最后只能紧急召回。从那以后,我要求每一步都必须有明确的审批记录,谁签的字、谁跑的测试,全部留痕。
4.4 发布后的收尾工作
固件发布出去,不代表事情就结束了。还有几件事要做:
- 更新 CHANGELOG:把这次发布的改动记录下来,方便以后查阅。我习惯用
keepachangelog.com的格式。 - 合并回开发分支:如果发布分支是从开发分支拉出来的,记得把修复的 bug 合并回去。
- 通知团队:在群里发个公告,告诉大家新版本发布了,有哪些改动,有什么注意事项。
嗯,到这里,标签与发布的内容就讲完了。说白了,版本管理不是技术问题,是习惯问题。养成好习惯,能省掉无数麻烦。