2011-12-02 74 views
24

我有一对夫妇的被开发并在不同的分支发布的项目,即发展释放 Maven的最佳实践。这个过程工作得很好,但不幸的是它有一些缺点,我一直在想,是否有更好的版本控制方案适用于我的情况。的版本不同的分支[开发,QA /预发行]

主要开发发生在开发分支(即Subversion 主干,但没关系),开发团队在哪里进行更改。在构建和打包工件之后,Jenkins将它们部署到Maven存储库和开发集成应用程序服务器。这是一个发展的快照和基本上仅仅是包含在一个共同的分支的所有开发功能feature branch

<groupId>pl.cyfrowypolsat.process-engine</groupId> 
<artifactId>process-engine</artifactId> 
<version>D.16-SNAPSHOT</version> 

当一个特定的业务变化进行,由QA团队的要求,这一个变化,然后被合并到发布分支(分支/发布)。詹金斯部署导致神器QA应用服务器:

<groupId>pl.cyfrowypolsat.process-engine</groupId> 
<artifactId>process-engine</artifactId> 
<version>R.16-SNAPSHOT</version> 

然后有一个释放其通过行家释放小插件发生在软件发布分支版本(这将创建快速bug修复维护标签/支)。 (R.16-SNAPSHOT => R.16)

开发和发布分支目前分别版本化为D.16-SNAPSHOT和R.16-SNAPSHOT。这允许分离Maven仓库中的工件,但是会依赖于标准Maven版本风格的不同Maven机制产生问题。这也打破了OSGI版本。

现在,你会如何命名和版本的Maven工件在这样的计划?有没有更好的办法?也许我可以对maven结构进行一些更改,而不是简单地更改版本和命名方案?但我需要将开发和QA(发布)SCM分支分开。

'开发'/'生产'的maven分类是否是一个合理的选择?

<groupId>pl.cyfrowypolsat.process-engine</groupId> 
<artifactId>process-engine</artifactId> 
<version>16-SNAPSHOT</version> 
<classifier>D</classifier> 
+0

请看http://stackoverflow.com/q/11413624/7581。看起来最好的方式是拥有像16-R-SNAPSHOT和16-D-SNAPSHOT这样的版本。不要使用分类器。 – itsadok

回答

2

据我所知,共同命名延长释放神器将是神器只是名字,没有任何东西,只指定版本。开发分支将具有相同的工件名称,但具有快照。

例如,采取twitter4j。发行版的工件名称是

twitter4j-2.5.5

快照他们(他)的开发版本

twitter4j-2.6.5-SNAPSHOT

这是几乎所有人都使用的命名约定,并且被大多数工具所认可。例如,我的Nexus存储库可以指定一个策略来忽略开发版本,这基本上意味着它忽略了名称中包含-SNAPSHOT的工件。

编辑: 要将后续问题:

嗯,这取决于您的构建工具,您可以创建快照有时间戳或其他一些独特的标识符。但是,我从来没有听说过一些分支逻辑被嵌入到工件名称中,所以连续的int服务器可以区分它。从工件的角度来看,它不是一个发行版,就是一个SNAPSHOT,我没有看到将更多逻辑嵌入到工件名称中的好处,只是让您的Hudson允许您这样做。说实话,你的发布周期对我来说似乎还可以,但这需要对你的maven工具进行一些细微的调整。如果你不能忍受,我会建议你使用分类器而不是依赖名称,因为调整集成服务器比依赖标准命名约定的插件要容易得多。总之,我相信你是在正确的轨道上。

+5

爸爸,你的榜样缺少一个关键因素 - 分支。这只有当你有一个源(分支),你正在发布的版本(例如中继线)时才是好的。在我的环境中,QA分支不包含所有的开发变更(因此不同的分支机构),只是准备好进行QA测试和发布的变更。该版本由此QA分支完成,因此R.16-SNAPSHOT在发布时变为R.16;就像你上面描绘的那样。 –

+0

继您的编辑,巴巴。这本身并不是一个分支逻辑,这就是分离候选版本和开发版本。正如我在原始文章中提到的那样(作为编辑),这只是http://martinfowler.com/bliki/FeatureBranch.html(特殊的,因为所有功能都是在那里同时开发的)的特例。我想,没有什么特别的。感谢鼓励的话。为你+1。 –

0

Maven的发布插件支持branching。它似乎可以通过假定分支被创建来支持下一个版本的代码。

就我个人而言,我更倾向于使用versions插件,并明确设置我的Maven项目的版本号。

+1

我同时使用Mark(我通过版本插件在bug修复版本上碰撞版本)。但恐怕你已经阅读我的问题,不关注细节。不管怎样,谢谢你。 –

+0

好吧,我会更明确的...阅读发布插件文档,看看它如何支持分支。我的建议是停止尝试通过创建相同版本的并行副本(“D”,“R”等)来对抗Maven。相反,创建一个注定要成为下一个版本的分支。例如,1.0版本的一个分支将被称为1.1-SNAPSHOT。 –

+2

马克,我确实有这样的分支 - “分支/释放”,它有“1.1-SNAPSHOT”。该分支以1.1版本的形式发布。但我还有一个功能/开发分支,它必须以某种方式进行标记,因为其他软件可能需要依赖于尚未计划发布最近版本的开发版本。正如我在Prasanna评论中解释的那样,我不能放弃开发和qa分支。更重要的是,我不是在与maven战斗,这个设置工作得很好(maven支持字符串版本,你知道,它被记录在案)。我只是寻找更好的方法来处理这种情况。 –

1

我认为你只要简单的过程只有两种尽可能行家而言

  1. 快照(在永续发展)
  2. 可释放(具有可部署到Maven仓库版本号或产能释放)

我会处理你的分支有点不同,如果你看看迭代/ Scrum的发展模式,你的代码应该是可释放/可交付的在迭代/冲刺结束

  • 主子版本trunk作为开发者提交他们的代码
  • 在冲刺/迭代分支主干的结束,并呼吁释放它的分支(不应该有一个QA分行所要发布的任何代码针对质量测试)
  • Bug修正应该发生在发布分支,并定期重新合并到主干
  • 这样你就可以保持一个版本创建新的分支和任何bug修复致力于分支
  • 始终确保在从主干创建新的分支之前,它具有来自公关的所有合并evious branches
相关问题