2012-05-10 3 views
12

Было бы здорово, если сообщество гуру Maven может помочь мне в выполнении следующей задачи.Полностью автоматизировать процедуру выпуска с плагинами выпуска + версии

Я хотел бы автоматизировать процесс выпуска модуля Maven в Хадсоне таким образом, чтобы процесс выпуска выполнялся в пакетном режиме (от консоли не требуется ничего, что можно было бы попросить). В настоящее время я использую общие шаги release:prepare<preparationGoals>versions:update-parent clean verify</preparationGoals> для обновления родительской версии до последней версии до фиксации) + release:perform. Однако я хотел бы Maven сделать следующее:

когда-нибудь на стадии подготовки:

  • Для всех зависимостей, которые соответствуют groupId текущего модуля и родителя, замените -SNAPSHOT с выпущенной версии (например versions:use-releases -Dincludes=???) ,

когда-нибудь после выпуска:

  • Для всех зависимостей, которые соответствуют groupId текущего модуля и родителя, замените версию выпуска с -SNAPSHOT версии (например, versions:use-latest-snapshots ...).

Пример:

<parent> 
    <groupId>org.mycompany.myproject</groupId> 
    <artifactId>myproject-parent</artifactId> 
    <version>1.0-SNAPSHOT</version> 
</parent> 

<dependency> 
    <groupId>${project.groupId}</groupId> 
    <artifactId>myproject-api</artifactId> 
    <version>1.1-SNAPSHOT</version>   
</dependency> 

до того модуля помеченной превращается в:

<parent> 
    <groupId>org.mycompany.myproject</groupId> 
    <artifactId>myproject-parent</artifactId> 
    <version>1.0</version> 
</parent> 

<dependency> 
    <groupId>${project.groupId}</groupId> 
    <artifactId>myproject-api</artifactId> 
    <version>1.1</version>   
</dependency> 

и после освобождения сменяет превращается в:

<parent> 
    <groupId>org.mycompany.myproject</groupId> 
    <artifactId>myproject-parent</artifactId> 
    <version>1.1-SNAPSHOT</version> 
</parent> 

<dependency> 
    <groupId>${project.groupId}</groupId> 
    <artifactId>myproject-api</artifactId> 
    <version>1.2-SNAPSHOT</version>   
</dependency> 

Я чувствую, как он требуется смесь

versions:use-releases scm:commit release:prepare release:perform versions:use-latest-snapshots scm:commit

но я не уверен, что это лучший способ сделать это. Особенно приятно иметь как можно меньше коммитов: трудность заключается в том, что reparationGoals запускаются после -SNAPSHOT проверки версии.

Описанный проект не является многомодульным проектом в смысле, что родительский POM не ссылается на своих детей через <modules>. Структура SCM выглядит следующим образом:

. 
| 
+-- myproject-parent 
| +-- pom.xml 
+-- myproject-api 
| +-- pom.xml 
+-- myproject-impl 
    +-- pom.xml 

зависимости: родитель

myproject-api → myproject-parent 
myproject-impl → myproject-parent 
myproject-impl → myproject-api 

проекта POM (myproject-parent) будет выпущены редко и, таким образом, будет выпущен первым. Затем myproject-api (при необходимости), а затем myproject-impl.

ответ

5

Простая проблема заключается в том, что ваш родитель имеет другой номер версии, чем ваши дети, что является неправильным способом для сборки мулитного модуля. Многомодульная сборка предназначена для того, чтобы иметь ряд связанных модулей, которые имеют тот же процесс выпуска, из которого следует, чтобы иметь тот же номер версии. Если вы следуете этому руководству, вам не нужен плагин версий, который вы делаете только релиз через выпуск: подготовьте и отпустите: выполните «Это все».

Update: После дальнейшего обсуждения я хотел бы предложить, чтобы установить новый набор заданий Hudson, которые содержат зависимости между модулями (вниз по течению/вверх по течению DEPS.) И сделать релиз на каждую работе Хадсона, который вызывает следующий в строке заданий и так далее. Это предпосылки для того, чтобы иметь отдельные модули и отдельные области в управлении версиями. В противном случае этот бой будет потерян с Maven и усложнит жизнь.

+3

Я не могу согласиться с вами. У нас есть плоская модульная структура: это единственный способ сделать их разделенными и независимыми в Хадсоне (иначе проверка провала в подмодуле не завершит сборку всего проекта). Некоторые из модулей (например, родительский POM) редко меняются: нет необходимости их выпускать. Другие (например, «модель») будут выпущены несколько раз. И ваш совет не работает, если у меня есть зависимости между двумя мультимодульными проектами. Даже для многомодульной сборки у меня нет доказательств того, что 'release: подготовить' заменит зависимостей' -SNAPSHOT' с версиями «будущего выпуска». –

+0

Для первого я могу сказать, что это хорошо, если тесты не сработают, вся сборка не сработает, потому что что-то не так. Вопрос в том, почему вы любите разлучать их в Хадзоне? Либо это многомодульная сборка, либо нет. Кроме того, если родительский pom изменяется редко, поэтому кажется, что это может быть отдельный модуль, у которого есть собственный цикл выпуска, и вам нужно его освободить, потому что он используется в качестве зависимости/родителя от других. Если у вас есть зависимости между модулями, что будет работать в многомодульной сборке. Я могу порекомендовать посмотреть здесь: https://github.com/khmarbaise/javaee. – khmarbaise

+0

_Для первого я могу сказать, что это хорошо, если тесты не сработают, вся сборка не сработает, потому что что-то не так. Это не всегда удобно. В нашем проекте небольшие группы разработчиков работают над собственным модулем. Каждый модуль имеет свой собственный список уведомлений по электронной почте, чтобы отправлять электронные письма, когда сборка сбоев/восстановление после сбоя. Таким образом, лица 'X' и' Y' отвечают за модули 'A' и' B'. –

Смежные вопросы