2008-11-17 5 views
7

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

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

А вот основные проблемы мы сталкивающиеся

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

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

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

Любая помощь очень ценится. Благодаря!

ответ

2

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

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

Чтобы подвести итог, вам необходимо упростить стратегию сборки.

0

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

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

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

+0

Можно ли сказать, что поведение Team Foundation Build в готовом виде немного близоруко? При определении сборок в мастере вы получаете возможность выбрать, какие Visual Studio Solutions должны включать. Похоже, вы отстаиваете разделение от этой нормы, правильно? – 2008-11-24 13:28:29

1

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

Вот мысль:

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

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

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

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

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

3

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

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

Для выполнения перемещения я просто переопределяю цель CoreDropBuild внутри TFSBuild.proj file:

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