Выпуск 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