Сборка TFS-сервера сборка филиала?

У нас есть проект TFS 2008 с двумя ветвями («Main» и «NewFeature»). Каждый из них представляет собой полную независимую «копию» (вариант) исходного кода.

Изменяя сопоставления рабочей области, мы можем сопоставить любой вариант на наших локальных ПК и без проблем работали с обеими ветвями.

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

There is no working folder mapping for $/Main/Product.sln

т.е. когда он строится из ветки NewFeature, что-то все еще ищет в ветке Main, хотя нигде в исходном коде нет ссылок на эту ветвь. Кажется, кешируется какая-то ссылка на Main ?!

Я выполнил полностью чистую сборку (удалил папку сборки с сервера и запустил сборку с / p: ForceGet = true, чтобы убедиться, что сопоставление передано на сервер, и на сервере нет файлов, которые могут кэшировать привязки рабочей области), но это не помогает.

Какие-либо предложения?


person Jason Williams    schedule 02.12.2009    source источник


Ответы (6)


Подтвердите это:

  • $ (SolutionToBuild) использует относительный путь при ссылке на Product.sln
  • относительный путь между $ / NewFeature /.../ TFSBuild.proj и $ / NewFeature / Product.sln такой же, как и в основной ветви.

/ РЕДАКТИРОВАТЬ /

Однако обратите внимание: не важно, чтобы $ / Main и $ / Branches / Feature находились на одном уровне в древовидной иерархии. Не должен иметь значения и локальный путь на сервере сборки. * Важно только то, что находится под каждой веткой. Если содержимое внутренне согласовано, все ваши существующие сценарии сборки должны работать без изменений.

Конкретные примеры того, как мне нравится связывать все вместе, см. В моих прошлых ответах, например:

Мой способ - не единственный, но я могу засвидетельствовать, что он работает лучше, чем все другие варианты, с которыми я сталкивался за эти годы :)

* Откровенно говоря, попытка микроуправления Team Build может оказаться намного более болезненной, чем предлагаемая реструктуризация ваших сценариев MSBuild. Для надежности вы должны разместить свой tfsbuildservice.exe.config customizations где-то под контролем версий ... если у вас есть> 1 сервер сборки (или, возможно, в будущем), вам нужно подумать о стратегии развертывания изменений ... вам в конечном итоге понадобится мета-SCM-процесс для управления вашим SCM-процессом!

person Richard Berg    schedule 02.12.2009
comment
Спасибо, Ричард. Проблема в том, что у нас есть устаревшая сборка, которая выполняет копии, обфускацию, установщики, а затем копию в папку drop после сборки - поэтому (чтобы сэкономить много работы) я действительно надеялся сопоставить код NewFeature вместо основного кода . Я добавлю ниже ответ с моими выводами ... - person Jason Williams; 03.12.2009
comment
Приветствую, что нашел время добавить эту деталь, Ричард. Я хорошо прочитаю. Я просто хочу разобраться в лучших практиках TFS, прежде чем вносить массовые изменения, вместо того, чтобы прилагать большие усилия и затем обнаруживать, что это тоже не работает! - person Jason Williams; 04.12.2009
comment
Принятый ответ, поскольку другие ваши ответы точно описывают мою запланированную структуру ветвления, предполагая, что я, по крайней мере, лаю на правильное дерево :-) - person Jason Williams; 04.12.2009
comment
@ Ричард: Я только что попытался решить эту проблему и на этот раз решил ее чисто. Оказывается, вы правильно ответили, мне просто потребовалось время, чтобы понять, как его применить :-) Если вам интересно, я опубликовал новый ответ на этот вопрос с подробным описанием ситуации (на случай, если кто-то иначе столкнется с той же проблемой в будущем). - person Jason Williams; 26.03.2010
comment
Я знаю, что это старый, но у меня такая же проблема, когда я пытаюсь создать ветку, которую я загрузил со своего сервера TFS 2012. Хотя это ветка MyProject_v1_0_0_1, когда я ставлю в очередь сборку TFS, TFS жалуется и говорит: для $ / MyProject / Main / Project.sln нет сопоставления рабочих папок. Как мне $ (SolutionToBuild) использовать относительный путь при ссылке на Product.sln? Спасибо. - person Stack0verflow; 12.03.2014
comment
Кстати, MyProject_v1_0_0_1 отображается на c: \ dev \ MyProject_v1_0_0_1, а не на c: \ dev \ MyProject вообще. - person Stack0verflow; 12.03.2014

У меня также была эта проблема при запуске сборки из ветки в TFS 2010. TFS сообщала, что «Нет сопоставления рабочих папок для $ / Main / Product.sln». Решением оказалось отредактировать определение сборки следующим образом ( Я использую шаблон процесса сборки «Шаблон по умолчанию» - я не пробовал это с настраиваемым шаблоном):

  1. Перейдите в раздел / вкладку процесса определения сборки.
  2. Разверните 1. Обязательно и найдите Проекты для строительства. Убедитесь, что эта запись указывает на файл решения внутри создаваемой ветки.
  3. Разверните 2. Базовый и найдите Автоматические тесты. Укажите здесь правильный файл настроек теста в создаваемой ветке.
person user261190    schedule 26.10.2010
comment
Это мне помогло! Спасибо за спасение! - person niaher; 26.07.2012

Хорошо, результаты есть - я нашел обходной путь.

Из-за наших устаревших процессов сборки (сборка, копирование, обфускация, сборка пользовательских установщиков, копирование в папку для перетаскивания) я не могу легко разместить ветку рядом с основной ветвью. Его необходимо заменить.

