Подтвердить что ты не робот

Структура управления исходным кодом Team Foundation Server

Я работаю над стандартизацией структуры управления версиями для нашего развертывания Team Foundation Server в течение нового года. Я начал с использования документации Microsoft Team Foundation Server Branching Guidance на CodePlex.

Я надеялся получить некоторые отзывы и ответы на некоторые из конкретных вопросов, которые у меня есть о предлагаемой структуре. Когда дело доходит до структурирования источника управления в TFS, я узнал, что существует так много "стандартов", чтобы выбрать из того, что на самом деле нет стандарта.

Во-первых, я опишу и опишу решения и использование.

$/                                                
    {Team Project}/                               
        {Subproject}/                             
            Development/                          
                Trunk/                            
                    Source/
                    Tests/
                    Sandcastle/
                    TeamBuildTypes/
                        {Build Name}/
                Branches/
                    {Branch Name}/
                        Source/
                        Tests/
                        Sandcastle/
                        TeamBuildTypes/
                            {Build Name}/

            Integration/
                Source/
                Tests/
                Sandcastle/
                TeamBuildTypes/
                    {Build Name}/
            Production/
                Releases/
                    {Release Version}/
                        Source/
                        Tests/
                        Sandcastle/
                        TeamBuildTypes/
                            {Build Name}/
                Branches/
                    {Branch Name}/
                        Source/
                        Tests/
                        Sandcastle/
                        TeamBuildTypes/
                           {Build Name}/

Общая логика заключается в том, что Team Project может содержать либо один логический проект (где не было бы записи {Subproject}), либо несколько связанных проектов в виде продукта или набора инструментов. Три основных контейнера называются Development, Integration и Production.

В контейнере контейнера Development существуют положения для обоих проектов, которые составляют продукт в папке Source, с соответствующими модульными тестами, доступными в папке Tests. Большая часть незначительного развития будет происходить в туловище, причем ветвление доступно через папку Trunk sibling Branches, которая действует как контейнер разветвления. Один или несколько файлов решений будут жить в пределах Trunk, позволяя ветвям на этом уровне отображать решения, исходные и модульные тесты.

Контейнер Integration, который часто называется "основным" в реализации, отличном от TFS, используется исключительно для интеграции наборов изменений из Development для создания стабильной и тестируемой сборки. Он первоначально создается как ветвь из контейнера Development, как только тестируемый продукт будет достигнут. Сборки из этого контейнера будут использоваться для нашей тестовой среды и среды тестирования нагрузки. Мы решили включить тестирование нагрузки с помощью тестируемых сборок, чтобы мы могли следить за изменениями в производительности, будучи в состоянии быстро изолировать группы изменений, которые могли внести вклад в любые нарушения.

Production используется для производства готовых и производственных качеств. Он первоначально создается как ветвь из контейнера Integration, как только стабильная сборка была рекомендована для выпуска. Внутри папки Releases выполняется структура "ветвь по версии", обеспечивающая моментальный снимок и изоляцию в одном месте. (Например, когда Release 1.1 готов к предварительной сборке, стабильный контейнер Integration разветвляется в новую папку Release 1.1 в структуре Production/Releases. Последующие RC файлы и RTW/RTM файлы продвигаются в эту папку, также). Также существует ветвящаяся структура, как показано в контейнере Branches. Это позволяет "исправления", как правило, маркер ревизии (Major.Minor.Revision). Филиал создается из текущей версии и объединяется обратно в новый маркер версии - например, Release 1.1.1. После принятия изменений блок изменений будет интегрирован обратно в контейнер Development Trunk.

Мы считаем, что эта структура является справедливым балансом между надежностью и сложностью. Но есть несколько вопиющих вопросов, которые я не могу логически вписаться в модель. Это:

Team Build. Контейнеры Development и Integration изначально начинаются как ночные сборки, в конечном итоге переходя к Continuous Integration (CI). Контейнер производства будет создан вручную.

  • Где должны существовать определения сборки? Изменить. Основываясь на нескольких ответах, папка TeamBuildTypes была перемещена в туловище и разветвлена ​​в соответствующие контейнеры. Это, однако, приводит к новому вопросу (следует).

  • Имея папку TeamBuildTypes в соответствующих контейнерах, означает ли это, что все определения сборки будут воспроизводиться между соответствующими папками? Например, определение сборки для построения качества разработки, а также тестируемые сборки и т.д., Все из которых находятся во всех папках TeamBuildType по всей структуре.

Генерация документации. Мы используем Sandcastle для создания документации. В частности, мы также используем Sandbule Help File Builder для управления выходом. Это создает файл проекта в формате, специфичном для SFHB.

  • Должна ли сгенерированная документация храниться в структуре управления источником?

  • Должна ли создаваться документация для каждого контейнера или она имеет только ценность для сборки для производства и производства?

  • Чтобы сохранить быстрые локальные времена сборки, должно ли создание документации быть владельцем определения сборки?

  • Где должны быть файлы, специфичные для SHFB? Моя первоначальная информация заключается в том, чтобы поместить ее как одноранговый узел в папки Source и Tests. Я согласен с рекомендациями, что это будет равным Source и Tests. Диаграмма изменилась, чтобы отразить это изменение.

