【问题标题】:How to Move TFS 2010 Build Definition between Projects?如何在项目之间移动 TFS 2010 构建定义?
【发布时间】:2011-07-01 10:17:41
【问题描述】:

我有一些在 ProjectX 下创建的 TFS 2010 构建定义。现在源代码已移至 ProjectY 下的文件夹。如何将构建定义移动到 ProjectY,以便它们显示在 ProjectY 的团队资源管理器的构建节点下?

【问题讨论】:

    标签: tfs tfsbuild build-definition


    【解决方案1】:

    我认为没有现成的东西可以将构建定义从一个项目复制到另一个项目。但是,您应该能够使用 TFS API 来做到这一点。您需要将 Pete 所指的构建过程模板移动到新项目的构建过程模板文件夹中。之后,您将执行以下操作:

    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】:

      上面 Sean 答案的 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();                
      }
      

      【讨论】:

        【解决方案3】:

        在 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 电动工具可以从以下位置下载:http://visualstudiogallery.msdn.microsoft.com/c255a1e4-04ba-4f68-8f4e-cd473d6b971f

        【讨论】:

          【解决方案4】:

          移动(不复制)一两个构建定义的丑陋但非常有效的方法:

          • 打开 SQL Server Management Studio,
          • 打开您的收藏数据库
          • 编辑表 tbl_BuildDefinition
          • 将当前 GroupId 替换为目标团队项目的 GroupId

          就是这样;)

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

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

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

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

          V.

          【讨论】:

          • 太棒了 - 它移动了构建定义,因此保留了所有构建历史等:)
          • 这对我有用。只需更新源代码管理文件夹和项目位置即可。
          【解决方案5】:

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

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

          【讨论】:

          • 在 VS 2010 中,情况似乎并非如此,或者 - 如果是 - 我不知道去哪里找。确实,一些旧的 TFS 2005 构建类型在 TFS 中徘徊;但是,在 ProjectX 文件夹或其子文件夹中找不到 2010 年构建的最新构建定义。
          • 啊,我认为 TFS 项目和 VisualStudio 项目之间有点混淆。在 TFS2010 中,构建定义是 $builddefinitions 文件夹中的工作流(这是来自内存;我在家里,这里没有 TFS),因此所有 VS 2010 项目的 TFS 构建服务器的所有构建定义都在这个 TFS 中项目文件夹。
          【解决方案6】:

          Sean 的回答帮助了我,但就我而言,我的构建模板和自定义活动程序集只有一个存储库。所以我不需要编辑设置,我只想将一个构建定义从 TFS 项目 A 复制到 TFS 项目 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();
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-09-15
            • 2011-02-23
            • 1970-01-01
            • 2011-03-22
            • 2011-04-12
            • 1970-01-01
            相关资源
            最近更新 更多