2012-02-14 5 views
19

Должен признаться, что я новичок в мире maven после многих лет жизни в мире чудовищных химерных конструкций deuild/ant/makefile. У меня просто нет такого чувства, которое помогает опытному разработчику выбирать правильные решения, и похоже, что в maven есть много разных способов.Самый простой способ развернуть производство со сборками

Итак, у меня есть простой проект, содержащий веб-приложение. Я хочу, чтобы в основном следующие:

  • развернуть на развитие Tomcat (я использую Tomcat: развертывание), то ничего не делать.
  • развертывание в производство Tomcat, но перед развертыванием обновление git repo, добавление тегов с фиксацией и обновление версии сборки.

Для различения разработки и производства я создал профили, dev и prod. Профиль dev активируется по умолчанию. Когда я хочу развернуть что-то в производство, я просто набираю mvn -P prod tomcat:deploy

Я читал о плагине выпуска, а также о плагине buildnumber. Но я просто не уверен, что иду правильным путем.

Итак, вопрос в том, что является самым сукцинированным, самодостаточным и «мафиозным» способом решения задачи, о которой я прошу.

ответ

21

Shabunk, как я был прокомментирован, Maven заставляет вас наилучшим образом сделать то, что вы хотите, унаследовав от опыта опыта разработчиков.

Я бы объяснил, что бы я сделал (и что я на самом деле).

Так вы право использовать Maven релиз плагина, плюс еще один (груз, например) Вы пытаетесь сделать две вещи: Differents

  • Идентификация уникальную версию, что означает пометка его, и обновление POM для новой версии
  • Развертывание приложения (независимо от того, который ENVIRONNEMENT это)

Maven Release Plugin

Рассмотрите, что ваш собственный процесс, возможно, более длинный, чем другие команды разработчиков. Я имею в виду, что между единичным тестированием и производственным развертыванием существует больше шагов в более крупных командах (Q & A, пользовательский прием, не регрессионные лагеря). Кажется, что вы создаете ярлык, связывающий тег и развертывание производства. Если вы хотите развернуть свой webapp в разных средах (интеграция, пользовательская согласованность, производительность, препрод и т. Д.), Вам пришлось идентифицировать вашу версию и иметь возможность ее снова создать (обязательно и «повторяемо»).

Для этого предназначен плагин maven-release-plug-in. Это поможет вам убедиться, что ваш исходный код чист (все файлы, находящиеся под контролем источника, без изменений), могут собирать и передавать все этапы тестирования. Затем он имеет дело с версией pom и тегами и заканчивается, сохраняя ее для последующего использования в вашем репозитории предприятий Maven.

У вас есть много настроек для настройки (настройка ditributionManagement, SCM, maven plugin).Но как только он находится в месте, выпустив версию стоять в одной простой командной строки:

mvn release:prepare release:perform 

Если вы хотите, чтобы некоторые примеры, я могу дать вам некоторые.

<scm> 
    <!-- Base URL repository --> 
    <url>scm:svn:http://svn.myorg.corp/svn/repository/</url> 
    <!-- Developper URL (from trunk or branche) --> 
     <developerConnection>scm:svn:http://svn.myorg.corp/svn/repository/trunk/project1</developerConnection> 
    <connection>scm:svn:http://svn.myorg.corp/svn/repository/trunk/project1</connection> 


