Question

J'essaie de construire un rapport pour montrer l'efficacité relative de mes différents agents de construction et avoir du mal à obtenir les informations dont j'ai besoin de l'outil.

Ce que j'aimerais avoir, c'est une simple grille avec les colonnes suivantes:

  • Numéro de construction
  • Définition de construction
  • Agent de construction
  • Statut de construction
  • Construire l'heure de début
  • Durée de construction

Ce qui me permettrait de faire quelque chose comme le graphique de la durée des constructions réussies d'une définition de construction donnée sur Agent1 contre la même définition de construction sur agent2 via agentn.

Comment pourrais-je y aller?

Était-ce utile?

La solution

Mon intention initiale était de vous orienter vers TFS OLAP Cube & Décrire comment vous pouvez récupérer ce que vous recherchiez. Ensuite, j'ai réalisé que le cube ne fournit pas les informations sur lesquelles l'agent a construit la construction.

Ensuite, j'ai pensé qu'il serait simple d'écrire une petite application TFS-Console qui imprime les infos que vous après:

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

Cela ne compile pas, car
enter image description here

Finalement, j'ai plongé dans le IBuildInformationNode[] Et a obtenu l'agent de construction comme suit:

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

Le coup d'essai est nécessaire, vous pouvez donc gérer les builds qui ont échoué / arrêté avant la sélection de l'agent.

Si vous utilisez cette dernière partie comme substitut à l'échec Console.Write(buildDetail.BuildAgent.Name+"\t"); Vous devez vous retrouver avec une application de console, dont la sortie peut être tuée dans un fichier * .csv, puis importée dans Excel.

Autres conseils

Le code suivant devrait aider à obtenir le nom de l'agent de construction pour le détail de construction donné.

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

Assurez-vous que vous avez actualisé les informations de construction dans l'objet Détails de build.

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

J'espère que cela aide :)

Les informations de l'agent de construction ne sont pas toujours au même endroit.

Je l'ai trouvé pour une construction que je regardais dans BuildInformationNodes [1] .children.nodes [2] .Fields ["réservéagentName"]. Ce qui suit semble fonctionner pour moi (jusqu'à présent).

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top