【问题标题】:Maven release: next development version in batch modeMaven 发布:批处理模式下的下一个开发版本
【发布时间】:2013-03-18 14:55:48
【问题描述】:

我已经配置了一个 Jenkins 作业来自动发布我的 maven 项目。这是通过使用以下内容完成的:mvn --batch-mode clean release:prepare release:perform 在批处理模式下,发布版本和开发版本将自动确定。这正是我想要的。

问题是我想增加版本的第二个而不是第三个。所以当我发布1.2.0版本的时候,下一个开发版本肯定是1.3.0-SNAPSHOT。不是 1.2.1-SNAPSHOT。 添加命令行参数不是一种选择,因为这迫使我不断地编辑构建作业。

关于如何更改用于确定下一个开发版本的算法有什么建议吗?

【问题讨论】:

  • 反对使用 1.2-SNAPSHOT 代替 1.2.0-SNAPSHOT 的一些反对意见。
  • 为什么不用jenkins m2发布插件? wiki.jenkins-ci.org/display/JENKINS/M2+Release+Plugin
  • 我们可能希望将来使用第 3 位来发布错误,但现在 2 位就足够了。我什至不知道发布插件。看起来非常有用,但似乎无法解决有关非默认版本模式的版本增量的问题。不过,它确实有助于选择正确的版本。
  • 如果您有错误,您需要手动定义版本,但仅适用于这些情况。在通常情况下,您不需要。

标签: maven maven-release-plugin


【解决方案1】:

我知道这是一个有点旧的帖子,但我在网上的任何地方都没有找到我真正喜欢的答案,我能够想出一些可能对其他人有用的东西......

我想在 OP 状态下增加 minorVersion,我可以通过在我的项目 POM 中使用构建助手插件(用于解析版本)和发布插件的组合来做到这一点。请注意 POM 中引用的“初始化”阶段和 maven 运行属性...

这是 POM 的摘录,我们使用 build helper 插件来解析我们可以在发布插件中引用的版本...

<plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
                <version>${maven.build.helper.plugin.version}</version>
                <executions>
                    <execution>
                        <id>parse-versions-for-release</id>
                        <phase>initialize</phase>
                        <goals>
                            <goal>parse-version</goal>
                        </goals>
                        <configuration>
                            <propertyPrefix>parsedVersion</propertyPrefix>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-release-plugin</artifactId>
                <version>${maven.release.plugin.version}</version>
                <configuration>
                    <autoVersionSubmodules>true</autoVersionSubmodules>
                    <tagNameFormat>@{project.artifactId}-@{project.version}</tagNameFormat>
                    <useReleaseProfile>false</useReleaseProfile>
                    <developmentVersion>${parsedVersion.majorVersion}.${parsedVersion.nextMinorVersion}.0-SNAPSHOT</developmentVersion>
                </configuration>
            </plugin>

现在我们可以运行一个非常正常的版本,但添加“初始化”阶段以触发版本解析(并确保它在查找解析的版本之前发生)...

mvn initialize release:clean release:prepare release:perform

【讨论】:

  • 当我尝试这个解决方案时,开发版本被设置为文字字符串${parsedVersion.majorVersion}.${parsedVersion.nextMinorVersion}.0-SNAPSHOT。也就是说,主要版本和次要版本的属性未解析。有谁知道为什么,我该如何解决?
【解决方案2】:

您可以使用build-helper-maven-plugin。只需在 pom.xml 中添加以下内容:

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>${maven.build.helper.plugin.version}</version>
    </plugin>

并将命令更改为

mvn --batch-mode clean build-helper:parse-version release:prepare release:perform -DdevelopmentVersion=${parsedVersion.majorVersion}.${parsedVersion.nextMinorVersion}.0-SNAPSHOT

