У нас есть большая кодовая база, которая занимает около 12 минут на машинах разработчика, чтобы автоматически сгенерировать некоторые классы Java 5 с помощью JavaCC, а затем компилировать все классы, а также запустить модульный тест.
Проект состоит из нескольких проектов, которые можно строить в группах, но мы стремимся к полной сборке менее чем за 10 минут.
Какие есть советы по сокращению времени сборки?
Спасибо
Это часть нашего процесса. Мы стараемся поддерживать постоянную рабочую сборку совершенного кода. У нас есть сборка, которая постоянно создается, когда фиксируется новый код. Также большинство разработчиков у нас запускают полную сборку своего кода перед регистрацией. Те, кто не рискуют сломать сборку.
По моему опыту, у вас проблемы с политикой запуска полной сборки / тестирования перед каждой фиксацией. Это помешает разработчикам совершать более мелкие коммиты. Не говоря уже о раздражении, когда вы ждали 12 минут, а затем обнаружили, что за это время произошло больше коммитов.
«Это помешает разработчикам совершать мелкие коммиты». Хороший момент никогда не думал об этом с этой точки зрения "Не говоря уже о раздражении, когда вы ждали 12 минут, а затем обнаружили, что за это время произошло больше коммитов" Верно, это происходит, но не слишком часто




Одно быстрое исправление, которое может сэкономить некоторое время, - убедиться, что вы используете Ant с серверной JVM (по умолчанию он использует клиентскую виртуальную машину). Установите ANT_OPTS, чтобы включить "-сервер".
Ускоряет ли это время как на настольном компьютере, так и на сервере?
Да, это просто меняет способ оптимизации байт-кода JIT при запуске Ant.
В Windows с помощью этого переключателя я отключил 6-минутную сборку примерно на минуту.
Это может не иметь большого значения, но попробовать стоит, поскольку это тривиально.
«Получите лучшие машины». мы недавно все перевели на Linux, так как время сборки увеличилось с 40 до 12 минут.
«Попробуйте создавать независимые проекты параллельно на многоядерных машинах / машинах с ЦП». Большинство из них находится на двухъядерных машинах, и у нас есть процесс параллельной сборки, который немного быстрее, чем обычная сборка.
Это, вероятно, не поможет в ближайшем будущем, но я решил, что все равно должен выбросить это там.
Если ваш проект разбивается на более мелкие проекты (подсистема базы данных, ведение журнала, в качестве примеров), вам может быть интересно использовать что-то вроде maven для обработки сборки. Вы можете запускать каждый меньший фрагмент как отдельный проект или модуль, и maven сможет поддерживать то, что необходимо построить, если есть изменения. В этом случае сборка может сосредоточиться на основной части вашего проекта, и это займет не так много времени.
Какая разбивка по затраченному времени:
В зависимости от вашего проекта вы можете увидеть значительное увеличение времени сборки, выделив больший размер кучи для javac (memoryMaximumSize) и junit (maxmemory).
Попробуйте вдохновиться прагматичным программистом. Компилируйте только то, что необходимо, имейте два или более набора тестов. Один для быстрых тестов, другой для полных тестов. Подумайте, есть ли реальная необходимость использовать каждый раз каждый шаг сборки. Необходимо попробовать использовать компилятор jikes вместо javac. После того, как проект охватывает несколько сотен занятий, я перехожу на джайки, чтобы улучшить скорость. Но помните о потенциальных проблемах несовместимости. Не забудьте включить все в одну цель для выполнения каждого шага с полной перестройкой и полным тестированием проекта.
Теперь, когда вы объяснили этот процесс более подробно, есть еще два варианта:
Выделенный компьютер / кластер, на котором сборка выполняется намного быстрее, чем на обычной рабочей станции. Затем разработчики перед фиксацией запускали сценарий, который собирает их код на выделенной машине / кластере.
Измените разбиение на подпроекты, чтобы было сложнее разбить один проект, изменив другой. Это должно сделать менее важным выполнение полной сборки перед каждой фиксацией. Только коммиты, которые касаются чувствительных подпроектов, или те, которые охватывают несколько проектов, должны затем быть "проверены" посредством полной сборки.
Очень важно, чтобы сборка весь длилась менее 10 минут? Если вы сделаете подпроекты независимыми друг от друга, вы можете работать над одним подпроектом, уже скомпилировав другие (подумайте, что Maven или Ivy управляют зависимостями).
Другое решение (и если ваши модули достаточно стабильны) - рассматривать ваши подпроекты как отдельные проекты. Затем каждый проект будет следовать своему собственному циклу выпуска и будет доступен в локальном репозитории Maven / Ivy. Это, конечно, хорошо работает, если хотя бы части проекта достаточно стабильны.
несколько советов по сокращению времени сборки:
делай меньше работы. например удалить ненужное ведение журнала / эхо в файлы и приставка
сделайте вашу сборку "инкрементальной". Компилировать только измененные классы.
исключить дублирование усилий. Легче сказать, чем сделать, но если ты убежишь сборку в режиме отладки ("ant -debug") иногда можно увидеть повторяющиеся задачи или цели.
избегать дорогостоящих операций. копирование файлов и упаковка jar-файлов в войны необходимы для выпуска. Подписание jar-файлов стоит дорого и должно выполняться, по возможности, только для этапных выпусков, а не для каждой сборки.
Если я правильно понимаю, вы стремитесь к тому, чтобы чистая сборка (то есть с нуля) занимала менее 10 минут. Однако почему вам нужно так часто выполнять полную перестройку? Просто любопытно здесь.