【问题标题】:Multiple feature branches and continuous integration多个功能分支和持续集成
【发布时间】:2011-06-24 00:25:36
【问题描述】:

我最近一直在阅读有关continuous integration 的内容,并且可能会发生一种我不知道如何适当处理的情况。

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

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

【问题讨论】:

    标签: continuous-integration


    【解决方案1】:

    现在有一些很好的资源展示了如何结合 CI 和特性分支。 BambooFeature Branch Notifier 是一些查看方式。

    this 是另一篇相当长的文章,展示了所谓分布式 CI 的优点。下面,摘录一段解释好处:

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

    仍然具有挑战性的一件事是保持分支构建隔离,这样它就不会通过将其分支构建推送到它来污染您的二进制存储库。 Bamboo 似乎解决了这个问题,但不确定 Jenkins 是否那么容易。

    【讨论】:

      【解决方案2】:

      根据我在 CI 方面的经验,您应该按照其他人的建议使您的功能分支与主线保持同步的方式发生了变化。这一直在为我工作了几个版本。如果您使用颠覆,请确保您与合并历史启用合并。这样,当您尝试将更改合并回线时,它只会像您将功能更改合并到线一样,而不是尝试解决您的功能可能与主线发生的冲突。如果您使用更高级的 VCS,例如 git,第一个合并将是一个变基,第二个将是一个合并。

      Feature branches with Bamboo这样的工具可以帮助您更顺利地完成细化工作

      【讨论】:

        【解决方案3】:

        将功能分支提交回主线,并且经常是持续集成的基本功能。有关详细信息,请参阅This Article

        【讨论】:

          【解决方案4】:

          更全面地解释in this article 的想法是每天从主干/发布分支​​合并到功能分支,但只有在功能满足您对“完成”的定义时才在另一个方向合并。

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

          这并没有满足 Nick 对可以用作备份工具的版本控制系统的渴望,除非所做的更改足够小,以至于它们可以在某个时间范围内提交到功能分支失去工作的风险是可以接受的。

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

          【讨论】:

          • 你要么在做持续集成,要么不做。在 CI 下,提交应该每天都集成到主线中。这意味着您不仅应该从主干合并到特征分支,还应该每天将特征分支合并到主干,这超出了首先拥有特征分支的目的。简单来说,特性分支与 CI 不兼容
          【解决方案5】:

          正确的 CI 中没有特征分支。请改用feature toggles

          【讨论】:

          • 你为什么这么认为?功能切换很棒,但生活在功能分支中的人希望在将功能推出切换或非切换之前获得 CI 的好处。
          • 我不同意这个功能切换的东西。源代码控制软件有几个特点。其中之一是处理源代码的更改和备份。即使他们的代码未编译或未构建或对于生产来说不够稳定,开发人员也应该能够拥有源代码控制的可靠性。并非所有修改都可以在几个小时内完成...分支可以让您的代码安全而不会破坏主干。
          • 这太简单了:尽管我写了feature flag implementation 并且喜欢这个想法,但它们并不是万能的。并非每个项目或每个功能都适合运行时切换,也不是人们可能引入的每个错误都可以在以后通过标志禁用或被基于标志的测试捕获。人们可以合理地希望拥有至少存活几周并定期测试的功能分支。
          • #ifdef SOME_FEATURE_IS_ENABLED(或者它是 Web2.x 解释语言的亲属),是一个可怕的、可怕的想法。
          • 功能切换是个糟糕的主意。以这种方式关闭和隔离版本之间的更改几乎是不可能的,因为并非所有正在开发的功能都彼此完全隔离:它们可能共享大量代码,或者关闭功能的工作可能包括对公共库的更改,因此切换关闭不会隔离此更改。不完整的功能代码不应在 dev/trunk 分支期间。如果来自主干和后向的前向合并相距不太远,那么没有理由不能将特征分支与 CI 一起使用。
          【解决方案6】:

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

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

          【讨论】:

          • 这就是我所说的,但我可能措辞不是很好。我的问题是关于与拥有 多个 功能分支并希望遵循 CI 实践相关的问题
          • 多个功能分支并不特殊;它们中的每一个都必须易于合并到主线中并独立工作。如果合并了另一个分支,则该更改需要传播到其他功能分支,这可能需要手动解决 - 但是这是您无法避免的事情,但至少您是在功能分支中而不是在主线中执行此操作。
          猜你喜欢
          • 2014-01-08
          • 2017-04-15
          • 1970-01-01
          • 2011-08-02
          • 2023-03-08
          • 1970-01-01
          • 2017-06-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多