Итак, если у меня есть Main и NewFeature, я хочу отменить отображение Main и сопоставить NewFeature на его месте (т.е. использовать «c: \ Main» на сервере сборки и просто изменить исходный код, который там появляется)

Решение №1 (наиболее простое, очевидное и логичное) - использовать следующие сопоставления:

  • $ / NewFeature -> c: \ Main

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

Фактический результат: сбой с ошибкой «вы не сопоставили $ / Main, хотя и не используете его».

Решение №2 заключается в следующем:

  • $ / Main -> c: \ IgnoreThisFolder
  • $ / NewFeature -> c: \ Main

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

Решение №3 (непроверенное, слишком дорогое, чтобы пробовать, если я не знаю, что оно будет работать намного лучше, чем №2):

  • Переместите весь исходный код (из $ / Main, $ / Branches / Feature) в $ / Branches / Main и $ / Branches / Feature, чтобы получить согласованную глубину иерархии, и перепишите сценарий MSBuild для работы с этими новыми путями.
  • Надеюсь, что тогда я смогу отобразить только нужную мне ветку и отредактировать TFSBuild.proj, чтобы перенаправить его для сборки в этой ветке.

    (Edit: Да, это работает хорошо. Теперь мы реорганизовали всю структуру нашего кода, так что все (все ветки) находятся под общим корнем в одном командном проекте, и создание ветвлений / построение больше не проблема - это просто делать все, что нам нужно сейчас. Хитрость заключается в том, чтобы вставить корневую папку в иерархию, чтобы вы могли ветвиться на любом уровне, который вам нравится. Я добавил небольшую настройку в сценарий сборки, чтобы мы могли передать ветку для сборки как параметр MSBuild, так что теперь легко создать любой вариант. Любые ветки, над которыми мы не хотим работать, можно просто замаскировать, а сервер сборки останется довольным.)

Резюме Все эти решения (если использовать технический термин) - отстой. Вам необходимо переназначить рабочую область (в данном случае это непросто: требуется 9 записей сопоставления, поэтому это может быть утомительно и чревато ошибками), отредактировать TFSBuild.proj, удалить весь исходный код и запустить сборку с / p: ForceGet = true для переключения сборки между ветвями. Таким образом, переключение веток занимает около часа. Невероятно - это займет самое большее несколько минут!

Я понимаю, что наш проект далек от идеальной настройки, но не могу поверить, что в TFS должно быть такое сложное ветвление (это было несложно в SourceSafe, Accurev и Perforce, так почему же так мучительно в TFS?).

Как все остальные организуют свои ветки TFS? Как вы переключаете разработчиков между ветвями? Как вы переключаете сборки серверов между ветвями? Неужели это должно быть так больно?

person Jason Williams    schedule 03.12.2009

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

  1. Настройки источника - укажите местоположение вашего нового проекта.
  2. Процесс - (Иногда загрузка занимает некоторое время, так что наберитесь терпения) В разделе «Требуется» измените расположение «элементы для создания» на новое решение.

Надеюсь это поможет.

person Ankit    schedule 13.01.2014

Новое обновление:

Как сообщалось в другом ответе, я нашел обходной путь, который подходил для краткосрочной функциональной ветки, но на самом деле он работал не очень хорошо. С тех пор я вернулся к проблеме, и полное решение до смешного просто:

В TFSBuild.proj путь был основан на $ (BuildProjectFolderPath). Этот путь разрешается в серверную (путь к системе управления версиями), например $ / Main, а не в локальный путь (D: \ ServerBuildFolder \ Main).

К сожалению, по историческим причинам наш исходный код разделен на несколько командных проектов, что означает, что одна «ветвь» фрагментирована на несколько разветвленных папок в Source Control (например, $ / Main / Code и $ / Libraries / Code. Вы не можете создавать ветка, содержащая $ / Main и $ / Libraries). Таким образом, мы должны собрать эти разрозненные фрагменты из системы управления версиями обратно в согласованную иерархию, используя сопоставления рабочих пространств.

Это означает, что Ричард попал в точку - относительный путь от файла TFSBuild.proj к файлу .sln был неверным, потому что MSBuild / TFS предполагает, что .sln находится в той же иерархии командного проекта и системы управления версиями (поэтому искал $ / Main / Libraries.sln вместо $ / Libraries / Libraries.sln).

Решение простое: я заменил $ (BuildProjectFolderPath) локальным путем (например, D: \ ServerBuildFolder \ Main) для файлов, чтобы относительная ссылка была разрешена в «локальном пространстве» (после применения сопоставлений), и MSBuild теперь работает нормально.

Мораль истории: 1) НИКОГДА не используйте более одного командного проекта, если есть шанс, что вы когда-либо захотите иметь какую-либо ссылку между этими базами кода. Не дайте себя обмануть, думая, что новый командный проект предложит какое-то безболезненное логическое различие между приложениями / библиотеками. Дополнительные проекты оказались просто кошмаром для администрации - множество дополнительных проблем с абсолютно нулевой выгодой. (Это все одна большая общая куча под капотом, поэтому все рабочие элементы и папки управления версиями по-прежнему видны во всех проектах (!), Но добавляет несколько кирпичных стен, которые делают межпроектные ссылки очень проблематичными)

2) Всегда создавайте одну корневую папку в системе управления версиями командного проекта, а затем помещайте все остальное в эту папку. например Для проекта «$ / Main» создайте «$ / Main / Root», а затем поместите все из исходной иерархии в Root.

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

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

person Jason Williams    schedule 26.03.2010

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

person Mike Cheel    schedule 13.09.2012