Самый простой способ развертывания в производство со сборками - PullRequest
20 голосов
/ 14 февраля 2012

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

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

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

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

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

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

Ответы [ 6 ]

22 голосов
/ 10 июня 2012

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

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

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

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

MavenПлагин релиза

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

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

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

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

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

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

Maven с его экосистемой: Я предпочитаю создавать приложения с помощью Maven и Jenkins (или инструмента непрерывной интеграции).Вот почему я согласен с Аароном, когда он говорит, что вам нужно знать ограничения ваших инструментов.Используя Jenkins, я каждый час / день запускаю свое приложение на основе модульных тестов, генерации отчетов по вопросам и ответам, документации, ... У меня есть сборка релиза, которая помогает мне производить все, что я хочу доставить (моей группе тестирования или моему клиенту),и я предоставляю некоторую информацию своим работам, чтобы развернуть ее в различных средах (используя профили maven или встроенную конфигурацию jenkins).

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

[РЕДАКТИРОВАТЬ]


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

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

Локальная среда / среда разработки

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

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

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

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

Вопросы и ответы / Приемка / Производственная среда

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

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

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

С уважением.

4 голосов
/ 08 июня 2012

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

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

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

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

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

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

<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 / spring dir загружаются всегда. Дополнительно я интегрирую свойства из файловой системы, которые могут переопределять свойства выше. Если свойства не найдены, это не вызовет исключение, потому что я установил ignoreResourceNotFound. Если свойство picservice.configdir установлено, оно направляет меня в каталог, если нет, то я предоставил значение по умолчанию с :. - говорит, что я не хочу иметь значение, которое является текущим каталогом.

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

Я нашел интересную презентацию на эту тему, см. Автоматическое развертывание с Maven и друзьями .

2 голосов
/ 14 июня 2012

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

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

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

При освобождении выполните два шага, как ожидает Плагин релиза Maven :1013 *

mvn release:prepare

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

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

Плагин SCM поддерживает ширину различные диспетчеры и протоколы SCM (вас могут заинтересовать git:http или git:https).

А затем

mvn release:perform

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

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

2 голосов
/ 09 июня 2012

обновить репозиторий git, добавить коммит с тегами и обновить версию сборки.

-

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

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

1 голос
/ 08 июня 2012

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

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

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

[EDIT] Примечание для всех нижестоящих пользователей: если у вас нетаргумент, ваш отрицательный голос ничего не значит.Maven это инструмент.Как и все инструменты, у него есть ограничения.Основная философия Maven - избегать исключений.Ant - это все о угловых делах, Maven - о главном потокеСо страницы " Что такое Maven? ":

  • Упрощение процесса сборки
  • Предоставление унифицированной системы сборки

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

Но если этого не произойдет, тогда ищите в другом месте вместо того, чтобы искать ", все выглядиткак гвоздь"ловушка разума.

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

0 голосов
/ 14 июня 2012

возможно, phing - это еще один инструмент для решения вашей проблемы, он прост, и вы можете создавать собственные процессы

Phing website

...