Структура управления исходным кодом Team Foundation Server - PullRequest
47 голосов
/ 19 декабря 2008

Я работаю над стандартизацией структуры управления исходным кодом для нашего развертывания Team Foundation Server на новый год. Я начал с использования документации по ветвлению Microsoft Team Foundation Server , доступной в 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}/

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

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

Контейнер Integration, часто называемый «основным» в реализации не-TFS, используется исключительно для интеграции Changesets из 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 контейнера *1038* после принятия.

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

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

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

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

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

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

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

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

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

Сторонние двоичные файлы

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

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

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


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

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

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

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

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

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

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

  • На основании различных отзывов переместил папку TeamBuildTypes на уровни магистрали / ветви.

Ответы [ 5 ]

6 голосов
/ 19 декабря 2008

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

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

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

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

Редактировать

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

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

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

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

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

4 голосов
/ 19 декабря 2008

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

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

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

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

3 голосов
/ 28 декабря 2008

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

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

3 голосов
/ 27 декабря 2008

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

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

Таким образом, допустим, вы выпустили версию 1.0 и поместили ее в папку Releases. Вы сможете собрать его и выпускать исправления, работая над версией 2.0 в своей стволе разработки (для этого может потребоваться изменение сборки)

2 голосов
/ 24 декабря 2008

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

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

...