2010-05-26 201 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 

    }