Многомодульное развертывание 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 и развернуть любой из прошлых артефактов, чтобы любой репозиторий по вашему выбору, после факта. Чтобы использовать эту функцию, вы не должны деактивировать автоматическое архивирование артефактов.
Я никогда не использовал это, поэтому я не могу подтвердить, работает ли он, я просто знаю его там для этого конкретного случая использования