Многомодульное развертывание Maven в хранилище только после успешных модульных тестов

Вопрос: Какое наилучшее решение для выполнения "развертывания mvn", так что часть развертывания запускается только после успешного завершения всех модульных тестов и дублирования шагов обработки?

Я надеялся, что простой ответ: выполнить команду maven "x" (или использовать флаг), чтобы развертывание можно было запустить без использования предыдущих целей в жизненном цикле по умолчанию.

К сожалению, у этого нет простого ответа. Я включил подробную информацию о пути, который я придерживался ниже.

У нас есть три требования:

  • Выполнение задачи развертывания maven для развертывания всех многомодульных артефактов в удаленном репозитории.
  • Развертываться только в том случае, если проходят все модульные тесты во всех проектах.
  • Не повторяйте обработку.

Мы начали с простого "mvn clean deploy", однако мы заметили пару проблем:

  • сборка остановится перед завершением всех модульных тестов:: поэтому мы добавили флаг "фальшивый конец"
  • Цель развертывания будет выполняться в отношении любых успешных модулей.

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

Мы рассмотрели 3 разных решения:

  • Постановка артефактов до развертывания:: это было определено слишком тяжелым для полностью автоматизированного процесса.
  • Использовать профиль для переопределения жизненного цикла по умолчанию, чтобы "mvn deploy -Pci-deploy" выполнялся без привлечения каких-либо предыдущих целей: это работало и выполнялось быстро, но, очевидно, это нетрадиционный подход.
  • Просто запустив 'mvn clean package', а затем только если он успешно выполнит 'mvn deploy':: это работает, и кажется, что он только вторгается при запуске целей (хотя некоторые из них достаточно умны, чтобы не перерабатывать неизменное рабочее пространство)

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

  • Новая цель развертывания, которая может выполняться отдельно и отдельно от всех других целей жизненного цикла с ожиданием того, что: все предыдущие шаги уже выполнены и что он будет выполнять развертывание идентично "mvn deploy"
  • флаг в цели развертывания, который бы эффективно отключил предыдущие цели.

немного больше из коробки и определенно против текущего соглашения:

  • флаг, который будет сообщать maven для запуска цели тестирования [unit] для всех модулей перед продолжением.

Примечания:

  • Мы используем Jenkins, но для целей этого вопроса среда CI не является усложнением.
  • Я попытался выполнить задачу "mvn deploy: deploy", но имел ряд нечетких ошибок.
  • Я не рассматривал интеграционные тесты как часть требований.

Обновление 8/20/2013

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

Для нашей базы кода:

  • mvn clean deploy: для всех целей, выполненных в 2:44
  • mvn clean install 'deferred-deploy-plugin': для всех целей, выполненных за 15 минут
  • mvn чистый пакет; mvn deploy -Pci-развертывать профиль пользовательской сборки, который отключает предыдущие цели:
    • для всех целей (включая развертывание): 4:30
    • только для развертывания: 1:45
  • mvn чистый пакет; mvn deploy -Dmaven.test.skip = true в той же рабочей области выполнено:
    • для всех целей (включая развертывание): 4:40
    • только для развертывания: 1:54

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

Похоже, что при выполнении жизненного цикла развертывания и выходе из предыдущих целей (процесс, компиляция, тестирование, пакет и т.д.) наблюдается незначительное поражение. Однако единственной альтернативой является взломать нестандартное исполнение, которое экономит только 10 секунд.

Ответ 1

Теперь есть новый ответ. Начиная с версии 2.8 плагина maven deploy, есть способ сделать это "изначально". Подробнее см. вопрос о jira.

В основном вам нужно заставить не менее v2.8 плагина

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-deploy-plugin</artifactId>
   <version>2.8</version>
</plugin>

и используйте новый параметр deployAtEnd. подробнее здесь. Обычно этот параметр соответствует installAtEnd модуля maven-install-plugin

Ответ 2

В качестве альтернативы я также нашел это http://code.google.com/p/maven-deferred-deploy-plugin/

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

Звучит так же, как то, о чем вы просили. Я все еще думаю, что мой другой ответ проще реализовать, поскольку вы используете jenkins, просто установите флажок

Ответ 3

Две вещи.

  • Отключение всех предыдущих этапов я не вижу в качестве опции. Это основная особенность maven, вы бы изменили стандартный жизненный цикл, поэтому я очень сомневаюсь, что кто-то будет внедрять что-то в плагин, чтобы это позволяло
  • Поскольку вы сказали, что используете Jenkins, в jenkins есть определенная настройка для развертывания в конце, чтобы гарантировать, что репо не находится в коррумпированном/промежуточном состоянии.

В "Действия после сборки"

Разверните артефакты в репозиторий Maven. По сравнению с стандартное развертывание mvn, эта функция позволяет вам развернуть артефакты после подтверждается, что вся сборка выполнена успешно.      Это предотвращает типичную проблему в Maven, где некоторые модули развертываются до того, как критический сбой обнаружен позже по дороге, что делает состояние репозитория непоследовательным.      Обратите внимание, что независимо от этой конфигурации вы всегда можете вручную вернуться к Jenkins и развернуть любой из прошлых артефактов, чтобы любой репозиторий по вашему выбору, после факта.      Чтобы использовать эту функцию, вы не должны деактивировать автоматическое архивирование артефактов.

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