Сторонние бинарные материалы

  • Должны ли храниться двоичные файлы (элементы управления, библиотеки и т.д.) в источнике управления?

  • Если это так, должен ли он быть собственным Team Project?

Общая документация. Не созданная документация, такая как требования, проектные документы, планы тестирования и т.д., не будет отображаться в папке в структуре управления источником. После некоторых исследований и обсуждения с моими разработчиками и сверстниками использование встроенной папки "Документы" в Team Explorer обеспечивает большую выгоду, поскольку она отражает структуру в Team Project Portal, а некоторым (бизнес-пользователям) не требуется дополнительная сложность обучения аспект контроля источника TFS.


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

редактирует:

  • Разъяснение. Source и Tests сохраняются в контейнере Integration.

  • Оба Мика и Джош подняли большие точки в отношении сторонних двоичных файлов. Вопрос добавлен в отношении проблемы.

  • Генерация документации может быть медленной. Добавлен вопрос о том, должно ли создание документации принадлежать определенному типу сборки Team.

  • Добавлено разрешение, связанное с не созданной документацией, например требованиями, проектной документацией, планами тестирования и т.д.

  • Добавлено решение, связанное с папкой TeamBuildTypes для исправлений сборки.

  • Основываясь на различных отзывах, переместили папку TeamBuildTypes в уровни соединительных линий/ветвей.

4b9b3361

Ответ 1

Мне нравится ваша идея помещать файлы Sandcastle как одноранговое средство для Source и Tests, я бы добавил папку документации, которая затем содержала бы файлы sandcastle и, возможно, фактическую документацию.

Существуют определенные различия в мнениях, и я уверен, что я буду занижен для этого (поскольку я был раньше). Я бы поставил сгенерированную документацию в TFS по двум причинам:

  • Желательно, чтобы ваша документация была выпущена с каждой версией, а использование TFS - это простой способ убедиться, что ваша документация остается в правильном месте.
  • Использование TFS для его хранения означает, что каждый будет знать, куда обратиться за документацией.

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

Изменить

Для моих двоичных файлов я обычно заканчиваю

$/ThirdParty/О компании/продукта/Версия/Src (опционально)

Так, например, у меня есть

$/ThirdParty/     Microsoft/       EntLib/          3,1          4,0     ComponentArt/       WebUI/          2008,1/            Src

Мне нравится добавить источник, мне пришлось исправить источник CA, который мне не нравится делать, но когда третья сторона не исправляет ошибку, к которой вы должны прибегнуть.

Ответ 2

Отличная компоновка и объяснение. Я боролся с такими же проблемами. Я оказался с очень похожей структурой. Мое немного меняется.

Development/
   Trunk/
      Binaries/  -- Shared libraries
      Source/
      Test/
      Docs/      -- Documentation
TeamBuildTypes/  -- Build definitions
  • Добавление папки двоичных файлов позволяет иметь одно местоположение в ветке, где все ваши проекты могут ссылаться на разделяемые библиотеки.
  • Мы помещаем документацию здесь, чтобы она могла путешествовать вместе с ней конкретной веткой.
  • Наши определения сборки находятся на уровне разработки, так как мы можем определить их в одном месте для всех ветвей, но это определенно может быть на уровне ветки, что может иметь больше смысла.

Должны ли двоичные файлы (элементы управления, библиотеки, и т.д.) сохраняются в контроле источника? Если да, то это должна быть собственная команда Проект?

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

Ответ 3

Вы должны поместить свою папку TeamBuilds под свой багажник. Это было невозможно в TFS2005, но Microsoft исправила его на 2008 год...

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

Таким образом, можно сказать, что вы выпускаете версию 1.0 и помещаете ее в папку "Релизы". Вы сможете создать его и выпустить исправления во время работы над версией v2.0 в своей соединительной линии разработки (которая может потребовать изменения сборки).

Ответ 4

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

Затем я организую их как Josh - и затем использую ветвление для "копирования" двоичных файлов в папку _ExternalReferences, которая является одноранговым узлом в папках .NET Project в дереве решений. Это очень эффективный способ на стороне сервера, поскольку контроль версии TFS хранит только "Deltas" - поэтому по существу каждое "дублирование" этих двоичных файлов во многих проектах по существу похоже на "указатель".

Ответ 5

Одна вещь, которую я бы рекомендовал, - не использовать местоположение по умолчанию для сборщиков команд и включать его в "веткистый" уровень, потому что, когда вы отправляетесь по разным причинам (например, продвижение кода), вы хотите, чтобы ваши скрипты сборки были разветвленными и синхронизируется с ним.

Также было опубликовано новое и более специфичное для сценариев руководство по адресу http://www.codeplex.com/TFSBranchingGuideII