среда, 15 августа 2018 г.

Ускоряем сборку проекта с использованием maven и git

Всем привет, хочу предложить небольшой Proof of Concept, который должен ускорить сборку сложного, многомодульного мавен проекта.

Как мы обычно собираем проект? В любимом терминале вводим: mvn clean install
После этого maven компилирует весь проект и копирует созданные артифакты в локальный репозиторий. Все тривиально, но здесь есть ряд проблем. Это долго. Даже если убрать clean, запустятся тесты, после них произойдет упаковка в jar или какой другой тип артифакта, и наконец копирование полученного артифакта в $HOME/.m2/repository

Давайте подумаем над тем, как мы можем ускорить этот процесс. Может есть возможность выкинуть ненужные действия.
Как правило, изменения присутствуют не во всех модулях. Разумеется, можно собрать отдельно только те модули, которые нам нужны. Но это довольно утомительно. Нужно будет явно следить в каких модулях производились изменения и затем переключаться в требуемую директорию подмодуля либо прописывать явно названия этих подмодулей после флага -pl

Есть другое решение. Все мы, надеюсь, используем git, либо какую то другую scv. Так вот, почему бы при добавлении в репозиторий не добавлять информацию о номере последнего коммита. Это позволит отслежить версию артифакта в рамках одной и той же версии. Если ревизия совпадает. очевидно, нет смысла собирать еще раз подмодуль, т.к. в локальном репозитории присутствует уже актуальная версия.

Как же это реализовать? Для этого потребуется подключить несколько maven плагинов и немного попрограммировать на xml 😃
Первым делом, добавим плагин для работы с git:

Параметр git.dirty содержит true если присутствуют незакоммиченные изменения. В таких ситуациях мы не можем опираться на равенство номеров ревизий и сборка должна быть обязательной.

Далее добавим логику проверки номеров коммитов. Она будет реализована при помощи ant задач. Это "самая сложная" часть.

Как видим, логика очень проста. В локальный репозитории помимо самого артифакта записываем еще и файл. В его названии присутствует номер последнего коммита. Если локальных изменений нет и необходимые файлы присутствуют (сам артифакт и файл с номером коммита), то сборку пропускаем, иначе очищаем директорию и пересобираем проект.

Что касается последнего, в maven нет явной возможности отменить последующую сборку. Для того чтобы это сделать, придется в каждом плагине явно задать флаг отмены. Ничего сложного, но добавляется солидную xml простынку в результирующий pom.

Кому интересно, вот здесь, я выложил полную версию pom.xml. Надеюсь пост оказался полезным. Всем добра и побольше успешных сборок 🖖