基于主干的开发:何时分支发布


不管您使用的是Git,Mercurial,Subversion,Perforce还是TFS。下面的定义对每一个都是相同的。

未分支释放

下面是Maven在Git回购中为我做的一个实际发布:

证据是两次提交--一次用于FluentSelenium的V1.16,下面的一次用于1.16.1-SNAPSHOT(SNAPSHOT是Maven用于正在进行的工作的代码短语)。Maven把1.16罐推到了全球可用的回购。

不管怎么说,我不是为了释放而做分支的。当然,我需要其他提交者在我发布时不要提交。对于其他语言和其他构建技术,或者没有使用Maven的发布插件的Java团队,它可能不会执行提交来表示“发布正在发生”。在未受污染的提交历史事件中,我能够从特定的提交(或标记)执行发布,而不需要开发人员在主干之外停留几分钟。

擅长连续交付(CD)的团队是这样做的--直接从主干中释放。也许不是每一次提交,而是至少通过了多阶段连续集成(CI)管道中的每一次自动化测试的提交。

版本里有窃听器?

如果你是一个硬核CD团队,你可能会做另一个版本从trunk来修复这个bug。

如果您进入生产的节奏不是一天几次,您可能更喜欢修复主干上的bug,cherry将bug修复选择到适用的发布分支。当然,您没有这样做,所以您迟来地从右侧的commit hash/num创建了一个发布分支,专门用于这个bug修复(以及其他可能的修复),然后进行cherry选择。这样做的团队通常希望手动测试bug已经基于来自该分支的构建被补救。如果您已经开始努力创建一个分支,那么您可以将主干的持续集成管道克隆到一个保护该分支的管道中。

用于释放的分支

注意:我把一张剪辑好的图片显示了一些并没有发生的事情。分支将从特定的提交(或标记,或仅仅是头部)生成,并在发布前的几天或几小时内为该发布命名:

该企业打算加强对该分支的释放。在分支上的第一个,也可能是唯一一个真正的提交是更新版本号以表示意图的提交--在本例中是发布的“候选发布”。其他企业可以直奔“1.16”。您还总是将主干的CI管道克隆到保护该分支的管道中。

在主干上没有提交(在我这里的例子中是Git的主控)。因此,开发人员完全不必放慢对分支的承诺速度。尤其不是在其他分支模型中流行的可怕的代码冻结。我说的是你,Clearcase!

合并Bug修复从发布分支返回到主干?

如果你可以先在主干上做,然后把cherry pick转到release分支上,那就不行了。没有退步的风险。注:回归意味着“事情倒退”,“回归测试”意味着保护事情没有倒退的机制。

何时删除发布分支?

当您安全地进入下一个发布周期时--这意味着您已经完成了对prod的部署,并且它将继续使用。是的,您应该在发布分支不再使用之后删除它们。它们在历史上仍然存在,但是如果一次只有几个释放分支在使用,合并梅斯特可能不会选择错误的分支。光盘式消防水带从主干进入生产,应该是你的目标虽然。即没有分支机构。

为什么选樱桃?

因为您只希望release分支(如果您创建了它)与创建时的不同程度尽可能小。

更多阅读

当然,我已经写了八年多了,也练习了17年多。

下面是一篇文章,其中列出了一些与基于trunk的开发相关的实践图表:trunk supporting practices

还有我的全部trunk based development category