2012-02-28 9 views
3

私は様々なビルドエージェントの相対効率を表示し、ツールから必要な情報を得ることができないというレポートを作成しようとしています。私がしたいのですがどのようなエージェントによるTFS構築時間レポート

は、次の列を持つ単純なグリッドです:

  • ビルド番号
  • ビルド定義
  • エージェント
  • ビルド・ステータス
  • ビルド開始時間
  • を構築
  • ビルド時間

これは、エージェント1から与えられたビルド定義のビルドが成功した時間をagent2からagentNまでの同じビルド定義に対してグラフ化するようにします。

どうすればいいですか?

答えて

3

私は最初に、TFS OLAP Cube &にあなたの後ろのものを取り戻す方法を説明することを目的としていました。それから、キューブは、エージェントがビルドした情報を提供していないことに気付きました。

は、その後、私はあなたが「後に再に関する​​情報を印刷する小さな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[]と、次のようにビルドエージェントを得た:

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が必要なので、あなたが扱うことができますが/失敗したが、エージェント-SELの前に停止したことをビルドします。

この後者の部分を失敗したConsole.Write(buildDetail.BuildAgent.Name+"\t");の代わりに使用する場合は、出力を* .CSVファイル&にパイプしてExcelにインポートできるコンソールアプリケーションで終わらせる必要があります。

+0

そしてここに私はそれがシンプルになると思っていた!あなたの努力に感謝します。私はこれを試してみましょう。 –

+0

それはうまくいきましたが、私はデータ内を掘り下げて、ReserveAgenNameキーが定義されているbuildInformationNodesを見つけるために魔法のインデックスを変更しなければなりませんでした。プログラマーではないので、私を助けてくれます。ありがとう! –

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

あなたはobject.Youは、どちらかの詳細は、ビルド用薬

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

を取得する前に、オブジェクトビルドに以下のコードを呼び出すことによって、そうすることができるビルドの詳細をビルド情報を更新していることを確認します希望に役立ちます:)

関連する問題