</scm> 
<build> 
    <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-scm-plugin</artifactId> 
       <version>1.6</version> 
       <configuration> 
      <username>${from.settings.xml.user}</username> 
      <password>${from.settings.xml.password}</password> 
       </configuration> 
    </plugin> 

    <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-release-plugin</artifactId> 
       <version>2.2.2</version> 
       <configuration> 
       <tagBase>http://svn.myorg.corp/svn/repository/tags/</tagBase> 
      <scmCommentPrefix>[DEV#SCM]</scmCommentPrefix> 
     </configuration> 
    </plugin> 
</plugins> 
    [...] 
</build> 
<distributionManagement> 
    <repository> 
     <id>enterprise_repo</id> 
     <name>Enteprise Repository on Artifactory - Stable versions</name>  <url>http://repo.corp:8080/artifactory/prj-xxx-releases</url> 
    </repository> 
    <snapshotRepository> 
     <id>enterprise_repo</id> 
     <name>Enteprise Repository on Artifactory - DEV versions</name> 
     <url>http://repo.corp:8080/artifactory/prj-xxx-snapshots</url> 
    </snapshotRepository> 
    <site> 
     <id>corporate_site</id> 
     <name>Corporate public site</name> 
     <!-- must add wagon plugin that support this protocol --> 
     <url>ftp://...</url> 

    </site> 
</distributionManagement> 

Deployement

Еще раз, вы можете иметь несколько environnements, на котором вы хотите, чтобы проверить ваше приложение против. Существует много плагинов, которые позволяют отправлять и разворачивать вашу войну: общий плагин-плагин или более конкретные модули tomcat-плагин, плагин-плагин, ... Плагины дают вам возможность делать то, что вы хотите. Затем конфигурация может быть выполнена разными способами.

Полный путь Maven: Полный интегрированный способ с Maven заключается в использовании профиля и, возможно, фильтров. Профили позволяют описывать свойства и поведение, как вы, кажется, знаете. Фильтры являются своеобразными .properties, группирующими набор переменных, которые будут использоваться для замены шаблонов в вашем файле конфигурации xml на войне (например, соединение db). Это не тот, который я использую, потому что я нахожу его менее гибким, чем внешние файлы. Но независимо от того,

Maven с экосистемой: Так я предпочитаю строить свои приложения с Maven и Дженкинс (или инструмент Continous Integration). Вот почему я согласен с Аароном, когда он говорит, что вам нужно ограничить свои инструменты. Используя Jenkins, я запускаю каждый час/день свое приложение против Unit Tests, generatio Q & Отчеты, документация, ... У меня есть сборка релизов, которая помогает мне создавать все, что я хочу доставить (моей тестовой команде или моему клиенту), и я предоставляю некоторую информацию для своих работ, чтобы развернуть ее на разных средах (используя профили maven или встроенную конфигурацию jenkins).

Это работает отлично для меня, и я уверен, что это правильный путь.

[EDIT]


Развертывание

Еще раз, развертывание означают различные фазы жизненного цикла.

Local/Dev не ENVIRONNEMENT

Я никогда не использую Tomcat: развертывание до сих пор, но только потому, что я предпочитаю использовать причал как свет веб-контейнер (и хорошо интегрирован с Maven). Но я уверен, что каждая конфигурация конфигурации будет соответствовать вашим потребностям.

непрерывной интеграции Environnement В непрерывной интеграции Environnement, я обычно копирую войну непосредственно Дженкинс (экспорт * .war на нужной машине). Я так делать, зависит от многих вещей:

  • если CI мягкий находится на том же (физическом | виртуальном) сервере, чем сервера приложений (Tomcat, JBoss, WebLogic GlassFish, ...), или удаленное одно => время копирования выйдет из состояния обновления сервера и создаст небезопасное развертывание (обычно поврежденные архивы)
  • если сервер поддерживает горячую перезагрузку (взорванную войну в веб-приложениях для Tomcat) или, по крайней мере, знает файловую систему модификации (полная война в/развернуть для JBoss)
  • , если вам необходимо остановить сервер перед ...

Большинство времени, это просто копия. Если я не могу, я использую некоторые интегрированные плагины maven (например, jahia: развернуть плагин для знаменитой CMS: www.jahia.com) или просто плагин для загрузки: http://cargo.codehaus.org/Maven2+plugin. У меня нет никакого примера, но очень легко найти некоторых в Интернете, потому что эта конфигурация часто рекомендуется.

Q & A/Прием/Производство Environnement

Для тех видов environnements, которые часто (насколько я, как я видел в своей работе) имеет дело с Соглашением об уровне обслуживания, мы (я или администратор команды) написал некоторые конкретные сценарии. Я уверен, что вы будете обескуражены, но, как я упоминал, я не полагаюсь на Maven для всего и для развертывания в частности. ИМХО, это один предел этого инструмента. Возможно, вы можете полагаться на грузовой плагин или на конкретные, но выпускать версию или строить ее не соответствуют (по времени) при реальном развертывании. Более того, я не нашел плагина, который позволил мне легко развернуть на нескольких экземплярах ... и даже стоило вам отключить экземпляры в определенном порядке (потребности SLA). Тем не менее, я не упоминал внешние свойства, SQL-скрипты или что-то еще. Это дополнительные причины полагаться на выделенный инструмент.

Итак, как правило, мы написали собственные скрипты ant/sell. Если у кого-то еще есть лучшие решения, я, очевидно, поселился!

Надеюсь, я был достаточно ясен.

С уважением.

1

Решение Mavenized не должно использовать Maven, если у вас есть исключение из общего случая. Maven - это общий пример. Исключения обрабатываются в другом месте, что означает, что POM (должен) никогда не будет содержать никаких сюрпризов.

Поскольку вам нужен особый процесс развертывания, напишите сценарий оболочки или Ant build.xml, который выполнит необходимые действия и использует Maven в процессе развертывания.

Таким образом, каждый инструмент делает, что он может сделать наилучшим образом.

[РЕДАКТИРОВАТЬ] Примечание для всех нижеперечисленных лиц: Если у вас нет аргумента, ваш проголосовавший голос ничего не значит. Maven - это инструмент. Как и все инструменты, у него есть ограничения. Основная философия Maven заключается в том, чтобы избежать исключений. Ant - это все, что касается угловых случаев, Maven - это основной поток. Из "What is Maven?" страницы:

  • делает процесс сборки легко
  • Обеспечение единой системы сборки

(курсив мой) Так что да, есть вещи, для которых Maven - не лучшее решение для. Если стандартный процесс выпуска работает для вас, используйте release plugin.

Но если это не так, то смотрите в другом месте вместо того, чтобы падать на «ловушку ума».

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

+0

Каким образом профиль поддерживает вас с пометкой в ​​репозитории git и приращением версии сборки? Maven - это инструмент, подобный молотку - он не подходит для каждой задачи. –

+0

Вы ошиблись в своих основных помещениях. –

+0

Я полностью согласен с тобой, Аарон. Maven - один из лучших инструментов, которые я знаю для управления жизненным циклом разработки на основе лучших практик. Если вы не используете его, это, вероятно, потому, что вы не на правильном пути (относительно лучших оценок). Поэтому вы должны делегировать другой инструмент, обычно Ant, Jenkis или что-то еще. Это сложно, часто невозможно в наследии проекта, но это правильный способ сделать это ... +1! –

4

Исходный вопрос, заданный для «лучшей практики» для развертывания производства с Maven. Я ожидал получить более чем одну «лучшую практику» и предложил щедрость увидеть различные решения и узнать от них. Меня не волнует, являются ли они чистыми решениями maven или используют различные инструменты.

Параллельно этой теме я также изучал и хотел бы опубликовать здесь различные подходы, которые я вижу. Я пробовал 1) и 3), они чистые maven и независимо от того, что говорит Аарон, они тоже работают.

