【问题标题】:Is there a good approach at automatically incrementing maven versions是否有自动增加 Maven 版本的好方法
【发布时间】:2020-11-01 02:47:12
【问题描述】:

我已经做了一段时间了,这是当前的场景:

  • 我有一个开发分支,在每次推送后,我想将我当前的 maven 库发布为 SNAPSHOT。我目前通过使用 exec-plugin 和 echo 来检索我的 maven 版本(例如:-Dexec.executable=echo -Dexec.args='${project.version}' org.codehaus.mojo:exec-maven-plugin: 1.6.0:执行))
  • 然后我使用 update-versions 命令将“-SNAPSHOT”注入其中并发布(我不将其发布回分支,因为我真的不想保留“-SNAPSHOT”)。

对于发布,我想我可以在检索版本的地方做类似的事情,然后找出增加它的方法 -> 发布回当前活动的分支 -> 最后进行部署。现在,我采用了一种稍微容易一些但容易出错的方法:我尝试获取我们使用的工件中设置的当前版本,如果它存在,我会通过一条消息指出该版本已经存在而使管道失败。现在不是很好,因为我实际上在这里反转了一个错误条件,所以如果 maven 由于任何其他原因失败,它实际上假设该版本不存在并继续进行下一步。呃。

现在,我在这里寻找的要点实际上是围绕处理 maven 项目和版本控制的最佳方法。理想情况下,我的目标是:

  • 能够以 SNAPSHOT 的形式正确发布某些内容(也许不必求助于 maven-exec)?
  • 能够逐步更新我的版本,这样用户就不必经常更新他们的版本了吗?当然,这个过程必须确保我不会将可能有错误版本的东西推送到 master(然后在部署时会失败)。编辑:换句话说,这里的意图不仅仅是将版本增加到“下一个”,而是增加到“下一个可用的”,确保我不会尝试合并以前发布的版本。李>

我确实有一个限制:我们使用的工具不允许我们拥有合并挂钩(Azure DevOps 和 Azure Git)。这意味着我们仅限于拉动(和 PR)以及 PR 合并后的管道。

我很高兴在这里实际采取任何其他方法,我觉得我正在竭尽全力做出一些现在应该有明确路径的东西,所以我希望有人在这里提供一些指导。

