Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Version control Maven版本控制不同分支的最佳实践[开发、qa/预发布]_Version Control_Maven_Naming Conventions_Branch - Fatal编程技术网

Version control Maven版本控制不同分支的最佳实践[开发、qa/预发布]

Version control Maven版本控制不同分支的最佳实践[开发、qa/预发布],version-control,maven,naming-conventions,branch,Version Control,Maven,Naming Conventions,Branch,我有几个项目是在不同的分支上开发和发布的,即开发和发布。这个过程运行得很好,但不幸的是它有一些缺点,我一直在想,在我的情况下是否有更好的版本控制方案 主要开发发生在一个开发分支上(即Subversion主干,但这并不重要),开发团队在那里提交他们的更改。在构建和打包工件之后,Jenkins将它们部署到maven存储库和开发集成应用服务器。这是一个开发快照,基本上只是一个包含一个公共分支上所有开发功能的快照: <groupId>pl.cyfrowypolsat.process-engi

我有几个项目是在不同的分支上开发和发布的,即开发和发布。这个过程运行得很好,但不幸的是它有一些缺点,我一直在想,在我的情况下是否有更好的版本控制方案

主要开发发生在一个开发分支上(即Subversion主干,但这并不重要),开发团队在那里提交他们的更改。在构建和打包工件之后,Jenkins将它们部署到maven存储库和开发集成应用服务器。这是一个开发快照,基本上只是一个包含一个公共分支上所有开发功能的快照:

<groupId>pl.cyfrowypolsat.process-engine</groupId>
<artifactId>process-engine</artifactId>
<version>D.16-SNAPSHOT</version>
pl.cyfrowypolsat.process-engine
过程引擎
D.16-1
当QA团队完成并请求一个特定的业务变更时,这个变更将被合并到发布分支(分支/发布)。Jenkins将生成的工件部署到QA应用程序服务器:

<groupId>pl.cyfrowypolsat.process-engine</groupId>
<artifactId>process-engine</artifactId>
<version>R.16-SNAPSHOT</version>
pl.cyfrowypolsat.process-engine
过程引擎
R.16-1
还有一个版本是通过软件发布分支版本上的maven发布插件发布的(它创建了一个维护标签/分支,用于快速修复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>
pl.cyfrowypolsat.process-engine
过程引擎
16-快照
D

据我所知,发布工件的通用命名扩展将只是工件的名称,没有任何内容,只有指定的版本。开发分支将具有相同的工件名称,但具有快照

例如,以twitter4j为例。发布版本的工件名称为

twitter4j-2.5.5

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

twitter4j-2.6.5-SNAPSHOT

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

编辑: 关于你的后续问题:


嗯,根据构建工具的不同,您可以创建具有时间戳或其他唯一标识符的快照。然而,我从来没有听说过在工件的名称中嵌入一些分支逻辑,只是为了让continuousint服务器能够区分它。从工件的角度来看,它要么是一个版本,要么是一个快照,我不认为在工件的名称中嵌入更多的逻辑有什么好处,只是因为你的Hudson允许你这么做。老实说,我觉得您的发布周期还可以,但这需要对maven工具进行一些微调。如果你不能接受这一点,我建议你使用分类器,而不是依赖于名称,因为调整集成服务器总是比许多依赖于标准命名约定的插件更容易。总而言之,我相信您走上了正确的道路。

Maven的发布插件支持。它的工作原理似乎是假设创建分支是为了支持代码的下一个版本


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

我认为就Maven而言,您只需使用两种类型就可以简单地完成这个过程

  • 快照(在永久开发中)
  • 可发布(具有可部署到maven存储库或生产版本的版本号)
  • 我会稍微不同地处理您的分支,如果您查看迭代/scrum开发模型,您的代码应该在迭代/冲刺结束时是可发布/可交付的

    • 主子版本主干是开发人员提交代码的地方
    • 在sprint/iteration分支的末尾,主主干被称为release分支(不应该有QA分支,任何要发布的代码都要经过质量测试)
    • 错误修复应该发生在发布分支上,并定期合并回主干
    • 通过这种方式,您可以继续为发布创建分支,并且任何错误修复都会提交给分支
    • 始终确保在从主干创建新分支之前,它具有以前分支的所有合并

    Baba,您的示例缺少一个关键元素—分支。只有当您有一个正在发布的源(分支)(例如主干)时,这才是好的。在我的环境中,QA分支并不包含所有的开发变更(因此不同的分支),只包含准备好进行QA测试和发布的变更。这个版本是从这个QA分支发布的,所以R.16-SNAPSHOT在发布时变成了R.16;正如你上面所描绘的。编辑完后,爸爸。这本身并不是一个分支逻辑,而是分离候选发布版本和开发版本。正如我在我的原始帖子(作为编辑)中提到的,这只是a的一个特例(特例,因为所有的功能都是在那里同时开发的)。我想没什么特别的。谢谢你的鼓励+1给你。我两者都用,马克(我正在通过bugfix版本插件升级版本)。但恐怕你读了我的问题,没有注意细节。不管怎样,谢谢你。好的,我会更详细地解释。。。阅读发行版插件文档,请参阅