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: else33: 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: