Continuous integration 多特征分支与连续集成

Continuous integration 多特征分支与连续集成,continuous-integration,Continuous Integration,我最近读了一些关于这方面的书,有一种情况可能会发生,我不知道如何恰当地处理 我们有一个稳定的主线/主干分支,并为功能创建分支。每个开发人员都将通过定期将主干合并到分支中来保持自己的功能分支最新。但是,完全有可能在几个星期或几个月的时间内创建和处理两个或多个功能分支。在此期间,可以部署许多版本的软件。这就是我困惑的地方 一个要素分支的更改很可能会导致与其他要素分支的合并冲突。CI建议您至少每天合并到主干中,这样可以快速解决冲突。但是,您可能不希望将功能代码合并到主干中,因为它可能尚未完成,或者您可

我最近读了一些关于这方面的书,有一种情况可能会发生,我不知道如何恰当地处理

我们有一个稳定的主线/主干分支,并为功能创建分支。每个开发人员都将通过定期将主干合并到分支中来保持自己的功能分支最新。但是,完全有可能在几个星期或几个月的时间内创建和处理两个或多个功能分支。在此期间,可以部署许多版本的软件。这就是我困惑的地方


一个要素分支的更改很可能会导致与其他要素分支的合并冲突。CI建议您至少每天合并到主干中,这样可以快速解决冲突。但是,您可能不希望将功能代码合并到主干中,因为它可能尚未完成,或者您可能不希望该功能在下一版本中可用。那么,您如何处理这种情况,并且仍然遵循日常代码集成的CI原则呢?

我认为它们意味着将主线合并到功能分支中,而不是反过来。这样,特性分支将不会太多地偏离主线,并保持在易于合并的状态


git人员在提交功能之前,通过在主分支的顶部重新设置功能分支来做同样的事情。

在适当的CI中没有功能分支。改用

更详细地解释的想法是每天从主干/发布分支合并到功能分支,但只有在功能满足您的“完成”定义后,才能从另一个方向重新合并

一个特性团队编写的代码在完成后将被推送到主干中,并将“分发”给其他团队,作为日常合并过程的一部分,在其他团队中可以处理冲突

这还不能满足Nick对版本控制系统的需求,该系统可以用作备份工具,除非所做的更改足够小,可以在可接受的时间范围内提交给功能分支,而丢失工作的风险是可以接受的


我个人不会在发布分支完成之前尝试将代码重新集成到发布分支中,尽管我从未真正尝试过,但我确信构建功能切换到未完成的工作中也有自己的问题

功能分支提交回主线,通常是持续集成的基本功能。有关详细的分类,请参见《我的CI经验》中的

,即按照其他人的建议,使功能分支与主线更改保持最新的方式。这对我来说已经有好几个版本了。如果您正在使用subversion,请确保使用“合并历史记录”启用合并。这样,当您试图将更改合并回行时,它只会像您将功能更改合并到行一样,而不是试图解决功能与主线可能存在的冲突。如果您使用的是更多像git这样的高级风投,那么第一次合并将是一次重新基础,第二次合并将是一次合并


有一些工具可以支持您更顺利地完成类似的工作

现在有一些很好的资源展示了如何结合CI和功能分支。或者是一些看的方式

这是另一篇很长的文章,展示了所谓分布式CI的优点。以下是一段摘录,解释了这些好处:

分布式CI具有连续部署的优势,因为它保持了一个干净、稳定的主线分支,可以随时部署到生产环境中。在集中式CI过程中,如果代码未正确集成(构建中断)或集成了未完成的工作,则会存在不稳定的主线。这在迭代发布计划中非常有效,但会为持续部署造成瓶颈。从开发人员分支到生产部门的直接线路必须在CD中保持干净,分布式CI通过仅允许生产就绪代码放入主线来做到这一点


有一件事仍然具有挑战性,那就是保持分支构建的隔离,这样它就不会因为将分支构建推送到二进制文件存储库而污染二进制文件存储库。竹似乎解决了这个问题,但不确定与詹金斯相处是否那么容易。

这就是我所说的,但我可能没有说得很好。我的问题是关于与拥有多个功能分支和希望遵循CI实践相关的问题多个功能分支并不特别;它们中的每一个都必须能够很容易地合并到主线中并独立工作。如果合并了另一个分支,那么该更改需要传播到其他功能分支,这可能需要手动解决--但是这是您无法避免的,但至少您是在功能分支中而不是在主线中这样做的。您为什么这样认为?功能切换非常好,但是居住在功能分支中的人希望在将功能推出切换或非切换之前获得CI的好处。我不同意这种功能切换。源代码管理软件有几个功能。其中之一就是负责源代码的更改和备份。开发人员应该能够拥有源代码控制的可靠性,即使他们的代码没有编译、没有构建或者对于生产来说不够稳定。不是所有的修改都能在几个小时内完成。。。分支允许您的代码在不破坏主干的情况下保持安全。这太简单了:尽管我写了一篇文章并喜欢这个想法,但它们并不是万灵药。并不是每个项目或每个特性都可以通过运行时切换,也不是每个人可能引入的bug都可以通过标志禁用,或者被基于标志的测试捕获。人们可以合理地希望功能分支至少运行几周,并定期进行测试