2010-05-26 133 views
21

有什么方法可以复制构建定义?我使用主线源控制方法,利用许多不同的分支来生活很短的时间(即几天到一周)。我真的很想复制一个构建模板,只需更改要构建的解决方案即可。有没有办法做到这一点?如何复制TFS 2010构建定义?

回答

12

你可以写一个加载项来做到这一点。下面是复制现有构建定义的代码:

static IBuildDefinition CloneBuildDefinition(IBuildDefinition buildDefinition) 
{ 
    var buildDefinitionClone = buildDefinition.BuildServer.CreateBuildDefinition(
     buildDefinition.TeamProject); 

    buildDefinitionClone.BuildController = buildDefinition.BuildController; 
    buildDefinitionClone.ContinuousIntegrationType = buildDefinition.ContinuousIntegrationType; 
    buildDefinitionClone.ContinuousIntegrationQuietPeriod = buildDefinition.ContinuousIntegrationQuietPeriod; 
    buildDefinitionClone.DefaultDropLocation = buildDefinition.DefaultDropLocation; 
    buildDefinitionClone.Description = buildDefinition.Description; 
    buildDefinitionClone.Enabled = buildDefinition.Enabled; 
    buildDefinitionClone.Name = String.Format("Copy of {0}", buildDefinition.Name); 
    buildDefinitionClone.Process = buildDefinition.Process; 
    buildDefinitionClone.ProcessParameters = buildDefinition.ProcessParameters; 

    foreach (var schedule in buildDefinition.Schedules) 
    { 
     var newSchedule = buildDefinitionClone.AddSchedule(); 
     newSchedule.DaysToBuild = schedule.DaysToBuild; 
     newSchedule.StartTime = schedule.StartTime; 
     newSchedule.TimeZone = schedule.TimeZone; 
    } 

    foreach (var mapping in buildDefinition.Workspace.Mappings) 
    { 
     buildDefinitionClone.Workspace.AddMapping(
      mapping.ServerItem, mapping.LocalItem, mapping.MappingType, mapping.Depth); 
    } 

    buildDefinitionClone.RetentionPolicyList.Clear(); 

    foreach (var policy in buildDefinition.RetentionPolicyList) 
    { 
     buildDefinitionClone.AddRetentionPolicy(
      policy.BuildReason, policy.BuildStatus, policy.NumberToKeep, policy.DeleteOptions); 
    } 

    return buildDefinitionClone; 
} 
+0

在linqpad,真棒得到了这个工作=) – Maslow 2014-02-11 20:07:07

0

从您的消息中不清楚哪个模板是您的构建定义使用(默认,升级或实验室管理)。如果我理解正确,您希望轻松设置一个构建定义,该构建定义构建了相同的解决方案,但来自不同的分支。

有一件事,你可以尝试,而不是复制定义是编辑它。当分支死亡时,重命名构建定义(可能有助于报告),更改构建的工作区映射,您应该完成。

谢谢,拉迪斯劳

1

我只是需要复制构建定义,并发现上面的Jim的回答会有帮助。然而,作为TFS API的新手,我需要帮助连接到服务器并通过代码获取现有的构建定义。这两个环节上帮助填补空白:

http://msdn.microsoft.com/en-us/library/bb286958.aspx

http://geekswithblogs.net/jakob/archive/2010/04/26/creating-a-build-definition-using-the-tfs-2010-api.aspx

+0

我结束了使用TFS电动工具2010年9月,其含有克隆构建定义命令。 – devlife 2010-11-03 22:47:11

1

您可以右键单击构建定义并选择“克隆构建定义”来复制定义文件。然后你可以从那里编辑它。

1

这里是soltion,如果你想生成定义从一个团队项目移到其他团队项目。

public void MoveBuild(string fromTeamProject, string toTeamProject, string buildName, string newBuildName) 
    { 

     var _server = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new 

     Uri("http://Mytfs:8080/defaultcollection")); 

     IBuildServer _buildServer = _server.GetService<IBuildServer>(); 

     var buildDetails = _buildServer.QueryBuildDefinitions(fromTeamProject); 

     foreach (var fromBuild in buildDetails) 
     { 
      if (fromBuild.Name != buildName) continue; 
      var newBuildDefinition = _buildServer.CreateBuildDefinition(toTeamProject); 
      newBuildDefinition.Name = !string.IsNullOrEmpty(newBuildName) ? newBuildName : fromBuild.Name; 

      newBuildDefinition.BuildController = fromBuild.BuildController; 

      // This finds the template to use 
      foreach (var mapping in fromBuild.Workspace.Mappings) 
      { 
       newBuildDefinition.Workspace.AddMapping(
        mapping.ServerItem, mapping.LocalItem, mapping.MappingType, mapping.Depth); 
      } 
      newBuildDefinition.DefaultDropLocation = fromBuild.DefaultDropLocation; 
      newBuildDefinition.Description = fromBuild.Description; 
      // buildDefinition.Workspace.AddMapping(build.Workspace.); 
      newBuildDefinition.Process = _buildServer.QueryProcessTemplates(fromBuild)[2]; 

      newBuildDefinition.ProcessParameters = fromBuild.ProcessParameters; 
      newBuildDefinition.Enabled = false; 
      newBuildDefinition.Save(); 
     }//end of for each loop 

    }