Мне нужно решить трудный случай, связанный с автоматическим управлением версиями проектов Maven, я надеюсь, что найду подходящее решение, основанное на вашем опыте и советах.
Проблема такая: У нас есть огромный java-продукт, состоящий из ~ 200 очень взаимозависимых различных проектов. Мы договорились, что каждый проект нужно разрабатывать независимо, чтобы у каждого из них был свой жизненный цикл. В стадии разработки все работает нормально, проблем нет. Проблема возникает, когда мы готовим релиз для этих проектов: поскольку проектов очень много, ручные изменения доставляют боль, поэтому мы решили найти автоматическое решение для решения процесса выпуска.
Предпосылки таковы: Мы все согласились, что политика выпуска с точки зрения SVN должна быть такой: - вся разработка должна выполняться на магистрали SVN, релизы должны создаваться и поддерживаться в ветвях. Каждый выполненный выпуск должен автоматически создавать тег.
Политика с точки зрения MAVEN такова: - перед выпуском проекта мы сначала копируем транк в ветку, чтобы иметь контроль над сопровождением проектов в разветвленном коде. Выбранная нами система управления версиями: Major.Minor.BuildNumber-SNAPSHOT (например, 1.0.0-SNAPSHOT) . При разветвлении кода мы хотим изменить номер версии проекта, увеличив MinorVersion (например, trunk-1.0.0-SNAPSHOT станет 1.1.0-SNAPSHOT, а 1.0.0-SNAPSHOT будет быть скопированы и выпущены в новой созданной ветке) - когда мы решаем, что проект достаточно зрел для того, чтобы его можно было выпустить, мы выпускаем его, используя maven-release-plugin ( mvn release: clean release: подготовить выпуск: выполнить ) так что наша версия проекта будет преобразована из Major.Minor.BuildVersion-SNAPSHOT (например, 1.0.0-SNAPSHOT) в Major.Minor.BuildVersion (например, 1.0.0) , затем будут подготовлены к следующей итерации разработки, например: Major.Minor.BuildVersion + 1-SNAPSHOT (например, 1.0.1-SNAPSHOT)
Проблемы, с которыми мы сталкиваемся, связаны с управлением версиями проектов.Итак, на этапе разработки основной ветви все проекты используют последние версии SNAPSHOT своих зависимостей ( версии mvn: use-latest-versions -DallowSnapshots = true -DupdateDependencies = true ), но когда мы считайте, что пора начинать процедуру релиза и готовиться к ветвлению кода, тут начинаются проблемы: мы начинаем ветвление
parent-pom
( mvn -B release: clean release: branch -DbranchName = $ {project.artifactId} _ $ {project.version} -Dusername = $ {username} - Dpassword = $ {passwd} -Dproject.rel. $ {GroupId}: $ {projectId} = 1.0.0-SNAPSHOT -Dproject.dev. $ {GroupId}: $ {projectId} = 1.1.0-SNAPSHOT )
независимые проекты
( mvn -B release: clean release: branch -DbranchName = $ {project.artifactId} _ $ {project.version} -Dusername = $ {username} - Dpassword = $ {passwd} -Dproject.rel. $ {GroupId}: $ {projectId} = 1.0.0-SNAPSHOT -Dproject.dev. $ {GroupId}: $ {projectId} = 1.1.0-Версии SNAPSHOT: update-parent -DallowSnapshots = true )
:
( mvn -B release: clean release: branch -DbranchName = $ {project.artifactId} _ $ {project.version} -Dusername = $ {username} -Dpassword = $ {passwd} -Dproject.rel. $ {groupId}: $ {projectId} = 1.0.0-SNAPSHOT -Dproject.dev. $ {GroupId}: $ {projectId} = 1.1.0-SNAPSHOT версии: родитель-обновление -DallowSnapshots = истинные версии: использовать-последние-версии -DallowSnapshots = true -DupdateDependencies = true )
. увеличивайте MinorVersion при ветвлении проекта, maven-release-plugin 2.2.2 не увеличивает значение pom MinorVersion в магистрали при ветвлении, поэтому нам нужно использовать -Dproject.отн. $ {groupId}: $ {projectId} = 1.0.0-SNAPSHOT -Dproject.dev. $ {GroupId}: $ {projectId} = 1.1.0-SNAPSHOT аргументы и изменять их вручную для каждого проекта, то есть 200 раз каждый раз, когда мы готовимся к новому выпуску.
Мне интересно, не является ли это способом сделать всю описанную процедуру каким-то образом в автоматическом режиме и не выполнять все эти изменения все время вручную. Мы учли даже модульность этого продукта, чтобы, вероятно, свернуть эти 200 проектов в 100, но это неприемлемо, поскольку идея состоит в том, чтобы иметь мелкозернистое управление версиями проектов и иметь все проекты с собственным жизненным циклом, поэтому агрегатор (Я имею в виду классический) здесь не обсуждается.
Мы используем SVN в качестве VCS, Maven в качестве инструмента сборки (возможно, вы уже догадались об этом :)) и Bamboo в качестве CI-сервера (на самом деле, вместо функции Maven Dependency Processor, Bamboo мне не помогает много о проблеме управления версиями).
У вас есть идеи, как найти правильное решение этой проблемы, может быть, другой плагин, который поможет (versions-maven-plugin не меняет версии автоматически при ветвлении), может быть, другая точка зрения на это, я не знаю ..., любая помощь или предложение приветствуются.
Спасибо!