Выпуск Maven: следующая версия разработки в пакетном режиме

Я настроил задание Дженкинса для автоматического выпуска моего проекта maven. Это делается с помощью следующего: mvn --batch-mode clean release:prepare release:perform В пакетном режиме версия выпуска и версия разработки будут определены автоматически. Это именно то, что я хочу.

Проблема в том, что я хочу увеличить второй номер версии вместо третьего. Поэтому, выпуская версию 1.2.0, следующая версия для разработки должна быть 1.3.0-SNAPSHOT. Не 1.2.1-SNAPSHOT. Добавление параметра командной строки не является вариантом, потому что это заставляет меня постоянно редактировать задание сборки.

Любые предложения о том, как изменить алгоритм, используемый для определения следующей версии разработки?

Ответ 1

Я знаю, что это своего рода старый пост, но я не нашел ответа, который мне действительно понравился в любом месте в Интернете, и я смог придумать что-то, что может хорошо работать для других...

Я хотел бы увеличить значение minorVersion как состояния OP, и я смог сделать это, используя комбинацию плагина-помощника сборки (для разбора версии) и плагина выпуска в моем проекте POM. Обратите внимание на фазу "инициализации", указанную в POM и свойство maven run...

Здесь выдержка из POM, мы используем плагин сборки 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}[email protected]{project.version}</tagNameFormat>
                    <useReleaseProfile>false</useReleaseProfile>
                    <developmentVersion>${parsedVersion.majorVersion}.${parsedVersion.nextMinorVersion}.0-SNAPSHOT</developmentVersion>
                </configuration>
            </plugin>

Теперь мы можем просто запустить довольно обычный выпуск, но добавив в фазу "initialize", чтобы запустить разбор версии (и убедиться, что это происходит до поиска анализируемых версий)...

mvn initialize release:clean release:prepare release:perform

Ответ 2

Как и предполагалось, Хмарбайс, я также думаю, что нет решения вашей проблемы.

Есть ли какое-либо правило, которое может автоматически сказать вам, нужно ли вам изменить второй или третий номер? Действительно, я так не думаю. Сказав это, вы не можете попросить Maven/Jenkins выбрать его для вас, одну цифру главной версии, другую младшую цифру версии.

Вы должны изменить его с помощью параметра или позволить пользователю настроить его через плагин Jenkins M2 Release, как это было предложено волей. Это может быть только ручное действие.

Ответ 3

Вы можете использовать параметр командной строки без редактирования задания, если вы используете параметризованную сборку в Jenkins. Проверьте параметр "эта сборка параметризирована" на странице конфигурации задания.

Это не позволит Jenkins выполнять релизы полностью самостоятельно (это хорошо, мы не хотим, чтобы роботы выполняли наши задания!) - когда вы вручную запускаете сборку из Jenkins, вы будете в состоянии установить любые параметры, которые вы настроили.

Ответ 4

Вы можете использовать пользовательский groovy script, чтобы автоматически предоставлять maven-release-плагин с версией releaseVersion и developmentVersion. Тогда команда maven будет выглядеть примерно так:

mvn clean release: чистый релиз: подготовить выпуск: выполнить -DreleaseVersion = ${releaseVersion} -DdevelopmentVersion = ${developmentVersion}

Следуйте инструкциям в этом ответе и измените часть groovy script для набора ваших прецедентов (например, эта часть):

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!");  
}  

Ответ 5

У меня была такая же проблема, и я решил разрешить ее, не выполнив несколько команд или введя версию вручную.

Вот мое решение для приращения y (или minor):

Я запускаю Groovy script в инициализировать. Этот script создает release.properties. Добавьте это в раздел проекта/сборки/плагинов в pom.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>

Этот script также изменяет имя тега для vX.Y.Z в вашем SCM. Фаза initialize не выполняется в фазе release: подготовить. Чтобы решить эту проблему, вы можете запустить "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