Git 分支模型策略

Git branching model strategy

我们正在尝试遵循 gitflow 分支模型,但有所不同。

我们有四个可以部署产品的服务器环境,每个服务器都有一个用途:开发、内部测试、外部测试和生产。

我们正在努力使合并/冲突解决尽可能简单,因此我们创建了两个不属于 gitflow 模型的额外分支。

正常的 gitflow 分支

还有这两个不标准的分支,可能需要更改...

然后流程如下:

我们是不是搞砸了整个 gitflow 模型?

这是我们的分支过程:

为了回答你的问题,不,你并没有搞乱 gitflow 模型——进一步扩展它以满足你的需要。

通过将环境耦合到给定的分支,您可以在构建版本时为自己提供更大的灵活性。也就是说,假设您有两个正在进行的非依赖特性(特性 1 和 2),它们都已合并到您的 'TestServer' 分支中。如果功能 1 未通过测试,功能 2 仍然可以在没有功能 1 的情况下进一步推进 - 这是因为您合并到 'TestServer' 是单向合并 - 没有任何结果,没有历史记录。相反,您的功能 2 分支合并到 'develop' 并最终合并到 'master'.

我们正在 adopting/developing 制定与您类似的策略。 我们的关键要求是适应不可避免的特征选择。请注意,尽管我们的解决方案相当复杂,但它是为企业应用程序设计的,作为由多个企业所有者拥有的多种服务的平台,并利用多个内部框架..

环境

  • QA:供开发人员确保他们的功能是可测试的。
  • 阶段:供项目经理/测试经理在 UAT 测试之前通过各种 'Business Owners'
  • 进行冒烟测试
  • UAT:由 'Business Owners'
  • 进行全面测试和业务签署
  • BETA:只是 deployment/release
  • 的测试
  • 直播:..

这些环境分为两类,'in-test'(QA、Stage 和 UAT)和 'production'(BETA 和 LIVE)。

分支机构

从测试问题到监管问题,功能优先级排序经常变化 restrictions/requests。为了适应这一点,创建了多个分支来表示 environment/categories,如下所示:

  • Master:代表最后一个production release
  • Release-Candidate:下一个 production release
  • 的功能集合
  • UAT:代表UAT环境
  • 阶段:代表'QA'和'Stage'
  • Feature-xxx:用于功能开发

我们还根据需要使用 Master 的 HotFix 分支,并在 'Pre-Production' 分支中准备生产版本(纠正遗漏的版本增量等 - 次要内容)。

我们使用中的分支图:

分支与合并/工作流

  1. 我们总是从 Release-Candidate 分支新功能,因为这个分支总是包含 'Committed for production' 功能。一旦做出生产承诺,就没有任何跳跃。

  2. 一旦一项功能准备好进行测试,它就会(单向)合并到 'Stage'。这会触发 CI 构建并部署到 QA。

  3. 如果 QA 服务器看起来稳定,开发人员会触发自动部署到 Stage。

  4. 如果需要更改,请在功能中进行更改并重复。如果可以进行业务测试,则从 Feature 合并到 UAT。这将部署到 UAT。

  5. 如果功能未通过业务测试,则更改功能并重复。如果功能延迟,则不采取任何措施。如果功能正常并已签署,则合并到发布候选版本。

  6. 一旦功能集合(1 个或多个)在发布候选版本中,通过从发布候选版本合并到主版本(通过预生产)触发生产部署。

  7. 部署失败,然后HotFix。如果可以,部署到 Live。

我们使用 TFS 的工作流程如下所示:

发布工作流程

最后,每个 environment/category 的部署看起来像这样:

Git是一个版本控制系统。它维护源代码及其更改。开发停止在开发阶段。在那之后,源代码应该不会改变。

当您将项目移至下一阶段(测试、发布、生产)时,您不应交付源代码,而应交付从标记版本构建的二进制文件,因为:

  • 源代码在不同环境下没有变化,
  • 两个构建可能提供两个不同的二进制文件(更改依赖项)
  • 不同版本的维护会很困难。例如,
    • 项目多版本需要支持
      • 框架项目
      • A/B 测试
      • ...
    • 错误修正。想象一下,当新版本在测试服务器上发布时,您需要从生产环境中进行修补程序。此修补程序需要经过相同的流程(测试、发布、生产)。所以你需要用错误修复覆盖测试分支,然后合并回新的发布版本。这不是显而易见的,也不是必需的,并且可能会导致最初打算使用不同的代码。实际上,对于每次合并,在开发之后,都存在源代码可能与预期不同的不必要风险。您可能需要解决产品中的合并冲突。

所以它可能不会干扰git-flow模型,但我认为这些点值得考虑。 实际上,我不是 git-flow 策略的忠实拥护者。如果你有时间给这些机会:

https://barro.github.io/2016/02/a-succesful-git-branching-model-considered-harmful/ https://trunkbaseddevelopment.com/