防止VCS分支之间的版本合并

时间:2014-06-06 12:56:29

标签: version-control mercurial continuous-integration dvcs continuous-deployment

有一个"问题" (实际上是一种令人讨厌的,但却是一种主要的)与我们的发展过程。

我们已经建立了良好的持续集成 - 部署 - 交付管道;基本上,我们的过程是这样的:

新的开发发生在默认分支上(我们使用Mercurial,但git会有同样的问题);通常我们只在那里发展一个小改进;

一旦改进准备好并经过测试(通常每周发生两次或三次,我们的周期很短),它就会合并到发布分支(实际上是对于候选版本),它在类似生产的环境中再次进行测试,如果它通过我们所有的测试,它就会被推送到生产环境。

如果我们需要修复错误,我们会在发布分支上执行此操作,然后对其进行测试,然后将其推送到生产环境。

从每个分支构建工件(通常是RPM包);当生产中有一个版本时,发布分支中的工件将被提升到我们的公共存储库。生产环境没有分支,因为我们通常不需要它(当发布分支上的某些内容出现时,它的时间跨度非常短但是它不在生产;代码不会在无人看管的情况下徘徊。

在这种情况下,对我们来说这是一个小问题。

为了区分软件包,我们通常将发布分支上的软件包的版本设置为1,将默认分支上的软件包的版本设置为2。然后我们的CI系统会添加其内部版本号,因此我们已经发布了 oursoftware-1.0-build37 发布的软件包以及默认情况下 oursoftware-1.0-build902 。这样的版本可以写在我们的.spec文件或我们的pom.xml文件中(或者用于不同软件的其他文件,如.gemspec或simila)

每当我们想要在发布候选版本中添加一些内容时,我们就会将默认分支合并到发布分支。

那里发生了什么? 版本也会合并。因此,在每次合并之后,我们需要返回包含该版本的文件并将旧版本放入其中。我们应该只需要执行一次(Mercurial不会尝试重新合并已经合并的内容)但是每当我们需要从默认版本进行合并时(例如,为了将在发布时完成的修复合并到dev分支) )问题再次出现。

我想就如何彻底预防这个问题提出一些建议; 如何在我的分支机构之外设置版本?我有时实际上需要更改它们(例如,我希望在发布时从1更改为2,默认情况下从2更改为3)并且我不会'我想在我们的CI系统中对它们进行硬编码,我喜欢一些外部"外部"分支机构的范围及其类型的全球"对于存储库。或者我需要类似"忽略某些文件的修改"。

在许多情况下,我实际上也需要我的文件中的版本;例如,我不能从Maven pom.xml文件或.gemspec中省略版本信息,否则它在开发时不会起作用。

谢谢,

1 个答案:

答案 0 :(得分:0)

好吧,我看到 3 4 很多可能的解决方案,或多或少" native" (没有优先权和个人偏好的随机顺序)

  • 而不是" Monolitic $ DEVEL分支"你可以使用" Branch Per task":在这种情况下,带有(硬编码)版本信息的文件不会显示为可合并文件(TBT!)
  • 特定于分支的版本更改可以从分支的(永久)变更集移动到MQ的补丁中(因为结果 - 版本/和文件/在分支之间是相同的,永久默认更改必须作为应用补丁的结果出现)
  • 带有版本信息的文件不包含硬编码版本,它们更多"模板",而不是"数据",并且实际数据显示为内部构建中的一些预处理的结果进程(你知道转换规则并可以编码)
  • 您可以在开发|部署过程中进行任何更改,如果版本信息文件在存储库中唯一,则可以使用技巧,类似于merging hgtags( repo中的某些文件的特殊合并工具 - 在您的情况下必须是internal:local特殊合并工具)
  • 也许只使用合并模式就行了,查看Mercurial - Exceptions to internal:local merge-patterns?Default to trunk version for Mercurial merges?了解详细信息和一些其他说明+发现