2012-02-28 121 views
3

我試圖建立一個報告,顯示我的各種構建代理的相對效率,並且無法獲得我需要的工具信息。代理TFS的生成時間報告

我想什麼有一個簡單的網格有以下的列:

  • 版本號
  • 生成定義
  • 生成代理
  • 生成狀態
  • 生成開始時間
  • 建立時間

這會讓我做一些事情,比如通過agentN對agent2上的相同構建定義進行構建,從而繪製agent1上給定構建定義的成功構建持續時間。

我該怎麼辦?

回答

3

我最初的意圖是告訴你TFS OLAP Cube &描述你如何檢索你以後的樣子。然後我意識到該多維數據集沒有提供代理構建什麼Build的信息。

然後,我想這將是簡單的寫一個小TFS-控制檯應用程序打印你的相關信息後,再:

using System; 
using Microsoft.TeamFoundation.Build.Client; 
using Microsoft.TeamFoundation.Client; 

namespace BuildDetails 
{ 
    class Program 
    { 
     static void Main() 
     { 
      TfsTeamProjectCollection teamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("http://TFS:8080/tfs/CoLLeCtIoNNaMe")); 
      var buildService = (IBuildServer)teamProjectCollection.GetService(typeof(IBuildServer)); 

      IBuildDefinition buildDefinition = buildService.GetBuildDefinition("TeamProjectName", "BuildDefinitionName"); 
      IBuildDetail[] buildDetails = buildService.QueryBuilds(buildDefinition); 

      foreach (var buildDetail in buildDetails) 
      { 
       Console.Write(buildDetail.BuildNumber+"\t"); 
       Console.Write(buildDefinition.Name+"\t"); 
       Console.Write(buildDetail.BuildAgent.Name+"\t"); 
       Console.Write(buildDetail.Status+"\t"); 
       Console.Write(buildDetail.StartTime+"\t"); 
       Console.WriteLine((buildDetail.FinishTime - buildDetail.StartTime).Minutes);     
      }   
     } 
    } 
} 

這不會編譯,因爲
enter image description here

最後,我一頭扎進在IBuildInformationNode[],得到了生成代理如下:代理-SEL前

IBuildInformation buildInformation = buildDetail.Information; 
IBuildInformationNode[] buildInformationNodes = buildInformation.Nodes; 
string agentName; 
try 
{ 
    agentName = buildInformationNodes[0].Children.Nodes[3].Fields["ReservedAgentName"]; 
} 
catch 
{ 
    agentName = "Couldn't determine BuildAgent"; 
} 
Console.Write(agentName + "\t"); 

在try-catch是必要的,這樣你就可以應付建立失敗/停止撓度。

如果您使用這個後面的部分替代失敗的Console.Write(buildDetail.BuildAgent.Name+"\t");,您最終將得到一個控制檯應用程序,其輸出可以傳送到* .CSV文件&,然後導入到Excel。

+0

而這裏是我認爲它會變得簡單!感謝您的努力。我會試試這個。 – 2012-03-02 02:03:38

+0

這很有效,但我不得不在數據中挖掘並更改魔術索引(2,2爲我工作)以查找具有已定義的ReservedAgenName密鑰的buildInformationNodes。不是程序員,所以有一個人來幫助我。謝謝! – 2012-03-03 00:35:18

0

構建代理信息並不總是在同一個地方。

我發現它在buildInformationNodes [1] .Children.Nodes [2] .Fields [「ReservedAgentName」]中查看。以下似乎爲我工作(迄今)。

private static string GetAgentName(IBuildDetail buildDetail) 
{ 
    string agentName = "Unknown"; 
    bool fAgentFound = false; 

    try 
    { 
     foreach (IBuildInformationNode node in buildDetail.Information.Nodes) 
     { 
     foreach (IBuildInformationNode childNode in node.Children.Nodes) 
     { 
      if (childNode.Fields.ContainsKey("ReservedAgentName")) 
      { 
       agentName = childNode.Fields["ReservedAgentName"]; 
       break; 
      } 
     } 
     if (fAgentFound) break; 
     } 

    } 
    catch (Exception ex) 
    { 
     // change to your own routine as needed 
     DumpException(ex); 
    } 
    return agentName; 
} 
2

以下代碼應該有助於獲取給定構建細節的構建代理名稱。

private string GetBuildAgentName(IBuildDetail build) 
    { 
     var buildInformationNodes = build.Information.GetNodesByType("AgentScopeActivityTracking", true); 
     if (buildInformationNodes != null) 
     { 
      var node = buildInformationNodes.Find(s => s.Fields.ContainsKey(InformationFields.ReservedAgentName)); 
      return node != null ? node.Fields[InformationFields.ReservedAgentName] : string.Empty; 
     } 

     return string.Empty; 
    } 

得到生成代理

string[] refreshAllDetails = {"*"}; 
build.Refresh(refreshAllDetails, QueryOptions.Agents); 

之前,請確保您有刷新構建細節構建信息object.You可以通過兩種調用下面的代碼您的構建詳細這麼做對象希望它有幫助:)