高级分支和合并策略(第 1 部分,共 2 部分)| Mendix

跳到主要内容

高级分支与合并策略(第 1 部分,共 2 部分)

  • Mendix

  • 2016 年 10 月 21 日
  • 分钟阅读

在这个由两部分组成的博客系列中,我将介绍适用于复杂操作环境的高级分支和合并策略。这些策略基于我目前和过去客户的个人经验,这些客户有多个项目,并且正在进行并行维护。

在第一部分中,我将简要介绍一种基本策略,因为我假设这是大多数人使用的策略。这是 Mendix 项目,并直接基于以前的 Mendix 博客和版本控制概念文档。接下来,我将解释一种遵循“主干中无垃圾”原则的分支和合并高级策略。下一篇博客将介绍第二种策略。

我假设读者对分支和合并、Subversion(SVN)和 Mendix,如中所述 Mendix 有关版本控制概念的文档。不过,我将简要解释如何在建模器中进行分支和合并。

基础策略(默认):以主线为特色

大多数 Mendix 项目,因为它是每个项目的默认起点。当项目变得更大并且已经上线时,通常会继续采用这种方法。在这种策略中,主线用于几乎所有类型的开发:所有更改都提交到主线,并且仅使用主线进行部署。更改一个接一个地提交,通常会混淆,并且在此基础上再次提交错误修复。因此,更改只能作为“一揽子交易”交付 - 全部接受或放弃。

一旦部署了某个版本,纠正错误部署的选项就很有限了。例如,1) 恢复到以前的模型包,2) 恢复最新的提交(并丢失您的工作)并生成新包,或 3) 继续开发并纠正错误部分。根据我的经验,后一种选择是迄今为止最常采用的。请注意,回滚最新的提交本身就是一个有风险的选择,之后仍然需要测试和提交新模型。

一个一般的善意建议:尽快放弃这一基本策略。例如,一旦在测试环境中部署了稳定版本,或者最迟在首次发布到生产环境时。当然,你可能会想:还有什么替代方案?可以做得更好吗?哪里还有改进的空间?

首先,你应该采用“后备箱内没有垃圾。“一般来说,这意味着:

  • 所有开发都在分支上进行(永远不会在主线上进行)
  • 主线是新分支的一般起点
  • 只有经过全面测试的变更才会合并到主线
  • 合并到主线后,需要合并回所有活动分支。如果继续在分支上进行开发,还需要合并回源分支。这是为了确保所有分支保持同步。

维护和项目策略

“后备箱里没有垃圾”原则的应用引领我们走向策略 1:维护和项目并行的策略。在这个策略中,可以区分出以下分支:

  • 主线
  • 持续维护分支,例如, 维护 or 照常营业 (伯利恒)
  • 可选 项目 用于主要变更的分支或功能分支
  • 此外,还可以有针对小型生产补丁的修补程序分支

采用这种策略,变更只发生在分支上:主要发生在 维护项目 分支。部署到测试环境是在从相应分支生成的包上进行的。测试成功完成后,更改将合并到主线。之后,必须将提交合并回所有活动分支以保持所有内容同步。生产部署是从主线的版本化包完成的,有时是从测试过的修补程序线完成的。

下图直观地展示了该策略的主要活动。时间从左到右,三个分支显示为水平线:维护分支、主线和项目分支。分支上提交的每个更改都以该线上的圆圈表示。在维护分支线上进行了两组更改并提交(1 和 2)。这些更改最初使用直接从该线生成的部署包进行测试。在完成并接受所有测试后,更改将合并到主线。在图中,合并显示为箭头。合并后,更改将提交(3),然后合并到项目分支线(4)。最后,在编号 3 处提交的更改将合并回维护分支线(5),以确保所有线都同步。

分支和合并项目图表

如何在 Mendix 建模师

要开始使用分支,任何项目的先决条件是启用团队服务器。最简单的方法是使用团队服务器启动任何项目。只需这样做,反正它是免费的。或者,可以在稍后使用选项 上传至团队服务器... ,在 团队 菜单。

上传至团队服务器

分枝

