如何在项目之间移动TFS 2010构建定义?

时间:2011-02-21 16:59:11

标签: tfs tfs2010 team-build build-definition

我有一些在ProjectX下创建的TFS 2010构建定义。现在源代码已移至从属于ProjectY的文件夹。如何将构建定义移动到ProjectY,以便它们显示在ProjectY的Team Explorer的Builds节点下?

6 个答案:

答案 0 :(得分:12)

我认为没有开箱即可将构建定义从一个项目复制到另一个项目。但是,您应该能够使用TFS API执行此操作。您需要将构建过程模板(Pete所指的)移动到新项目的Build Process Template文件夹中。之后你会做类似的事情:

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行以查找特定模板。

答案 1 :(得分:6)

肖恩上面回答的PowerShell版本

# 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();                
}

答案 2 :(得分:5)

在VS2010中,TFS Power Tools可以将构建定义从一个项目移动到另一个项目,如此链接中的第二个答案所示:Is it possible to Export TFS 2010 Build Definitions?,如下所示。

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"

可以从以下网址下载适用于VS2010的TFS Power Tools:http://visualstudiogallery.msdn.microsoft.com/c255a1e4-04ba-4f68-8f4e-cd473d6b971f

答案 3 :(得分:4)

Uggly但非常有效的方式移动(不重复)只有一个或两个构建定义:

  • 打开SQL Server Management Studio,
  • 打开您的Collection DB
  • 编辑表tbl_BuildDefinition
  • 将当前GroupId替换为目标Team Project的GroupId

就是这样;)

要确定目标团队项目的GroupId,只需在tbl_BuildDefinition中找到该团队项目的任何BuildDefinition并获取其GroupId。

当然,您接下来要更新BuildDefinition的工作区,要构建的项目,......以使用新Team Project的服务器路径!

如果在更新BuildDefinition时遇到类似“GroupItem无法跨团队项目移动”的错误,则在更新数据库之前很可能已经打开了。关闭并重新打开它。

如果您不打算经常重复此操作,那么IMO是最快的解决方案。

答案 4 :(得分:1)

构建定义只是TFS中的另一个源控制文件,您应该能够在ProjectX中打开构建定义并将其作为新文件保存到projectY的构建定义文件夹中。

修改
在上面的帖子中我假设ProjectX和ProjectY是TFS项目,在这种情况下,他们的工作流构建定义只是在各自源代码控制根的builddfinitions文件夹中。

答案 5 :(得分:1)

Sean的回答帮助了我,但就我而言,我只有一个存储库用于构建模板和自定义活动程序集。所以我不需要编辑设置,我只想将一个构建定义从TFS项目A复制到TFS项目B. 这是Sean代码的“简短”版本:

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();
}