2012-02-28 2 views
3

다양한 빌드 에이전트의 상대적 효율성을 보여주고 도구에서 필요한 정보를 얻는 데 문제가있는 보고서를 작성하려고합니다. 내가 가지고 싶은 무엇상담원 별 TFS 구축 기간 보고서

는 다음과 같은 열이있는 간단한 그리드입니다 :

  • 빌드 번호
  • 빌드 정의
  • 에이전트
  • 빌드 상태
  • 빌드 시작 시간
  • 구축
  • 빌드 기간

agentN을 통해 agent2의 동일한 빌드 정의에 대해 주어진 빌드 정의가 성공적으로 빌드 된 기간을 agent1에 대한 차트와 같이 처리 할 수있게 해줍니다.

어떻게하면됩니까?

답변

3

내 처음 의도는 TFS OLAP Cube &으로 당신이 당신이 무엇을 얻었는지를 알려주는 것이 었습니다. 그런 다음 큐브가 Agent가 빌드 한 정보를 제공하지 않는다는 것을 알았습니다.
enter image description here

결국 나는에 뛰어 때문에,

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

이 컴파일되지 않습니다

은 그 때 나는 당신이 '는 정보를 정기적으로 인쇄 한 후 다시 작은 TFS-콘솔 응용 프로그램을 작성하는 간단한 것이라고 생각 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"); 

당신이 실패 빌드를 처리 할 수 ​​있도록 시도 - 캐치가 필요하다/에이전트 셀프하기 전에 중지 유혹.

이 후반 부분을 실패한 Console.Write(buildDetail.BuildAgent.Name+"\t");의 대체품으로 사용하는 경우 콘솔 앱으로 끝내야하며 그 출력은 * .CSV 파일 &으로 파이프 될 수 있으며 Excel로 가져올 수 있습니다.

+0

그리고 여기에 내가 간단하게 될거라고 생각하고있어! 당신의 노력에 감사드립니다. 나는 이것을 시도 할 것이다. –

+0

그게 효과가 있지만 데이터에서 주위를 파고 마술 색인을 변경 (2,2 나를 위해 일한) ReservedAgenName 키가 정의 된 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; 
    } 

하면 빌드 에이전트

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

에게 도착하기 전에 당신이 object.You이 빌드 세부 사항에 어느 쪽인지를 호출 다음 코드에 의해 수행 할 수 있습니다 빌드 세부 빌드 정보를 새로 고치가 객체 있는지 확인 희망이 도움 :