Невозможно получить автоматическую версию с помощью Hudson + Git + Maven Release Plugin
Как говорится в названии, я пытаюсь получить работу по автоматическому выпуску, работающую над Hudson. Это проект Maven, и весь код находится в Git. Вручную, я делаю выпуск на своей личной машине так:
git checkout master
mvn -B release:prepare release:perform
Это прекрасно работает. Плагин релиза Maven корректно помещает тег релиза в исходный репозиторий, а также следующий коммит, который ударяет версию на следующий SNAPSHOT.
Однако, когда я запускаю эту же работу Maven через Hudson (либо создав собственное задание "release", либо используя M2 Release Plugin), это не работает так хорошо. Тег релиза выталкивается в исходный репозиторий, и релиз выталкивается в наш репозиторий Nexus, но последующая фиксация, которая ударяет версию на следующий SNAPSHOT, не исчезает. Кроме того, ветвь "master" в исходном репозитории вообще не изменяется. Однако я просмотрел рабочую область Хадсона для этой работы, и версия была обновлена.
Посмотрев на результат задания Хадсона, похоже, что плагин Git фактически не проверяет "мастер", а скорее его SHA1 id. То есть, если метка ветки "master" указывает на фиксацию "f6af76f541f1a1719e9835cdb46a183095af6861", Хадсон делает
git checkout -f f6af76f541f1a1719e9835cdb46a183095af6861
вместо
git checkout -f master
В результате изменения, которые делает плагин выпуска Maven, фактически не находятся в какой-либо ветке (конечно, не на "master" ), и эти изменения не попадают в исходный репозиторий. Он работает на правильном коде, но бухгалтерия - мудрый, изменения, похоже, теряются, потому что ни одна метка отрасли не указывает на них.
Кто-нибудь получил сборку Hudson + Git + Maven Release Plugin для правильной работы? Есть ли какая-то дополнительная конфигурация, где я могу установить, чтобы это произошло? Или это ошибка в плагине Hudson Git?
Спасибо заранее.
Ответы
Ответ 1
После того, как я немного поработал с вещами, я попытался установить автоматическую версию как автономное задание (т.е. не использовать M2 Release Plugin). Вместо того, чтобы задание было настроено на "создание проекта maven2", я сделал это над проектом "Создавать проект в свободном стиле". Первое, что он делает, это выполнить команду оболочки:
git checkout master
Следующий шаг - вызов Maven, настроенный таким образом:
-e -B release:prepare release:perform
Эта первая команда оболочки - это ключ; теперь, когда я нахожусь на ветке, все изменения, которые выполняет плагин релиза, возвращаются в исходный репозиторий.
Хотя это технически отвечает на мой собственный вопрос, мне все же любопытно, как с опытом других людей с этой комбинацией плагина Hudson + Git + Maven Release.
Спасибо
Ответ 2
Отредактировано для удаления устаревшей информации.
См. этот ответ для текущего (не-хаки) решения.
Ответ 3
Если я правильно понимаю, это поведение преднамеренно, потому что Найджел не верит, что maven должен передать SCM. Существует относительно безболезненное обходное решение (хотя было бы лучше не обойтись ничем). Я использую плагин Hadson M2 Extra Steps и делаю шаг предварительной сборки:
git checkout master || git checkout -b master
git reset --hard origin/master
Это выполняется после того, как git проверил sha-1, но прежде, чем maven начнет строить. Выполнение этого способа позволяет мне установить мастер на то, что проверил плагин git. Затем я использую maven-release-плагин для выполнения выпусков, а изменения и развертывание SCM прекрасны.
Ответ 4
@meowsqueak: У меня была та же проблема и исправил плагин, чтобы добавить переменную под названием "GIT_BRANCH" в среду сборки. Если вы хотите попробовать, модифицированный плагин доступен для скачивания @github: http://github.com/jberkel/Hudson-GIT-plugin/downloads. Я также связался с автором вверх, чтобы объединить его с основной линией. Конечно, это не решает проблему отсоединенной HEAD, но по крайней мере ваши скрипты сборки знают, в какой ветки вы находитесь.
Ответ 5
Я знаю этот старый вопрос, но все же отвечаю за хороший ответ.
Сделайте то, что предлагается здесь:
https://blogs.adobe.com/jzitting/maven-release-builds-with-jenkins-and-git/
"Решение заключалось в том, чтобы установить опцию" Checkout/merge to local branch (optional) "в расширенных настройках Git на экране конфигурации сборки Jenkins".
Я разместил там "ГОЛОВКУ" и знаю, что вы выпускаете.