2013-02-21 8 views
3

Мы пытаемся использовать Gradle для нашего очень большого и сложного корпоративного приложения. Мы используем многопроектную структуру сборки и очень рады возможности параллельного выполнения Gradle.Параллельный режим Debug Gradle

Наша кодовая структурирована в области слоев, как это:

модули интерфейса (~ 20) -> общий пользовательский интерфейс -> домен -> DAO -> рамки

Зависимости являются уни Направленный и сборка происходит снизу вверх ,

К сожалению, мы не видим большого увеличения времени нашей сборки. Это в значительной степени то же самое, что и мы с ant.

Рассматривая последовательность выполнения задач в параллельном режиме, несколько вещей выглядят не так. Наше ожидание - Gradle будет запускать задачи последовательно, когда они строят основные слои. Таким образом, после того, как он собирает фреймворк, dao, домен и общий ui, он должен пинать все остальное параллельно.

Но последовательность выполнения мы видим несколько, как это:

framework.assemble -> dao.assemble -> domain.assemble -> shared.ui.assemble -> Другие modules.assmble UI (параллельно) -> war -> Other UI.check + shared.ui.check + dao.check (параллельно) -> domain.check -> framework.check

Узкое место находится в конце, когда выполняется проверка домена и рамки последовательно, а не параллельно. Эти 2 модуля являются самыми большими модулями для нас с 12k модульными тестами, и они занимают около 4 минут для запуска.

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

Нам интересно, является ли это известной проблемой или есть способ включить дополнительную отладку в Gradle, чтобы получить больше информации о том, как Gradle определяет порядок выполнения в параллельном режиме. Любая помощь приветствуется.

ответ

3

Начиная с Gradle 1.4, выполнение параллельной задачи (намеренно) ограничено несколькими способами. В частности, набор выполняемых задач в любое время не будет содержать две задачи, относящиеся к одному и тому же проекту. Со временем это будет улучшено. Я не знаю никаких средств отладки, кроме того, что вы получаете из журналов (например, с помощью --debug).

Обратите внимание, что параллельное выполнение теста является отдельной функцией. Если у вас много тестов в одном проекте, test.maxParallelForks = x с x> 1 должен показать заметное ускорение. Значение для х наилучшим образом определяется экспериментально. Хорошей отправной точкой является количество физических ядер на машине (например, Runtime.getRuntime().availableProcessors()/2).

+0

** В частности, набор выполняемых задач в любое время не будет содержать две задачи, относящиеся к одному проекту. ** Это очень полезная информация. Итак, какова зернистость задач для проекта в параллельном режиме? Проверяется ли проверка задачи или теста или pmd? И как он отличается между корневым проектом и подпроектами? К сожалению, для нас ** maxParallelForks ** не работает вообще. Мы попытались установить его на минимальное полезное значение 2, а сборка не удалась повсюду. Он очень быстро ударяет «Слишком много открытых файлов в системной» ошибке на OSX. – abhi

+0

Гранулярность задачи всегда одна и та же. Все 'check',' test', 'pmd' являются задачами (на самом деле я думаю, что это' pmdMain'). Нет никакой разницы между корневым проектом и подпроектами.Разумеется, график расчёта учитывается при распараллеливании, но кроме того, принудительное выполнение двух задач из одного и того же проекта параллельно. Какую версию Gradle вы используете? Если вы столкнулись с проблемой с 'maxParallelForks', пожалуйста, сообщите на http://forums.gradle.org. Также попробуйте увеличить максимальное количество открытых файлов (должно быть легко на * nix). –

Смежные вопросы