Gitflow流程为何生产部署用main标签制品而非测试过的release制品?
Gitflow分支模型跨环境重新构建制品的设计原因
Gitflow这套规则和「同制品跨环境部署」思路的差异,本质是设计目标、诞生时代的工程能力约束共同导致的,不是故意违背CI/CD最佳实践,核心原因有几个:
- 首先是诞生阶段的工程能力限制。Gitflow是2010年前后提出的分支模型,那个年代不可变制品仓库、构建环境全固化、制品溯源签名这些现在DevOps的标配能力还没普及。当时绝大多数团队根本没有「制品唯一对应源码哈希、构建后永不修改」的意识,甚至很多团队连统一的管控构建机都没有,开发本地打个包就传去测试了。那时候的构建可重复性极差:同一份源码在不同时间、不同环境构建出来的产物可能完全不一样,比如构建时拉到了第三方依赖刚推送的兼容补丁版本、构建机的运行时版本偷偷自动升级,都会导致制品逻辑出现差异。当时的工程共识反而是:基于正式合入main分支的标签代码,在干净的、生产级管控的构建环境里重新打包,比直接拿测试环境的临时构建包推生产更可靠。
- 其次是分支语义的强绑定设计目标。Gitflow从一开始就不是给随时发版的互联网服务设计的,它的目标用户是有明确版本迭代周期、需要长期维护多个历史正式版本的项目,比如传统桌面软件、企业级本地部署软件。这套模型里的分支有非常明确的生命周期和语义:
release分支是临时的版本冻结分支,从develop切出后只允许修阻塞性bug,不允许加新功能,QA在这个分支的验证本质是确认待发布内容的可用性,这个分支的最终归宿就是测试通过后被合并删除,不会永久留存。
只有合入main分支后打的版本标签,才是永久可追溯的正式版本基线——后续要找生产某版本对应的源码、给历史版本打热修复补丁,都要基于main分支的标签来做。如果生产直接部署临时release分支构建的制品,等分支删了之后,过几个月想溯源当时的生产代码、排查线上问题,根本找不到对应的代码基线,完全不符合版本可追溯的基本要求。至于测试通过后把release同时合入develop,是为了把release阶段修的所有bug同步回开发主线,避免后续新版本重复踩同样的坑。 - 最后是适配当时的流程管控要求。Gitflow流行的年代,绝大多数企业的生产发布权限是高度收敛的:测试环境的构建、部署权限通常开放给开发和QA,但是生产部署的产物必须来自受控的、有完整审批留痕的正式分支。当时还没有成熟的制品权限管控、漏洞扫描、篡改校验机制,直接把测试环境流转过来的制品推生产,在合规层面没法证明这个制品在测试到生产的流转过程中没被篡改、没夹带未审批的代码,而基于main分支正式标签重新构建的流程,天然符合当时的审批留痕要求。
需要说明的是,现在大家熟悉的「一次构建、多环境流转」是DevOps工具链成熟后的实践,核心是靠不可变制品仓库、制品签名、全链路溯源、构建环境100%固化来兜底,这套实践和Gitflow并不冲突——你完全可以在release分支测试通过后,把当时验证过的制品直接绑定到main分支对应的版本标签上,不需要重新构建,这属于Gitflow在现代工程体系下的适配,不是原设计有问题,是原设计提出的时候,支撑同制品跨环境部署的技术条件还不具备。
内容的提问来源于stack exchange,提问作者suppix
相关产品推荐
相关产品推荐

