Как перенести определение сборки TFS 2010 между проектами?

У меня есть некоторые определения сборки TFS 2010, которые были созданы в ProjectX. Теперь исходный код переместился в папку, подчиненную ProjectY. Как перенести определения сборки в ProjectY, чтобы они отображались в разделе Builds node Team Explorer для ProjectY?

Ответ 1

Я не думаю, что есть что-то из коробки, чтобы скопировать определения сборки из одного проекта в другой. Однако вы должны это сделать, используя TFS API. Вам нужно будет переместить шаблоны процесса сборки, к которым относится Пит, в папку "Шаблон процесса сборки" для нового проекта. После этого вы сделаете что-то вроде:

var server = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("<server uri>"));

IBuildServer buildServer = server.GetService<IBuildServer>();
var buildDetails = buildServer.QueryBuildDefinitions("Project X");
foreach(var build in buildDetails)
{
        var buildDefinition = buildServer.CreateBuildDefinition("Project Y");
        buildDefinition.Name = "Copy of " + build.Name;
        buildDefinition.BuildController = build.BuildController;
        // This finds the template to use
        buildDefinition.Process = buildServer.QueryProcessTemplates("Project Y")[0]; 
        buildDefinition.ProcessParameters = build.ProcessParameters;
        buildDefinition.Save();                
}

Несколько замечаний. Вам нужно будет иметь дело с преобразованием сопоставлений рабочего пространства из одного проекта в другой. Вам также потребуется изменить строку buildDefinition.Process, чтобы найти конкретный шаблон.

Ответ 2

Вариант Шейна с командной оболочкой выше

# Copy some TFS build defintions from one project collection to another

[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Client")
[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.VersionControl.Client")
[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Build.Client")

$tfsUrl = "http://lontfs_at:8080/tfs/XXX"
$tfs = [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory]::GetServer($tfsUrl)
$vcs = $tfs.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])
$buildServer = $tfs.GetService([Microsoft.TeamFoundation.Build.Client.IBuildServer])

$buildDetails = $buildServer.QueryBuildDefinitions("Project X");
foreach( $build in $buildDetails)
{
        $buildDefinition = $buildServer.CreateBuildDefinition("Project Y");
        $buildDefinition.Name = "Copy of " + $build.Name;
        $buildDefinition.BuildController = $build.BuildController;
        # This finds the template to use
        $buildDefinition.Process = $buildServer.QueryProcessTemplates("Project Y")[0]; 
        $buildDefinition.ProcessParameters = $build.ProcessParameters;
        $buildDefinition.Save();                
}

Ответ 3

В VS2010 инструменты TFS Power Tools могут перемещать определение сборки из одного проекта в другой, как показано в 2-м ответе по этой ссылке: Возможно ли экспортировать определения сборки TFS 2010? и, как показано ниже.

c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>tfpt 
builddefinition /collection:"http://ServerX:8080/tfs/Collection X" /clone "Project 1\Build 
Definition X" "Project 2\Copy of Build Definition X"

Электроинструменты TFS для VS2010 можно загрузить с помощью http://visualstudiogallery.msdn.microsoft.com/c255a1e4-04ba-4f68-8f4e-cd473d6b971f

Ответ 4

Ужасно, но очень эффективный способ переместить (не дублировать) только один или два определения сборки:

  • Откройте SQL Server Management Studio,
  • Откройте свою коллекцию DB
  • Изменить таблицу tbl_BuildDefinition
  • Заменить текущий GroupId целевой Team Group GroupId

Что это;)

Чтобы определить GroupId целевого Team Project, просто найдите любое BuildDefinition этого Team Project в tbl_BuildDefinition и возьмите его GroupId.

Конечно, у вас есть рядом, чтобы обновить рабочее пространство BuildDefinition, Items to build,... использовать путь к серверу нового Team Project!

Если вы получаете сообщение об ошибке, например, "GroupItem не может перемещаться по Team Project" при обновлении BuildDefinition, скорее всего, он был открыт до обновления БД. Закройте и снова откройте его.

Если вы не собираетесь слишком часто повторять эту операцию, это IMO - самое быстрое решение.

V.

Ответ 5

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

Edit
В приведенной выше статье я предполагаю, что ProjectX и ProjectY являются проектами TFS, и в этом случае их определение (их) построения рабочего процесса просто находится в папке builddfinitions их соответствующих корней управления источником.

Ответ 6

Ответ Шона помог мне, но в моем случае у меня есть только один репозиторий для моих шаблонов сборки и сборки пользовательских действий. Поэтому мне не нужно редактировать настройки, я просто хочу скопировать одно определение сборки из проекта A TFS в проект TFS Project B. Вот моя "короткая" версия кода Шона:

var server = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("TFS URL"));
IBuildServer buildServer = server.GetService<IBuildServer>();
var buildDetails = buildServer.QueryBuildDefinitions("Proj_A");
foreach(var build in buildDetails)
{
    var buildDefinition = buildServer.CreateBuildDefinition("Proj_B");
    buildDefinition.CopyFrom(build);
    buildDefinition.Save();
}