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: