2012-05-11 4 views
6

Ich versuche, einen bestimmten Build von TFS zu bekommen, aber es ist frustrierend schwierig. Ich habe eine MVC-Anwendung, die einen Build wie dies löst:Wie bekomme ich einen spezifischen Build mit der TFS-API

IBuildServer buildServer = (IBuildServer)Server.GetService(typeof(IBuildServer)); 
IBuildDefinition def = buildServer.GetBuildDefinition(TeamProject, BuildDefinition); 

var queuedBuild = buildServer.QueueBuild(def); 

QueueBuild kehrt IQueuedBuild und ich hatte gehofft, so etwas zu tun:

return queuedBuild.Build.BuildNumber 

So dass ich einige eindeutigen Wert haben würde, dass ich Verwenden Sie, um den Build-Server abzufragen, um den korrekten Build zurück zu bekommen. Leider kann Build nicht null sein, wenn die Ausführung diese Methode beendet, so dass es ein Nein ist.

Nachdem der Build in die Warteschlange gestellt ich dann diese Methode abfragen

public string GetBuildStatus(string TeamProject, string BuildDefinition, string BuildNumber) 
{ 
     string status = string.Empty; 
     IBuildDetailSpec buildDetailSpec = buildServer.CreateBuildDetailSpec(TeamProject, BuildDefinition); 
     buildDetailSpec.MaxBuildsPerDefinition = 1; 
     buildDetailSpec.Status = BuildStatus.InProgress | BuildStatus.None; 
     buildDetailSpec.QueryOrder = BuildQueryOrder.FinishTimeDescending; 

     IBuildQueryResult queryResult = buildServer.QueryBuilds(buildDetailSpec); 

     if (queryResult.Builds.Length > 0) 
     { 
      status = queryResult.Builds[0].Status.ToString(); 
     } 

     return status; 
} 

Dies zu einem gewissen Grad funktioniert, aber wenn es mehrere baut sich in der Warteschlange befinden, habe ich keine Möglichkeit in dieser Abfrageverfahren zu wissen, ob die Build ich bin Die Arbeit mit ist die, die ich in der ersten Methode in die Warteschlange gestellt habe. Hat jemand eine Idee, was ich tun könnte, um den spezifischen Build zurückzubekommen, der in der ersten Methode in die Warteschlange gestellt wurde?

Danke!

Antwort

11

Der Schlüssel zu diesem Szenario besteht darin, die ID des in Warteschlangen erstellten Builds zu verwenden. Also, was ich tat, war:

public int QueuBuild(string TeamProject, string BuildDefinition) 
    { 
     IBuildServer buildServer = (IBuildServer)Server.GetService(typeof(IBuildServer)); 
     IBuildDefinition def = buildServer.GetBuildDefinition(TeamProject, BuildDefinition); 

     var queuedBuild = buildServer.QueueBuild(def); 
     return queuedBuild.Id; 
    } 

dann in der Abfrageverfahren

public string GetBuildStatus(string TeamProject, string BuildDefinition, int BuildID) 
    { 
     IBuildServer buildServer = (IBuildServer)Server.GetService(typeof(IBuildServer)); 

     string status = string.Empty; 
     IQueuedBuildSpec qbSpec = buildServer.CreateBuildQueueSpec(TeamProject, BuildDefinition); 

     IQueuedBuildQueryResult qbResults = buildServer.QueryQueuedBuilds(qbSpec); 
     if(qbResults.QueuedBuilds.Length > 0) 
     { 
      IQueuedBuild build = qbResults.QueuedBuilds.Where(x => x.Id == BuildID).FirstOrDefault(); 
      status = build.Status.ToString(); 
     } 

     return status; 
    } 

hoffe, das hilft jemand die Straße hinunter.

2

Wenn ein Build für einen Agenten der Warteschlange wartet, können Sie queueBuild.WaitForStart();

Dann kehren die queryResult.Build.Uri; Eigenschaft nennen und dass mit abzufragen verwenden, Build-Nummer wird nicht sofort zugeordnet.

Sie können dann die Methode IBuildDetail buildDetail = server.GetBuild(buildUri); verwenden, um den Status des Builds abzurufen.

+0

Wenn ich den Uri nicht kenne, wenn ich an der Umfrage-Methode teilnehme, wie würde ich herausfinden, welcher Build der ist, nach dem ich suche? – dparsons

+1

Anstatt die Build-Nummer in Ihrer ersten Methode zurückzugeben, geben Sie 'Build.Uri' zurück – DaveShaw

+0

Das wird nicht funktionieren. Die Build-Eigenschaft von queuedBuild ist null, wenn vor dem Build, den ich gestarte, ein weiterer Build erstellt wird. – dparsons

Verwandte Themen