Командная сборка теперь мучительно медленная

У нас возникают проблемы с производительностью при реализации Team Foundation Build Server, и у меня заканчиваются идеи о том, как ускорить процесс. Мы уже добавили несколько элементов PropertyGroup для повышения производительности на нескольких этапах (SkipClean, SkipLabel, SkipInitializeWorkspace), но я думаю, что нам нужно провести серьезную реструктуризацию, чтобы исправить ситуацию. Вот наша установка:

  • У нас есть около 40 веб-приложений, каждое из которых очень отличается, но запускает кучу общих сборок.
  • Каждое из этих веб-приложений имеет собственное решение;
  • Каждое из этих веб-приложений ссылается на от 10 до 25 общих сборок;
  • Существует определение сборки, содержащее все решения, которые запускаются при каждой регистрации в магистрали;

И вот основные проблемы, с которыми мы сталкиваемся

  • Во время сборки он будет собирать каждую общую сборку столько раз, сколько на нее ссылаются, а не создавать один раз и использовать для каждого приложения.
  • Время копирования файла очень медленное для каталога перетаскивания. Это должно быть через сетевой ресурс и не будет проходить по локальному пути.
  • При каждом таком количестве сборок один или несколько выходных файлов «блокируются» и вызывают сбой сборки, даже если компиляция прошла нормально.
  • И еще одно: я также пробовал отдельные определения сборки, но это также заставит получить другую рабочую область в Get Latest version. Я бы предпочел, чтобы сервер сборки содержал одну версию магистрали для сборки.

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

Я играю с идеей обучения и переключения на круиз-контроль для большего контроля, который у меня был бы. Кто-нибудь с этим не согласен?

Любая помощь приветствуется. Спасибо!


person Chad Gilbert    schedule 17.11.2008    source источник


Ответы (4)


Итак, вот что я сделал, и я сократил сборку до 9 минут. Для количества проектов, которые я компилирую, меня это устраивает.

  • Создал решение, которое содержит все общие библиотеки и все сети. На этом этапе было много дополнительной работы, потому что мне нужно было исправить кучу ссылок, которые были устаревшим кодом или иным образом хранились в нескольких местах.
  • Больше всего времени удалось сэкономить при выполнении перемещения файловой системы, а не копирования по сети для всех выходных файлов. Поскольку наше местоположение размещения фактически находится на сервере сборки, это имеет смысл.

Чтобы выполнить перемещение, я просто переопределяю цель CoreDropBuild в файле TFSBuild.proj:

<Target Name="CoreDropBuild"
        Condition=" '$(SkipDropBuild)'!='true' and '$(IsDesktopBuild)'!='true' "
        DependsOnTargets="$(CoreDropBuildDependsOn)" >
             <Exec Command="move $(BinariesRoot)\Release d:\BuildOutput\$(BuildNumber)\Release"/>    
</Target>
person Chad Gilbert    schedule 09.12.2008

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

Во-вторых, разделите общие сборки на отдельные командные проекты. После перемещения у вас есть несколько вариантов: вы можете разветвить исходный код или скомпилированные библиотеки DLL на те командные проекты, которые в них нуждаются. У них могут быть свои собственные модульные тесты, и вы можете расширить сборку команды, чтобы автоматически объединяться при успешном тесте, если вы к этому склонны.

Подводя итог, вам нужно упростить свою стратегию сборки.

person NotMe    schedule 21.11.2008

Вам действительно нужно создавать все в каждом веб-приложении? Если общие сборки не изменились, зачем создавать их снова и снова?

Вот мысль:

  1. Пусть у каждого веб-приложения будет своя папка \lib.
  2. Поместите каждую общую сборку в папку lib.
  3. Разрешите веб-приложению ссылаться только на общие сборки из своей локальной папки lib.
  4. Все проверить.

Теперь сборка не должна запускаться, если что-то не изменилось, и сборка не будет включать в себя общие сборки.

  • Должна быть центральная папка, содержащая все общие сборки.
  • Любое изменение здесь должно распространяться на все локальные папки \lib.
  • Наконец, любые общие сборки следует копировать в центральную папку всякий раз, когда они изменяются.

Идея здесь состоит в том, чтобы иметь общий проект сборки, чтобы знать только о центральной папке. Это упростит любые действия после сборки, необходимые для копирования сборки.

Центральная папка должна управляться таким образом, чтобы любые изменения копировались во все ссылающиеся веб-приложения.

person Thomas Eyde    schedule 23.11.2008

Говоря из личного опыта о предложении CruiseControl - помните, что это "каркас" непрерывной интеграции. Он не решит все ваши проблемы «из коробки» (компонентные сборки, срабатывание при каждом изменении компонента и сериализованные сборки, тем не менее, значительно улучшат ситуацию). Потребуется некоторая настройка (и, возможно, даже настройка), чтобы все получилось так, как вы хотите, поэтому будьте готовы потратить некоторое время. Конечно, вы получите огромную отдачу в долгосрочной перспективе, если время сборки сократится — если вы больше не можете игнорировать проблему, стоит потратить некоторое время на лучшее решение CI.

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

Кроме того, будьте готовы выделять хотя бы некоторые ресурсы на поддержание этой вещи. Это не работа на полный рабочий день (и я, например, люблю это делать, поскольку это приводит к постоянному совершенствованию процесса). Наши настройки привели нас от двухчасовой монолитной сборки нашего первого продукта к более чем 400 компонентам в 20 продуктах, которые строятся параллельно на нескольких машинах в течение примерно 20 минут, так что это того стоит.

person Chris    schedule 21.11.2008
comment
Можно ли с уверенностью сказать, что стандартное поведение Team Foundation Build немного недальновидно? При определении сборок в мастере вы можете выбрать, какие решения Visual Studio включить. Похоже, вы выступаете за отделение от этой нормы, верно? - person Chad Gilbert; 24.11.2008
comment
Я бы посоветовал не подчиняться какому-либо инструменту, особенно сборке. «Простая» готовая конфигурация отлично подходит для запуска проекта, но в долгосрочной перспективе она наверняка станет неуправляемой. Стоит приложить (постоянные) усилия, чтобы четко указать, что должна делать сборка. - person Chris; 25.11.2008