Maven 分支更新项目版本自动化发布工作流

标签 maven automation branch versioning

我有一个关于 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 versions:use-latest-versions -DallowSnapshots=true -DupdateDependencies=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
    )
  • 将项目从主干复制到新创建的分支,将主干上的 pom 版本从 1.0.0-SNAPSHOT 转换为 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
    )
  • 将项目从主干复制到新创建的分支,
  • 将主干 pom 版本 1.0.0-SNAPSHOT 转换为 1.0.1-SNAPSHOT
  • 更新 parent-pom.version: 1.0.0-SNAPSHOT 变成 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 版本:使用最新版本 -DallowSnapshots=true
    -DupdateDependencies=true
    )
  • 将项目从主干复制到新创建的分支
  • 将主干上的 pom 版本从 1.0.0-SNAPSHOT 转换为 1.1.0-SNAPSHOT
  • 将主干上的 parent-pom 从 1.0.0-SNAPSHOT 更新为 1.1.0-SNAPSHOT
  • 将已经分支的依赖项目从 1.0.0-SNAPSHOT 更新为 1.1.0-SNAPSHOT

  • 这里的第一个问题是在分支项目时还没有办法增加 MinorVersion 的参数,maven-release-plugin 2.2.2 在分支时不会增加主干上的 pom MinorVersion,所以这就是为什么我们需要使用 -Dproject.rel.${groupId}:${projectId}=1.0.0-SNAPSHOT
    -Dproject.dev.${groupId}:${projectId}=1.1.0-SNAPSHOT
    参数并为每个项目手动更改它们,因此每次我们准备新版本时都要更改 200 次。

    我想知道这是否不是一种以某种方式以自动方式进行所有描述的过程并且不需要一直手动执行所有这些更改的方法。
    我们甚至考虑将这个产品模块化,以便可能将 200 个项目折叠成 100 个,但这是 Not Acceptable ,因为这个想法是有一个细粒度的项目版本控制并且所有项目都有自己的生命周期,所以聚合器(我的意思是经典的)不在此处讨论。

    我们使用 SVN 作为 VCS,使用 Maven 作为构建工具(可能你已经知道了:)),使用 Bamboo 作为 CI 服务器(实际上,Bamboo 没有帮助我,而不是“Maven Dependency Processor”功能,关于版本问题)。

    你们有什么想法可以为这个问题找到合适的解决方案,也许另一个插件会有所帮助(versions-maven-plugin 在分支时不会自动更改版本),也许是另一个观点,我不知道...,欢迎任何帮助或建议。

    谢谢!

    最佳答案

    我尽量避免在 <properties> 中保留内部项目版本parent-pom 的部分,因为每次我发布项目时,<version>${project.version}</version>变量将与项目的显式版本进行切换,例如:

    <properties>
            <project_A.version>1.0.0-SNAPSHOT</projectA.version>
    </properties>
    

    存储在父 pom 中,在项目 pom 中翻译,如: ${project.version} , 将在发布该项目时变为 1.0.1-SNAPSHOT,并将覆盖 <project_A.version>来自 parent-pom 的版本 <properties> .因此,只要您不发布项目,这种将项目版本作为属性保存在父 pom 等集中位置的技巧就有效。
    这是与分支问题严格相关的问题。



    现在,如果你愿意,我可以告诉你更多关于使用这个 <properties> 发布项目的信息。代换:
    假设您想发布您的 项目_A ,您将如何处理 <projectA.version>存储在父 pom 中 <properties>当您开始发布父 pom 时,这是一个 -SNAPSHOT 版本,对吗?我的意思是,为了发布一个项目,您首先要发布它的所有依赖项及其相关的父 pom,对吗?否则您的项目发布将失败,因为它指向父 pom 的 -SNAPSHOT 版本。
    现在,您将发布保留 的 -SNAPSHOT 版本的父 pom。项目_A 里面是<properties> ,接下来什么时候发布 项目_A ,您的项目将引用您的父 pom 的新创建的发布版本,该父 pom 发布的版本是指您的 的 -SNAPSHOT 版本项目_A ,仍然不是问题,因为您的父 pom 保留了您 的真实版本项目_A , 直到您的 项目A 发布版本(比如 1.0.0)将引用相同的父 pom 发布版本,该版本包含您的 的 1.0.0-SNAPSHOT 版本项目_A ,现在你已经有问题了,因为你的父 pom <properties>正在保留错误的信息。
    当然你可以在发布时破解父pom并存储的发布版本项目_A ,但是这违反了规则,我根本不同意这一点,另外还有其他情况,当这个“黑客”会导致更多的问题而不是帮助。

    如果这听起来很复杂和详细,我很抱歉,但我只想尽可能多地解释现实生活中的情况,而不仅仅是理论上的,而且我还需要记住我有 200 多个项目我需要以某种方式保持一致.

    关于Maven 分支更新项目版本自动化发布工作流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9061829/

    相关文章:

    java - 如何调试和调整我的 jenkins maven 构建的内存设置

    scala - 在 Zeppelin 中指定与分类器的依赖关系

    amazon-web-services - Maven 无法从链中的任何提供商加载 AWS 凭证

    javascript - html/javascript 自动从提交按钮获取链接(也许用 python 自动化?)

    Javascript click() 不适用于某些元素

    java - 使用 Maven 打包资源文件和类的最佳实践

    testing - 元素内的偏移量无法滚动到 View : (0, 0): http://localhost/groupc/edit/378

    git - 如何将 Git 分支移出到它自己的存储库中?

    git - 使用原始源代码更新 Git 中的功能分支

    git - 如何维护两个或多个永不 merge 的发散分支?