【问题讨论】:

    标签: git maven continuous-integration


    【解决方案1】:

    然后使用 update-versions 命令向其注入“-SNAPSHOT” 并发布(我不会将它发布回分支,因为我没有 真的很想保留“-SNAPSHOT”。

    不是判断,而是在 pom 中为快照和发布都使用无快照版本很容易出错。快照的意思是“在开发中,当心”。 Release 的意思是“相当稳定,开始”。 在有疑问或回滚到特定版本的情况下,开发人员必须确定提交指的是什么。这里很模糊。

    理想情况下我的目标>是:

    能够以 SNAPSHOT 的形式正确发布某些内容(也许没有 必须求助于 maven-exec)?

    两种方式:

    • 在你的 pom.xml 中保持你的工件版本为-SNAPSHOT,并通过剥离 -SNAPSHOT 并在您想将其视为发布时对其进行标记/部署。
    • 保持你的工件版本为 no -SNAPSHOT(虽然我不建议)并使用 maven-ci friendly feature/plugin 动态设置版本。

    您的 pom 属性可能看起来像定义为的版本:

     <version>${revision}${sha1}${changelist}</version>
    
     <properties>
        <revision>1.0.0</revision>
        <changelist></changelist>
        <sha1/>
     </properties>
    

    您还应该声明 flatten-maven-plugin 以保持 pom.xml 可供其他项目使用(库就是这种情况)。

    最后你可以执行部署目标来将你的快照推送到你的远程 maven 存储库中:

    mvn -Dchangelist=-SNAPSHOT clean deploy
    

    能够逐步更新我的版本,因此用户不必 不断地更新他们的版本?这个过程当然会 必须确保我不会把可能有的东西推到掌握 错误的版本(然后会在部署时失败)。

    您可以依靠 maven 插件和脚本来实现这一点。
    例如,要自动增加没有快照作为前缀的版本的第二个数字,就像你的情况一样,在 linux 系统上你可以这样做:

    // get the current pom version and store it into a variable
    version=$(mvn -q -U -Dexpression=project.version -DforceStdout maven-help-plugin:evaluate)
    // increment the second digit of the version and overwrite the variable
    version=$(echo ${version} |  awk -F'.' '{print $1"."$2+1"."$3}' |  sed s/[.]$//)
    // update the pom with the new version
    mvn -U versions:set -DnewVersion=${version}
    

    由于 sed,它既适用于 3 位数的版本,也适用于 2 位数的版本。

    【讨论】:

    • 这是一个非常棒的评论,但大多数不能直接应用于我的项目。我没有标记为已解决,并且 - 虽然我大部分同意 SNAPSHOT cmets 并且我意识到我没有给出完整的上下文 - 版本控制在大多数情况下对开发人员来说是不可见的,并且没有真正重用在其他地方 - 在这种情况下,Maven 完全对他们隐藏。
    • 更新上面的评论:我的主要问题是自动更新版本。这是快照上的一个公平点,因此还有改进的空间,我将不得不根据您的 cmets 考虑它。不幸的是,这本身并不是一个 maven 项目,因为许多这种逻辑对业务用户来说是隐藏的。它只是由下面的 maven 管理:)
    【解决方案2】:

    @davidxxx 答案的补充。 使用 build-helper maven 插件可以改善这一点:

    mvn build-helper:parse-version versions:set \
        -DnewVersion=\${parsedVersion.nextMajorVersion}.0.0 \
        versions:commit
    

    或者像这样:

    mvn build-helper:parse-version versions:set \
       - DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.nextMinorVersion}.0 \
       versions:commit
    

    没有任何 sed 等更多细节:

    【讨论】:

    • 我不知道解析版本的目标。这是极好的。下次我会试试的:)
    • 啊,这对我帮助很大。这确实可以帮助我实现我们的目标,非常感谢。
    • 我看过这个,但对我的情况没有帮助,因为它实际上并不寻找最新的部署版本。重新阅读我的问题后,这并不是很清楚,我将使用此信息进行更新。我在想也许可以使用 update-versions 来执行此操作,或者至少检索最新发布的发布版本。
    • 您是否在版本控制中创建标签?如果是这样,您可以假设版本控制中的最新版本与最新部署的版本相同(如果不是)。你必须另辟蹊径。
    【解决方案3】:

    我们构建了一个工具(注意:我正在开发它)来跟踪每个分支的不同版本、架构和增量。

    您可以为每个分支定义架构和引脚。此外,您不受 SemVer 的约束,也可以使用 CalVer。

    即,对于 SemVer,您可以将项目版本设置为 semver,而将 dev 分支的分支引脚设置为 Major.Minor.Patch-SNAPSHOT。然后它会用普通的 semver 增加你的 master 分支,而 dev 分支将有 -SNAPSHOT 后缀。

    https://github.com/relizaio/versioning 有开源版本,https://relizahub.com 有 SaaS 版本(有很多额外的功能)。 SaaS 版本可以跟踪以前的版本,并允许您通过 API 对每个分支进行干净的拆分。

    以下是我对以上所有内容的详细说明:https://worklifenotes.com/2020/02/27/automatic-version-increments-with-reliza-hub-2-strategies/

    注意:这仍然需要一个命令来将版本注入你的 pom,为此可以通过Versions Maven Plugin 使用以下命令(在其他答案的建议之上):

    mvn versions:set -DnewVersion="$versionFromReliza"
    

    【讨论】:

      猜你喜欢
      • 2012-03-04
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 2011-05-30
      • 2014-08-04
      • 2012-09-14
      • 1970-01-01
      • 2015-11-08
      相关资源
      最近更新 更多