Friday, December 17, 2010

Build times for TFS Team Build

After creating an application to monitor builds over multiple Team Projects,  the customer came back with a second request. As they had the feeling that some builds took a long time to complete they asked us to update the application to include build timings.

A colleague took my application and extended it with some extra code. Full code below:

   1:  class Program
   2:  {
   3:     static void Main(string[] args)
   4:     {
   5:        // The url to the tfs server 
   6:        Uri tfsUri = new Uri("<TFS URL>");
   7:        TfsTeamProjectCollection tfs = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(tfsUri);
   8:        IBuildServer bs = tfs.GetService<IBuildServer>();
   9:        WriteQueuedBuilds(bs);
  10:        Console.ReadLine();
  11:     }
  12:   
  13:     private static void WriteQueuedBuilds(IBuildServer bs)
  14:     {
  15:        IQueuedBuildSpec qbSpec;
  16:        IQueuedBuildQueryResult qbResults;
  17:        qbSpec = bs.CreateBuildQueueSpec("*", "*");
  18:        qbSpec.CompletedWindow = TimeSpan.FromDays(25);
  19:        qbResults = bs.QueryQueuedBuilds(qbSpec);
  20:        
  21:        Console.WriteLine("Queued Builds");
  22:        Debug.WriteLine("Queued Builds");
  23:        
  24:        foreach (IQueuedBuild qb in qbResults.QueuedBuilds.OrderByDescending(a=> a.QueueTime))
  25:        {
  26:           string status = qb.Status.ToString();
  27:           string def; 
  28:           if (qb.BuildDefinition!= null)
  29:              def = qb.TeamProject + @"\" + qb.BuildDefinition.Name;
  30:           else if (qb.Build != null)
  31:              def = qb.TeamProject + @"\" + qb.Build.BuildDefinition.Name;
  32:           else
  33:              def = qb.TeamProject + @"\<unknown>";
  34:           
  35:           string pri = qb.Priority.ToString();
  36:           string datequeued = qb.QueueTime.ToString();
  37:           string requestedBy = qb.RequestedBy;
  38:           string buildDetails = string.Empty;
  39:           string finishTime = string.Empty;
  40:           string starttime = string.Empty;
  41:           if (qb.Build != null)
  42:          {
  43:              if (qb.Build.BuildFinished)
  44:              {
  45:                 buildDetails = "finished " + qb.Build.FinishTime.Subtract(qb.QueueTime).TotalMinutes + " minutes after queue";
  46:                 finishTime = qb.Build.FinishTime.ToString();
  47:              }
  48:              starttime = qb.Build.StartTime.ToString();
  49:           }
  50:           string controller = qb.BuildController.Name;
  51:   
  52:           if (qb.RequestedBy != qb.RequestedFor)
  53:           {
  54:              requestedBy = qb.RequestedBy + " (for " + qb.RequestedFor + ")";
  55:           }
  56:           
  57:           Console.WriteLine("{0} {1} {2} {3} {4} {5} {8}", controller, status, def, pri, datequeued, requestedBy, starttime, finishTime, buildDetails);
  58:           Debug.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}\t{5}\t{6}\t{7}\t{8}", controller, status, def, pri, datequeued, requestedBy, starttime, finishTime, buildDetails);
  59:        }
  60:     }
  61:  }
  62:   

No comments: