Есть ли способ ускорить сборку в службах визуальной студии (и TFS)

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

Сборка будет стоять в очереди в течение нескольких минут, а затем занять несколько минут [даже при тестировании добавления пакетов Nuget к исходному контролю].

Есть ли способ ускорить сборку в Visual Studio Online? Если нет, то какие хорошие альтернативы?

Я вижу принятие или настройку нашего собственного сервера непрерывной интеграции на Azure VM как наихудший вариант резервного копирования.

Ответ 1

Серверы Hosted build имеют несколько недостатков. Во-первых, они всегда чистые изображения без каких-либо изменений, поэтому ваши источники, пакеты и ранее созданные двоичные файлы недоступны. Из-за этого единственный способ ускорить сборку - это:

  • Уменьшите количество проектов, которые вы создаете, повторно используя предыдущие результаты в виде пакетов NuGet. Это потребует от вас разбить решение на более мелкие биты и использовать функции управления пакетами в Visual Studio Team Services или сторонних сервисов, таких как MyGet.
  • Распараллеливайте свои сборки. Если вы создаете несколько проектов или несколько конфигураций, используйте возможность опции MultiConfiguration, чтобы развернуть несколько сборок для нескольких агентов (в этом случае вам необходимо выделить несколько размещенных агентов) введите описание изображения здесь
  • Включить BuildInParallel, чтобы разрешить MsBuild развернуть несколько экземпляров и включить MaxCpuCount=2 для использования нескольких ядер процессора, доступных для размещенных агентов. Похоже, они запускаются на экземпляре A3, который дает вам 4 ядра для игры. Если вы используете как BuildInParallel, так и MaxCpuCount, не превышайте количество ядер на MaxCpuCount.
  • Создайте все выходные данные в один каталог с помощью OutputPath.
  • Включить параллельное выполнение теста, используя флажок в задаче сборки.
  • Тщательно настраивайте свои сопоставления в рабочем пространстве. Папки с плащами, которые не нужны, отображают только то, что вам действительно нужно.
  • Пропустите все, что вам действительно не нужно для сборки CI. Вы можете отключить Code Analaysis и запустить полный комплект тестов только на ночной сборке, чтобы увеличить время обратной связи, даже если вы снижаете качество обратной связи.

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

Чтобы действительно ускориться, вам нужно настроить собственный сервер сборки. Использование виртуальной машины DS Azure, работающей на постоянном SSD, даст вам максимальную выгоду от производительности. С вашей собственной виртуальной машиной вы можете делать следующие дополнительные вещи:

  • Отключите очистку рабочего пространства. Это позволит получать инкрементные выборки исходного кода.
  • Отключите Clean Build. Это позволит MsBuild выполнять инкрементные сборки.
  • Установите несколько агентов на одном компьютере с достаточным объемом сборки нескольких процессоров на параллельной виртуальной машине.
  • Установите TFVC-прокси (используйте версию TFS 2013) в агенте сборки для локально хранимых файлов, если вы хотите построить с чистой рабочей областью, но получите преимущество в более быстром извлечении исходного кода для TFVC.
  • Если вы используете события Pre/Postbuild, убедитесь, что они задают свои входы и выходы, чтобы MsBuild выводил, можно ли пропустить цель для инкрементных построений.

Вместо размещения агента на Azure вы можете установить локальный агент сборки на рабочей станции разработчика или на существующем локальном сервере.

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