Подтвердить что ты не робот

Как мне обновить версию внутри моего pom.xml при отпускании с помощью потока git?

В проектах maven версия проекта содержится в <version> attritbute файла pom.xml. При создании новой версии в модели потока git мне нужно отбросить номер версии. В этой статье объясняется, как это делается (без maven):

  • Создать ветвь release
  • Измените номер версии и зафиксируйте
  • Объединить ветвь релиза как для разработки, так и для мастеров

Кроме того, он говорит:

Именно в начале ветки релиза на предстоящий выпуск присваивается номер версии - не ранее. До этого момента отрасль развития отражала изменения для "следующего выпуска", но неясно, станет ли эта "следующая версия" в конечном итоге равной 0,3 или 1,0, до тех пор, пока не начнется ветвь релиза. Это решение принимается в начале ветки релиза и выполняется по правилам проектов при наступлении номера версии.

Я вижу две проблемы вместе с maven здесь:

  • Версия, разрабатываемая в maven, будет [следующая версия] -SNAPSHOT. Поэтому мы не можем отложить решение, какая версия будет следующей до момента создания ветки релиза. Конечно, если мы можем изменить наш разум позже, но нам уже нужно ввести/некоторое значение/здесь раньше.
  • Перед созданием нашего выпуска версия в pom.xml была разрешена 1.1-SNAPSHOT. Теперь мы изменили это на просто 1.1 в ветки релиза и объединили его для мастеринга. Хорошо. Но мы должны также объединить эту ветвь для разработки, и для этого нам нужно адаптировать версию, например. 1.2-SNAPSHOT. И, вероятно, мы не должны были делать это в ветки релиза, потому что это коммитирование не должно быть частью выпуска. На самом деле мы, вероятно, должны были внести это изменение сразу после разветвления, потому что все будущие обязательства будут развиваться для следующей версии.

При поиске по проблеме я нашел несколько статей о maven-плагинах, которые могут автоматизировать процесс, что может быть интересно, но этот вопрос действительно о том, как должен выглядеть граф git и где должна выполняться ошибка репликации версии а не как я могу автоматизировать это с помощью maven-плагина.

4b9b3361

Ответ 1

Имейте в виду, что Git был разработан для ядра Linux, которое имеет свои собственные правила версии.

Для Maven, вы должны создать ветку релиза, которая получает снимок версии следующего выпуска. Это изменение должно быть одним коммитом (т.е. просто изменением номера версии в pom.xml). При слиянии git merge --strategy=ours <release-branch> master и используйте git merge --strategy=ours <release-branch>

--strategy=ours означает: --strategy=ours слияние, сказав, что "все в master правильно слито с веткой релиза"; в мастер не вносятся изменения. После этого Git будет рассматривать ветки как объединенные (т.е. не имеющие изменений), несмотря на разный номер версии в обеих ветках.

Чтобы избежать всевозможных проблем при сборке master с Maven, используйте нечетный или очень высокий номер версии, который никогда не меняется, например 99.DEV-SNAPSHOT.

Когда вы сделаете релиз, -SNAPSHOT из версии в ветке релиза и зафиксируйте. После этого вы извлекаете мастер и снова объединяетесь с --strategy=ours.

Примечание. Если вы сделаете это, вы не должны вносить другие изменения в ветку релиза, кроме изменения версий. Любые другие исправления будут потеряны! Вы можете только вишня забрать их.

Ответ 2

Для нормальных выпусков просто выполните обновление моментальной копии после слияния ветки релиза:

  • Создайте ветвь релиза develop и удалите снимок из версии
  • Объединить его в master
  • Объединить его в develop
  • Измените версию на develop на следующую версию снимка
  • Нажимайте кнопки master и develop

При одновременном нажатии всех изменений команда увидит только увеличение моментального снимка.

Для исправлений это невозможно, поскольку вы создаете его из ветки master. Для этого сценария существует обходной путь, здесь приведен пример использования команд git.

Пример. У вас есть 1.0.0 на master и вы хотите создать версию исправления 1.0.1. Ваше развитие уже находится в 1.1.0-SNAPSHOT.

  • git checkout master
  • git checkout -b hotfix/1.0.1
  • Сделайте свое исправление!
  • mvn versions:set -DnewVersion=1.0.1
  • git commit -a -m "hotfix release 1.0.1"
  • git checkout master
  • git merge hotfix/1.0.1 (легко, потому что мы создали ветку master)
  • git checkout develop
  • mvn versions:set -DnewVersion=1.0.0
  • git commit -a -m "workaround to avoid merge conflicts"
  • git merge hotfix/1.0.1 (будет работать из-за фиксации до)
  • mvn versions:set -DnewVersion=1.1.0-SNAPSHOT
  • git commit -a -m "set version back to 1.1.0-snapshot"

Не очень приятно, но это работает. Это решение также используется jgitflow (плагин Maven для поддержки потока git)

Ответ 3

С Maven вы должны не вручную изменить номер версии.

Вы должны добавить информацию о "scm" в ваш pom, чтобы Maven совершил и сразу же изменил версию.

Затем используйте "плагин выпуска". Он будет работать для вас. Предположим, что ваша текущая версия "1.1-SNAPSHOT", задача "release: выполнить" maven будет:

  • Измените версию на 1.1, зафиксируйте, пометьте эту версию и нажмите ее.
  • Снова измените версию на 1.2-SNAPSHOT (или 1.1.1-SNAPSHOT, 2.0-SNAPSHOT... вы можете выбрать следующую версию), зафиксировать и нажать.

Вот выдержка из истории git в проекте, в котором используется плагин выпуска Maven:

* 2345678 - Normal developpement commit (on branch 1.2-SNAPHOT).
* 5678901 - [maven-release-plugin] prepare for next development iteration
* 8901234 - (tag: 1.1) [maven-release-plugin] prepare release 1.1
* 1234567 - Normal developpement commit (on branch 1.1-SNAPHOT).

Примечание 1: В момент выпуска вы должны указать следующую версию (1.2 в этом примере). Если вы передумаете, вы можете изменить его позже. Плагин Maven "version: set-version" позволяет переназначить версию всей иерархии проекта. Вам просто нужно будет перенести это изменение версии до следующей версии.

Примечание 2: В момент выпуска вы также можете изменить версию выпуска. Даже если текущая версия 1.1-SNAPSHOT, вы можете решить, что релиз - это версия 2.0 и следующая версия для разработки 2.1-SNAPSHOT.