Вопрос: Какое наилучшее решение для выполнения "развертывания 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 секунд.