目标
切发布分支而不加保护,只是制造了第二个可以出现未评审变更的地方。本工作流把冻结做成机制而不是期望:分支保护拒绝一切除评审过的 cherry-pick 之外的进入,发布候选只从不可变的 tag 构建,让“末期变更走通道”从口号变成平台强制。
步骤要点
- 先在 main 上跑完整 CI 流水线,测试、安全扫描、构建产物全绿并记录运行链接,确认被切提交可发布。
- 从验证过的提交切出 release/1.8 分支,命名编码版本号,分支头与绿色运行对应同一提交。
- 对发布分支启用分支保护:禁止直推,只允许带 fix 或 cherry-pick 标签的评审 PR 合入。
- 文档化 cherry-pick 路径:末期变更先落 main(或修复分支),再拣选进发布分支,PR 描述必须附原始链接。
- 在发布分支上打 v1.8.0-rc1 标签并只从该 tag 出构建产物,重建 tag 应复现同一产物哈希。
排错提示
直推仍能成功说明分支保护漏配或管理员旁路被滥用,审计保护设置与管理员例外清单;发布分支出现无 PR 引用的裸提交,就是有人手改了代码,退回并要求走评审通道;候选构建与 tag 哈希对不上是在移动的分支头上构建的,改流水线以 tag 为唯一触发源。
适用边界
本流程不解决 main 本身常红的问题,主干红率高应引入集成分支而不是放弃冻结;冻结会推迟未拣选的特性,产品侧要接受并沟通发布窗口的取舍。
代码示例
# cut from a verified green commit
git checkout -b release/1.8 <verified-sha>
git push origin release/1.8
# protect: no pushes, PR-only, required reviews
# every late fix:
git checkout main && git cherry-pick <fix-sha>
git checkout release/1.8 && git cherry-pick <fix-sha>
git tag v1.8.0-rc1 release/1.8 && git push origin v1.8.0-rc1