(请注意,根据您运行此命令的环境,您可能需要使用\ 转义$\$

【讨论】:

    【解决方案3】:

    release:prepare mojo 中提供了一个参数projectVersionPolicyIdhttp://maven.apache.org/maven-release/maven-release-plugin/prepare-mojo.html#projectVersionPolicyId

    可能没有内置的版本策略来满足您的需求,但您可以通过实现接口VersionPolicy 来开发自己的版本策略。你可以看到maven-release-yearly-policy作为参考,它提供了在版本号中使用年份的版本策略。

    【讨论】:

      【解决方案4】:

      如果您在 Jenkins 中使用参数化构建,则可以使用命令行参数而无需编辑作业。检查作业配置页面中的“此构建已参数化”选项。

      这不会让 Jenkins 完全自行执行发布(这很好;我们不希望机器人抢走我们的工作!)——当您在 Jenkins 中手动启动构建时,您将能够设置您配置的任何参数。

      【讨论】:

      • 你我对机器人无产阶级意见不一;)
      • 你可以从我冰冷的死手手中拿走我的发布版本!
      【解决方案5】:

      您可以使用自定义 groovy 脚本自动为 maven-release-plugin 提供 releaseVersion 和 developmentVersion。然后 maven 命令看起来像:

      mvn clean release:clean release:prepare release:perform -DreleaseVersion=${releaseVersion} -DdevelopmentVersion=${developmentVersion}

      按照this answer 中的步骤,更改 groovy 脚本的一部分以适应您的用例(例如这一部分):

      def newFixVersion = 0;
      if (hasSnapshotPart) {  
          newMinorRelVersion = minorVersion;  
          newMinorDevVersion = minorVersion + 1;  
      } else {  
          //TODO: either throw an exception here or change the newMinorRelVersion newMinorDevVersion appropriately to suite your use-cases: 
              //throw new IllegalArgumentException("The pom at location " + POM_LOCATION + " contains the version " + projectVersion + " which is not a snapshot version (missing " + SNAPSHOT_PART + "). This is a released version and nothing should happen to it!");  
      }  
      

      【讨论】:

        【解决方案6】:

        我遇到了同样的问题,我想在不运行多个命令或手动插入版本的情况下解决它。

        这是我对 y(或次要)增量的解决方案:

        我在 initialize 阶段运行了一个 Groovy 脚本。此脚本创建 release.properties。将此添加到 pom.xml 中的 project/build/plugins 部分:

                <plugin>
                    <groupId>org.codehaus.gmavenplus</groupId>
                    <artifactId>gmavenplus-plugin</artifactId>
                    <version>1.5</version>
                    <dependencies>
                        <dependency>
                            <groupId>org.codehaus.groovy</groupId>
                            <artifactId>groovy-all</artifactId>
                            <version>2.4.6</version>
                        </dependency>
                    </dependencies>
                    <executions>
                        <!-- Force maven-release-plugin to increase MINOR, not PATCH, and create tag as vX.Y.Z -->
                        <execution>
                            <id>release-parameters</id>
                            <phase>initialize</phase>
                            <goals>
                                <goal>execute</goal>
                            </goals>
                            <configuration>
                                <scripts>
                                    <script>
                                        <![CDATA[
                                            final String SNAPSHOT = '-SNAPSHOT'
        
                                            Properties releaseProps = new Properties()
                                            File releasePropsFile = new File('release.properties')
                                            String releaseVersion = '${project.version}'.replace('-SNAPSHOT', '')
                                            String[] vNumbers = releaseVersion.split('\\.')
                                            String snapshotVersion = vNumbers[0] + '.' + (Integer.parseInt(vNumbers[1]) + 1) + '.' + '0' + SNAPSHOT
        
                                            releaseProps.setProperty('scm.tag', 'v' + releaseVersion)
                                            releaseProps.setProperty('project.rel.${project.groupId}:${project.artifactId}', releaseVersion)
                                            releaseProps.setProperty('project.dev.${project.groupId}:${project.artifactId}', snapshotVersion)
                                            releaseProps.store(releasePropsFile.newWriter(), null)
                                        ]]>
                                    </script>
                                </scripts>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
        

        此脚本还会更改 SCM 中 vX.Y.Z标签 名称。 initialize 阶段不会在 release:prepare 阶段执行。要解决此问题,您可以在发布之前运行“mvn install”,或将发布命令更改为:

        mvn --batch-mode initialize clean release:prepare release:perform
        

        关于release.properties:https://maven.apache.org/maven-release/maven-release-plugin/examples/non-interactive-release.html

        【讨论】:

          【解决方案7】:

          正如 Khmarbaise 所建议的那样,我也认为 您的问题没有解决方案。

          是否有任何规则可以自动告诉您是否必须更改第二个或第三个数字?的确,我不这么认为。话虽如此,你不能让 Maven / Jenkins 为你选择它,一次是主要版本号,另一个是次要版本号。

          你必须通过一个参数来改变它,或者让用户通过 Jenkins M2 Release 插件来配置它,正如 willome 所建议的那样。 只能是手动操作。

          【讨论】:

            最近更新 更多