В моем текущем проекте у меня есть среда разработки, тестовая среда, промежуточная среда и производственная среда. От моего maven pom я хотел бы работать с средой разработки и развертываться только в тестовой среде. Я вижу следующие подходы с Maven П:

  1. профилей с фильтрующими свойствами
    При работе с этим подходом, доставляемые (война файл) должен быть переделали для различных сред. Это заставило меня предложить щедрость, потому что мне это не понравилось.
  2. профили wit Maven WAR overlays или assembly plugin
    Это также создавало различные артефакты для разных платформ. Но вместо того, чтобы перестроить файл войны, он будет распакован/исправлен/переупакован (для наложения войны) или будет создан и упакован с различными настройками (плагин сборки). Мне тоже не понравилось это решение.
  3. Плагин развертывания (например, Cargo plugin) без профилей
    Укажите полную сборку с установкой, а также включите плагин для загрузки, но не подключите его к какой-либо фазе. Поэтому я всегда работаю с средой разработки, но когда я прямо называю грузовой плагин, он развертывает войну из хранилища в контейнер (тестовую среду). Я могу даже использовать профили для различения различных контейнеров только для развертывания через груз.

Во всех решениях я использую интеграционный тест (плагин верфи), плагин версии и выпускной плагин для построения войны. Для развертывания я реализую подход номер 3, следуя аргументам от https://stackoverflow.com/a/1151870/734687 (сообщение, которое выражает очень хорошее то, что я также предпочитаю).

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

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="ignoreResourceNotFound" value="true"/> 
    <property name="locations"> 
     <list> 
      <value>classpath:META-INF/spring/*.properties</value> 
      <value>file:///${picservice.configdir:-}/*.properties</value> 
     </list> 
    </property> 
</bean> 

Свойство в META-INF/пружинного реж загружается всегда. Кроме того, я интегрирую свойства из файловой системы, которые могут переопределить указанные выше свойства. Если свойства не обнаружены, это не вызовет экзекцию, потому что я установил ignoreResourceNotFound. Если задано свойство picservice.configdir, оно направляет меня в каталог, если не для того, чтобы предоставить значение по умолчанию :. - говорит, что я не хочу иметь значение, которое является текущим каталогом.

Для ведения журнала у меня есть аналогичное решение.Вы можете найти очень интересные статьи о файле свойств обработки с весны по следующим ссылкам:

Я нашел интересную презентацию об этом тема, см. Automated Deployment with Maven and friends.

+0

-1 Как обновить git repo с помощью профиля? Как профиль увеличивает номер сборки? Как вы все это делаете, когда стандартные плагины maven не работают так, как вы делаете? –

+0

1) Ваш ответ по-прежнему не показывает, как это можно сделать с Maven. У меня такие же проблемы с моей сборкой, и стандартные плагины просто не делают то, что мне нужно. 2) Я использую Maven для всех своих сборников. Это мой стандартный инструмент. Я написал для него плагины и исправил существующие плагины. И самое главное, я знаю, каковы ограничения. –

+0

Отличная идея вашей щедрости! –

2

обновить git repo, добавить тегирование и обновить версию сборки.

-

Я прочитал о выпуске плагина, а также о BuildNumber плагин. Но я просто не уверен, что иду правильным путем.

Да, использование плагина выпуска рекомендуется. Вы можете использовать плагин buildnumber, если вы хотите, чтобы номер с номером в каком-либо документе, например. CHANGES.txt

0

возможно Phing другой его инструмент, чтобы решить вашу проблему, ее просто, и вы можете создавать собственные процессы

Phing website

+2

вопрос был о Java, а не PHP – Denees

2

Я думаю, что самый простой способ сделать то, что вы указали (если я хорошо понял) необходимо настроить Maven Release Plugin следующим образом:

<!-- path: project/build/pluginManagement/plugins --> 
<plugin> 
    <artifactId>maven-release-plugin</artifactId> 
    <configuration> 
    <releaseProfiles>prod</releaseProfiles> 
    <goals>tomcat:deploy</goals> 
    </configuration> 
</plugin> 

для развертывания Дев проделайте вы делаете: mvn tomcat:deploy -P dev (если dev активна по умолчанию удалить -P dev).

При отпускании проходит в два этапа, как Maven Release Plugin ожидает:

mvn release:prepare 

Эта цель будет увеличивать версию и теги, как вы хотите (and more). Обратите внимание на то, что вам также необходимо указать, что SCM Maven следует использовать Задавая этот тег в POM:

<!-- path: project --> 
<scm> 
    <connection>scm:git:ssh://yourrepo.url</connection> 
</scm> 

SCM plugin поддерживает wide variety of SCM managers and protocols (вы можете быть заинтересованы в git:http или git:https).

А потом

mvn release:perform 

Это будет использовать профиль prod и просто запустить цель tomcat:deploy, именно то, что вы настроили.

Надеюсь, это то, что вам нужно. С уважением.

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