13

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

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

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

4

7 回答 7

8

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

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

这是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
于 2018-02-14T22:28:24.780 回答
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

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

于 2019-10-24T10:40:01.620 回答
2

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

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

于 2020-08-27T02:53:03.400 回答
0

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

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

于 2013-03-19T13:27:07.040 回答
0

您可以使用自定义 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!");  
}  
于 2013-07-17T12:30:04.437 回答
0

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

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

我在初始化阶段运行了一个 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.YZ的标签名称。在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

于 2016-03-24T20:09:54.587 回答
-1

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

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

您必须通过参数更改它,或者让用户通过 Jenkins M2 Release 插件对其进行配置,正如 willome 所建议的那样。它只能是手动操作。

于 2013-03-19T13:19:50.397 回答