- PVSM.RU - https://www.pvsm.ru -

Все началась, когда я поменял работу и сходу попал на большой проект. Большой для меня это несколько вендоров, десяток систем, 5-ти ступенчатый релизный цикл, 1000К+ инженеров в разных локациях. Исходники «жили» в нескольких svn репозиториях с большим количеством maven модулей, каждый из которых мог использоваться в одной или нескольких системах. Каждый модуль был подключен в основную систему через бинарную зависимость. В конце релизного цикла необходимо было выпустить новые версии модулей и собранных на их основе систем. Под катом я опишу проблему эффективности этого процесса, с которой я попытался побороться — и что из этого вышло.
Кстати, по поводу основной кухни версионирования модулей и выпуска релиза нашел очень подходящую статью [1], за что очень благодарен автору. Крайне рекомендую предварительно ознакомиться, так как это поможет понять проблему, которую я описываю, а я очень не люблю «копипастить», чего и вам не советую.
Пример, как все работало на нашем проекте:
pom.xml каждой из систем, как бинарные (смотрите ниже); <dependencies>
<dependency>
<groupId>B</groupId>
<artifactId>B</artifactId>
<version>1.1.0</version>
</dependency>
<dependencies> секцию корневого pom.xml своей системы ссылками на свеженькие версии выпущенных модулей;
Процесс полностью автоматизировать не получится, так как не хватает информации, какую версию зависимости нужно поставить в релизе системы. Ну, делаем что можем — на Python был написан скрипт, который выводил все зависимости, в которых были сделаны хоть какие-либо изменения за прошедший релизный период. Дальше этот список распределялся среди безответственных инженеров, которые «не сильно заняты в данный момент», каждый из которых для своей части:
Как и все ленивые программисты я стал пытаться оптимизировать это действо, которое отвлекало кучу народа на пол дня. Когда я понял, что человеческое участие здесь действительно необходимо и все что можно было улучшить это процессы коммуникации, я перестал думать над улучшением неавтоматизированной части и переключился на кусок, автоматизированный скриптом. Мне не нравилось, что:
<scm> тега, а держал ссылки каждого модуля на его SVN_URL в текстовом файле;Первая мысль была тогда – «Зачем писать кастомное, если все есть в maven?»
Постановка задачи: написать плагин под Maven, который покажет дерево зависимостей всех модулей с информацией о его текущей версии и логом последнего комита за определенный период.
Для начала я прошелся по существующей базе плагинов и посмотрел, что такого велосипеда и именно с перламутровыми пуговицами еще нет. Но из полезного, я узнал какими плагинами могу воспользоваться внутри своего. Про то, как разрабатывать плагин, уже писали на хабре, повторяться не буду, но из трудностей помню, что достаточно сильно мешало требование на нашем проекте использовать Maven версии 2.x и не выше. Приходилось искать плагины, которые работают под 2.x.
Как он работает:
<scm><connection> информацию для каждого проекта. Если в текущем pom.xml эта информация отсутствует, то смотрит родительский проект.Получилось довольно просто. Ссылка на исходники https://github.com/temas-hub/changed-maven-plugin [3] и там же — как им пользоваться. Буду рад, вопросам и замечаниям. Надеюсь, кто-то найдет эту статью полезной.
Автор: temas
Источник [4]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/maven/70294
Ссылки в тексте:
[1] статью: http://habrahabr.ru/post/130936/
[2] maven dependency plugin: http://maven.apache.org/plugins/maven-dependency-plugin/
[3] https://github.com/temas-hub/changed-maven-plugin: https://github.com/temas-hub/changed-maven-plugin/
[4] Источник: http://habrahabr.ru/post/238087/
Нажмите здесь для печати.