Maven版本:批处理模式下的下一个开发版本

qyuhtwio  于 2023-04-29  发布在  Maven
关注(0)|答案(8)|浏览(166)

我已经配置了一个Jenkins作业来自动发布我的Maven项目。这是通过使用以下方法完成的:mvn --batch-mode clean release:prepare release:perform在批处理模式下,发布版本和开发版本将自动确定。这正是我想要的
问题是我想增加版本的第2个数字,而不是第3个。所以当我发布版本1时。2.0,下一个开发版本必须是1。3.0-SNAPSHOT.非1.2.1-SNAPSHOT。添加命令行参数不是一个选项,因为这迫使我不断地编辑构建作业。
关于如何更改用于确定下一个开发版本的算法有什么建议?

gc0ot86w

gc0ot86w1#

我知道这是一个有点旧的职位,但我没有找到一个答案,我真的很喜欢在网上任何地方,我能够想出一些东西,可能会为他人工作。..
我想增加minorVersion作为OP的状态,我能够通过在我的项目POM中使用build helper插件(解析版本)和release插件的组合来做到这一点。请注意POM和maven run属性中引用的“初始化”阶段。..
下面是POM的摘录,我们使用构建助手插件来解析我们可以在发布插件中引用的版本。..

<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
gkl3eglg

gkl3eglg2#

可以使用build-helper-maven-plugin。只需添加以下内容到pom。联系我们

<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

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

9vw9lbht

9vw9lbht3#

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

8iwquhpp

8iwquhpp4#

如果您在Jenkins中使用参数化构建,则可以使用命令行参数而无需编辑作业。在作业配置页中选中“此生成已参数化”选项。
这不会让Jenkins完全独立地执行发布(这很好;我们不想让机器人抢走我们的工作!)--当你在Jenkins中手动启动一个构建时,你可以设置你配置的任何参数。

06odsfpq

06odsfpq5#

您可以使用自定义groovy脚本自动为maven-release-plugin提供releaseVersion和developmentVersion。然后maven命令看起来有点像:
mvn clean release:clean release:prepare release:perform -DreleaseVersion=${releaseVersion} -DdevelopmentVersion=${developmentVersion}
按照这个答案中的步骤,修改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!");  
}
up9lanfz

up9lanfz6#

我遇到了同样的问题,我想在不运行多个命令或手动插入版本的情况下解决它。
以下是我对y(或较小)增量的解决方案:
我在initialize阶段运行Groovy脚本。此脚本创建release。属性。将此添加到您的pom中的project/build/plugins部分。xml

<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>

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

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

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

00jrzges

00jrzges7#

pom.xml中的maven-release-plugin中的VersionPolicy更改为pom.xml中的maven-release-plugin-将参数projectVersionPolicyId设置为**SemVerVersionPolicy**-选择“SemVer格式并在解析开发版本时增加次要元素”而不是补丁部分(默认值)-增加第二版本部分,而不是第三版本部分。
参见pom.xml示例片段:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-release-plugin</artifactId>
    <version>3.0.0</version>
    <configuration>
        <projectVersionPolicyId>SemVerVersionPolicy</projectVersionPolicyId>
    […]
    </configuration>
</plugin>

备注:

  • 此参数的SemVerVersionPolicy值仅在较新的maven-release-plugin版本中可用。我在使用maven-release-plugin:2.5.3时遇到了这个版本策略的问题,但在升级到3.0.0版本后,它对我来说工作正常。
  • 对于较旧的插件版本,正如其他一些答案所建议的那样,您可能可以实现自己的自定义版本策略。

参考文献:

0kjbasz6

0kjbasz68#

正如Khmarbaise所建议的,我也认为,有没有解决你的问题.
有没有什么规则,可以自动告诉你,如果你必须改变第二个或第三个数字?的确,我不这么认为。也就是说,你不能让Maven / Jenkins为你选择它,一次是主版本号,另一次是次版本号。
您必须通过参数更改它,或者让用户通过Jenkins M2 Release插件配置它,如willome所建议的那样。只能是手动操作。

相关问题