Отчет о продолжительности сборки TFS по агентам - PullRequest
3 голосов
/ 29 февраля 2012

Я пытаюсь создать отчет, чтобы показать относительную эффективность моих различных агентов сборки, и у меня возникают проблемы с получением необходимой мне информации из инструмента.

Мне бы хотелось иметь простую сетку со следующими столбцами:

  • Номер сборки
  • Определение сборки
  • Агент сборки
  • Статус сборки
  • Время начала сборки
  • Продолжительность сборки

Что позволило бы мне сделать что-то вроде графика продолжительности успешных сборок данного определения сборки на agent1 против того же определения сборки на agent2 через agentN.

Как бы я поступил об этом?

Ответы [ 3 ]

3 голосов
/ 29 февраля 2012

Моим первоначальным намерением было указать вам 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[] и получил агента построения следующим образом:

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.

2 голосов
/ 04 сентября 2013

Следующий код должен помочь в получении имени агента сборки для заданной детали сборки.

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

Надеюсь, это поможет:)

0 голосов
/ 03 сентября 2012

Информация об агенте сборки не всегда находится в одном и том же месте.

Я нашел ее для сборки, которую я просматривал, в 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;
}
...