Asg*_*ard 7 versioning automation branch maven
关于Maven自动化项目版本控制,我有一个难以解决的案例,我希望我会根据您的经验和建议找到合适的解决方案.
问题是这样的:我们有一个巨大的mavenized java产品,它包含~200个非常相互依赖的不同项目.我们同意每个项目都应该独立开发,以便每个项目都有自己的生命周期.在开发阶段一切正常,没有问题.当我们为这些项目准备发布时,问题就出现了:因为手动更改的项目非常多,所以我们决定找到一个自动解决方案来解决发布过程.
先决条件是这些:我们都同意SVN视角的发布策略应该是这样的: - 所有开发都应该在SVN中继上执行,应该在分支上创建和维护发布.每个执行的版本都应自动创建一个标记.
来自MAVEN视角的策略是这样的: - 在发布项目之前,我们首先将主干复制到分支,以便控制对分支代码的项目维护.我们选择的版本控制系统是:Major.Minor.BuildNumber-SNAPSHOT(例如1.0.0-SNAPSHOT).分支代码时,我们希望通过递增MinorVersion来更改项目版本号(例如,trunk-1.0.0-SNAPSHOT将变为1.1.0-SNAPSHOT,并且将在新创建的分支上复制和发布1.0.0-SNAPSHOT ) - 当我们决定项目足够成熟以便发布时,我们通过使用maven-release-plugin(mvn release:clean release:prepare release:perform)发布它,以便我们的项目版本将从Major转换. Minor.BuildVersion-SNAPSHOT(例如1.0.0-SNAPSHOT)到Major.Minor.BuildVersion(例如1.0.0),然后将为下一个开发迭代做好准备,如:Major.Minor.BuildVersion + 1-SNAPSHOT(例如1.0. 1-SNAPSHOT)
我们面临的问题与项目版本控制有关.因此,在主干的开发阶段,所有项目都使用其依赖项的最新SNAPSHOT版本(mvn版本:use-latest-versions -DallowSnapshots = true -DupdateDependencies = true),但是当我们考虑是时候启动发布程序并准备分支代码,出现问题:我们开始分支
父POM
(mvn -B release:clean release:branch -DbranchName = $ {project.artifactId} _ $ {project.version} -Dusername = $ {username} -Dpassword = $ {passwd} -Dproject.rel.$ {groupId}: $ {projectId} = 1.0.0-SNAPSHOT -Dproject.dev.$ {groupId}:$ {projectId} = 1.1.0-SNAPSHOT)
非依赖项目
(mvn -B release:clean release:branch -DbranchName = $ {project.artifactId} _ $ {project.version} -Dusername = $ {username} -Dpassword = $ {passwd} -Dproject.rel.$ {groupId}: $ {projectId} = 1.0.0-SNAPSHOT -Dproject.dev.$ {groupId}:$ {projectId} = 1.1.0-SNAPSHOT版本:update-parent -DallowSnapshots = true)
依赖项目:
(mvn -B release:clean release:branch -DbranchName = $ {project.artifactId} _ $ {project.version} -Dusername = $ {username} -Dpassword = $ {passwd} -Dproject.rel.$ {groupId}: $ {projectId} = 1.0.0-SNAPSHOT -Dproject.dev.$ {groupId}:$ {projectId} = 1.1.0-SNAPSHOT版本:update-parent -DallowSnapshots = true版本:use-latest-versions -DallowSnapshots = true -DupdateDependencies = true)
这里的第一个问题是,有没有办法尚未有一个参数来增加MinorVersion当分支的分支当项目,maven的释放小插件2.2.2不增加主干的POM MinorVersion,所以这就是为什么我们需要使用-Dproject.rel.$ {groupId}:$ {projectId} = 1.0.0-SNAPSHOT -Dproject.dev.$ {groupId}:$ {projectId} = 1.1.0-SNAPSHOT参数并为每个项目手动更改它们,每当我们准备新版本时,每次200次.
我想知道这是不是以自动方式以某种方式完成所有描述的过程并且不需要一直手动执行所有这些更改的方法.我们已经考虑甚至模块化这个产品,这样对COLAPSE在100也许那些200项目,但由于这个想法是有一个细粒度的项目版本,并拥有所有的项目,它有自己的生命周期,这是不能接受的,所以聚合器(我的意思是经典的)在这里没有讨论.
我们正在使用SVN作为VCS,Maven作为构建工具(可能你已经想通了有关:)),竹作为CI服务器(实际上,不是"Maven的依赖处理器"功能,竹并没有帮助我很多关于版本问题).
你有没有想法为这个问题找到一个合适的解决方案,也许另一个插件会有所帮助(版本-maven-plugin在分支时不会自动更改版本),也许是另一种观点,我不知道知道......,欢迎任何帮助或消化.
谢谢!
我尽量避免将内部项目版本保留在<properties>parent-pom的部分中,因为每次我发布项目时,<version>${project.version}</version>变量都会与项目的显式版本进行切换,例如:
<properties>
<project_A.version>1.0.0-SNAPSHOT</projectA.version>
</properties>
Run Code Online (Sandbox Code Playgroud)
存储在父pom中,在项目pom中翻译为:${project.version},当发布该项目时将变成 1.0.1-SNAPSHOT ,并将覆盖<project_A.version>parent-pom中的版本<properties>。因此,只要您不发布项目,将项目版本作为属性保存在像parent-pom这样的集中位置的技巧就有效。这是与分支问题严格相关的问题。
现在,如果您愿意,我可以告诉您有关使用此替换发布项目的更多信息<properties>:假设您想发布您的project_A,当您开始发布时,您将如何处理存储<projectA.version>在父pom中<properties>的-SNAPSHOT版本父 pom,对吧?我的意思是,为了发布一个项目,您将首先发布它的所有依赖项及其相关的父pom,对吗?否则你的项目发布将会失败,因为它指向父 pom 的 -SNAPSHOT 版本。现在,您正在释放parent-pom,将project_A的-SNAPSHOT版本保留在其内部<properties>,接下来当您释放project_A时,您的项目将引用您的父pom的新创建的发布版本,该父pom发布版本是引用你的project_A的-SNAPSHOT版本,仍然不是问题,因为你的父pom保留了你的project_A的真实版本,直到你的projectA发布版本(假设1.0.0)将引用相同的父pom发布版本包含您的project_A的 1.0.0-SNAPSHOT 版本,现在您已经遇到问题了,因为您的父 pom<properties>保留了错误的信息。当然,你可以在发布时破解父pom并存储project_A的发布版本,但这违反了规则,我根本不同意这一点,而且在其他情况下,这种“破解”会导致更多问题而不是帮助。
如果这听起来相当复杂和详细,我很抱歉,但我只是想尽可能多地解释现实生活中的情况,而不仅仅是理论上的,另外我还需要记住,我有 200 多个项目需要以某种方式保持一致。
| 归档时间: |
|
| 查看次数: |
2227 次 |
| 最近记录: |