Ответ
Пример: Оптимизация процесса сборки Java-проекта.
Что было сделано:
- Миграция с Maven на Gradle. Это позволило использовать:
- Инкрементальные сборки — пересборка только измененных модулей.
- Кеширование задач — Gradle не выполняет задачи, если их входные/выходные данные не изменились.
- Параллельное выполнение задач.
- Рефакторинг в multi-module проект для улучшения изоляции компонентов и управления зависимостями.
Результат: Время полной сборки сократилось на 30%.
Пример конфигурации Gradle для модуля:
plugins {
id 'java'
id 'jacoco'
}
dependencies {
implementation project(':core-module')
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.2'
}
tasks.named('test') {
useJUnitPlatform()
maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
reports {
junitXml.required = true
}
}
jacocoTestReport {
dependsOn test
reports {
xml.required = true
}
}
Дополнительно: Настроен CI/CD пайплайн в GitLab для параллельного запуска тестов, сборки отчетов о покрытии кода (JaCoCo) и публикации артефактов.
Ответ 18+ 🔞
А, вот это я понимаю — тема! Слушай, а то ведь бывает, проект как черепаха в сиропе, блядь, ползёт. Собираешь его, а он тебе чайник вскипятить успевает, пока jar'ник слепит. Так вот, тут один умник взял да подумал: «А не пошли бы вы все нахуй с этим Maven'ом?».
И пошла пизда по кочкам, внатуре.
Первым делом, нашли они этого Maven — старого, бородатого, на XML'ях подсевшего — и выперли его на мороз. Вместо него притащили Gradle. Ну, Gradle — он как хитрая жопа: умный, блядь. Сказали ему: «Слушай, дружок, нам тут пересобирать всё каждый раз — это пиздец как долго». А он такой: «Да не вопрос, ёпта».
И начал он инкрементальные сборки делать. То есть, если ты в одном модуле хуйню поправил, он не будет всю вселенную заново лепить. Только тот модуль, где ты накосячил, и те, кто от него зависит. Остальные — отдыхают, блядь. Кеширование задач включил — если задача уже делалась с такими же входными данными, он её просто из кеша достанет, как будто так и надо. И, самое главное, параллелить начал. Не как Maven — по очереди, один за другим, а сразу несколько задач в разные потоки запулил. Как мартышки на банановой плантации, только эффективные.
Потом ещё, блядь, рефакторинг проекта устроили. Был у них один жирный, монолитный кусок говна. Разбили его на multi-module — отдельно ядро, отдельно сервисы, отдельно утилиты. Теперь зависимости не как спагетти, а чётко видны, кто от кого сосёт. Изоляция, блядь, на уровне.
И что в итоге, спросишь ты? А в итоге — время полной сборки упало на 30%, ёбана! С чашки кофе до трёх глотков, понимаешь?
Вот, глянь, как примерно один из модулей теперь выглядит. Код не трогаю, он и так норм:
plugins {
id 'java'
id 'jacoco'
}
dependencies {
implementation project(':core-module')
testImplementation 'org.junit.jupiter:junit-jupiter:5.9.2'
}
tasks.named('test') {
useJUnitPlatform()
maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
reports {
junitXml.required = true
}
}
jacocoTestReport {
dependsOn test
reports {
xml.required = true
}
}
Видишь? Тесты теперь параллельно гоняют, используют половину ядер. Отчёты в JUnit XML пишут, чтобы CI потом разобрался. И JaCoCo сразу прикрутили, чтобы видеть, какой кусок кода покрыт тестами, а какой — просто так болтается, на удачу.
А дальше-то что? А дальше — CI/CD пайплайн в GitLab настроили. Этот пайплайн — он теперь как злой надсмотрщик: запускает все эти тесты параллельно, собирает отчёты о покрытии (этот самый JaCoCo), артефакты выкладывает куда надо. Всё автоматически, блядь. Человек только код залил — и пошла волна. Красота, ёпта!
Вот так из черепахи в сиропе сделали почти гепарда. Почти — потому что всегда есть куда стремиться, но 30% — это уже овердохуища хорошо.