必须对维护线进行初始一次性设置。随着项目的来来去去,需要为项目创建新的分支。不要忘记清理旧的项目分支。此外,您可能需要为功能开发或修补程序创建一个新分支。可以使用菜单选项创建分支 管理支线… 来自 团队 菜单项。

管理支线

如果是维护或项目的新分支,则选择的来源通常应该是主线的最新版本。如果是功能或修补程序分支,则取决于其用途。这样的分支可以独立存在,也可以是维护或项目的子分支。

创建支线

无论如何,每条分支线都需要交付其更改,至少是维护和项目。分支线也需要保持同步,这就是合并的作用所在。有时,功能分支线会存在较长时间,您可能也需要保持它们同步。如果不同步分支线,迟早会遇到复杂的版本冲突。

合并

合并是通过 在此合并更改... 在选项 团队 菜单。一开始,面对三个选项可能会让人感到害怕。但是,只要仔细阅读(实际上,这里不会出错,因为无效选项将被禁用)。

合并

合并窗口

将项目或维护分支中的分支线变更合并到主线通常可以使用 端口修复 or 合并功能分支 选项。使用 移植修复 选项,您仍然可以选择合并一个或多个修订版本。 港口特色分行 选项不允许这样做,并且会合并所有之前未合并的修订。

支线

端口修复 窗口

港口特色分行

港口特色分行 窗口

使用打开其中一条分支线的建模器,您将没有前两个选项,只剩下 高级合并 选项。在那里,您必须选择要合并的分支线,以及要包含在合并中的开始和结束修订。修订的选择非常有用,因为您不一定想在合并中包含所有内容。

合并窗口

最后,请注意,所有合并(以及所有其他 Subversion 操作)都可以在适用于 Windows 的 Tortoise SVN 客户端中完成。Tortoise SVN 还通过特殊选项方便重新集成合并或合并回退。请注意,并非所有版本都与 Mendix SVN 设置。检查 Mendix 如果您有兴趣使用 Tortoise,请参阅正确版本的参考指南。

就我个人而言,我喜欢在 Mendix Modeler。我安装了 Tortoise,以便查看 Windows 资源管理器中可见的图标,这样我就可以直接查看项目文件夹的状态。此外,Tortoise 还提供了一个文件查看器,可以从 Mendix Modeler 中您可以比较不同(冲突)版本的 Java 文件,这在某些情况下非常有用。

结语

那么到目前为止,我对这个策略的体验如何?我必须说,它效果很好,并且是控制变更和版本的良好一步。这是一个很好的模型,它很简单,并且提供了所需的一切。然而,随着时间的推移,这种策略带来了许多挑战:

  1. 功能更改和修复可能会在开发分支中堆积起来,并导致全有或全无的一揽子交易(更多内容请参阅下一篇博客)
  2. 将测试环境中的部署分支与项目和维护分支线的变更结合起来是困难的,有时甚至是不可能的(当出现大量冲突时)

最后,让我们回顾一下这些策略的适用性以及我们在使用这些策略时获得的经验教训。上述策略在以下情况下很有用:

  • 当你想将维护和项目工作分开时
  • 对于需要单独开发多个功能和修复的版本
  • 针对高风险与低风险变更轨迹

对所提出的策略的最终评价是,它是一个很好的模型。它在实践中效果很好,而且很容易理解。我们成功地使用了这一策略一年多,直到我们因其局限性而遇到严重问题。更多内容请参见本博客的第二部分。

在此处阅读第 2 部分

谢谢

感谢 Richard 播下种子,让我思考如何改进分支和合并,并推动我不断改进。感谢 Reinout、我的 Sogeti 同事 Edzo 和 Louis,以及 Mendix 审稿人给出了建设性的意见。如果没有他们,最终结果就不会一样。

关于 David de Groot

David 现在在 Sogeti 工作,他一直与 Mendix 多年来,他是一名经过认证的高级开发人员。他曾在多家荷兰和国际公司工作,主要担任维护和支持顾问,但偶尔也会参与项目和新构建。David 拥有 Oracle 和 PL/SQL 开发背景,并拥有人工智能理学硕士学位。

案例

版本控制概念 Mendix 文件记录

使用 Subversion 进行版本控制

InfoQ 书籍:Scrum 和 XP 实战

选择你的语言