多个功能分支和持续集成

Phi*_*ale 20 continuous-integration

我最近一直在阅读关于持续集成的一些内容,并且有一种情况可能会发生,我不明白如何正确处理.

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

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

Ale*_*ček 10

适当的CI中没有功能分支.使用功能切换.

  • 这是过于简单的:尽管我写了一个[功能标志实现](https://dev.launchpad.net/LEP/FeatureFlags)并喜欢这个想法,但它们并不是灵丹妙药.并非每个项目或每个功能都适合运行时切换,并且并非人们可能引入的每个错误都可以通过标志禁用,或者通过基于标志的测试捕获.人们可以合理地希望拥有至少可以存活几周的功能分支,并且可以定期进行测试. (20认同)
  • 我不同意这个功能切换的事情.源控制软件具有多个功能.其中之一是处理源代码的更改和备份.即使开发人员的代码无法编译或不能构建或者不够稳定以进行生产,开发人员也应该能够拥有源代码控制的可靠性.并非所有修改都能在几个小时内完成......分支机构可以让您的代码安全无需破坏行李箱. (10认同)
  • 功能切换是一个可怕的想法.几乎不可能以这种方式切换和隔离版本之间的变化,因为并非所有正在开发的功能都是完全相互隔离的:它们可能共享大量代码,或者切换功能的工作可能包括对公共库的更改,因此切换不会隔离此更改.未完成的功能的代码不应位于开发/中继分支期间.如果从主干和后退的前向合并不是太远,则没有理由不能将功能分支与CI一起使用. (10认同)
  • #ifdef SOME_FEATURE_IS_ENABLED(或者它的Web2.x解释语言亲属),是一个可怕的,可怕的想法. (6认同)
  • 你为什么这么认为?功能切换很棒但是生活在功能分支中的人希望在将功能推出切换或非切换之前获得CI的好处. (2认同)
  • 您所做的每项更改都可能很小,因此您永远不会签入无法编译的代码。这是 CI 的真实信息:) (2认同)

小智 9

本文中更充分地解释的想法是每天从主干/发布分支​​到功能分支合并,但只有在功能符合您的"完成"定义时才会向​​另一个方向合并.

一个功能团队编写的代码一旦完成就会被推入主干,并将作为每日合并过程的一部分"分发"给可以处理冲突的其他团队.

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

我个人并没有尝试在完成之前将代码重新集成到发布分支中,虽然我从未真正尝试过,但我确信构建功能切换为未完成的工作有其自身的问题.