在进行持续集成时,什么是最好的分支策略呢?
- 发布分支: 在主干上开发,为每个发布版本保留一个分支。
- 特性分支: 在单独的分支中开发每个特性,在稳定后再合并。
在相同的项目中同时使用这两种策略是否有意义呢?比如说,你可以为每个发布版本和大型特性创建分支。这两者之间哪一种策略更适合持续集成?在使用不稳定的主干时,使用持续集成是否有意义呢?
在进行持续集成时,什么是最好的分支策略呢?
在相同的项目中同时使用这两种策略是否有意义呢?比如说,你可以为每个发布版本和大型特性创建分支。这两者之间哪一种策略更适合持续集成?在使用不稳定的主干时,使用持续集成是否有意义呢?
我发现这个话题非常有趣,因为在我的日常工作中我严重依赖分支。
希望你会找到这些链接很有趣。
如果团队规模少于50名开发人员且源代码控制系统没有类似CVS或SVN的稀疏分支和适当的合并能力,则上述模型不太合理。这将使整个模型的设置、管理和集成成为噩梦。
我认为在持续开发中,任何一种策略都可以使用,只要记住其中一个关键原则:每个开发人员每天都要向主干提交代码。
http://martinfowler.com/articles/continuousIntegration.html#EveryoneCommitsToTheMainlineEveryDay
编辑
我正在阅读有关CI的这本书,作者建议使用按发布分支的策略。我同意这种做法。在使用CI时,按功能分支没有意义。
我将尝试解释我为什么这样想。假设三个开发人员各自拿出一个分支来处理一个功能。每个功能需要几天或几周才能完成。为了确保团队持续集成,他们必须每天至少提交一次到主分支。一旦他们开始这样做,他们就失去了创建功能分支的好处。他们的更改不再与其他开发人员的更改分离。既然如此,为什么要先创建功能分支呢?
使用按发布分支的方式需要较少合并分支(总是一件好事),确保所有更改尽快集成,并且(如果正确执行)确保您的代码库随时准备好发布。按发布分支的缺点是您必须对更改更加小心。例如,大型重构必须逐步完成,如果您已经集成了下一个版本不需要的新功能,则必须使用某种功能切换机制隐藏它。http://jamesmckay.net/2011/07/why-does-martin-fowler-not-understand-feature-branches/
我使用抽象分支、暗中发布和有时特性标志。回报是快速、明确(至少按我的测试质量)的反馈。
当我们开始组建团队时,我们从最初开发系统的供应商那里继承了一个基于发布的策略。这个策略一直有效,直到我们的客户要求在发布中不包括几个已经开发好的功能(FYI ~250k行代码,~2500个文件,Scrum和XP SDLC)。
然后我们开始研究基于功能的分支。这种方法也有效了一段时间——大约两个月,直到我们意识到回归测试过程需要超过两周的时间,再加上不确定会发布哪些内容,这带来了很大的不便。
纯SC策略的最后一根稻草是当我们决定应该有1. 稳定的主干和2. 生产环境应该包含ST、UAT和回归测试过的二进制文件(不仅仅是源代码——想想CC)。
这促使我们设计了一种介于基于功能和基于发布的SC策略之间的混合策略。
所以我们有一个主干(trunk)。每个sprint,我们会从主干分出一个sprint branch(对于非敏捷的人来说,sprint只是一个基于复杂度可变的时间限制开发),然后在这个sprint branch上创建功能分支,开始并行开发。一旦功能完成和系统测试通过,并且我们收到部署的意图,它们就会合并到sprint branch中。有些可能会跨越几个sprint,通常是更复杂的。当sprint接近其结束并且功能已完成时......我们将sprint branch“重命名”为“回归测试”(这使得CruiseControl可以在不进行任何重新配置的情况下获取它),然后在cc-built EAR上开始执行回归测试/集成测试。当所有测试完成后,它就可以投入生产了。