2012-05-11 24 views
6

Estoy tratando de obtener una compilación particular de TFS pero es frustrantemente difícil. Tengo una aplicación MVC que provoca una acumulación de esta manera:Cómo obtener una compilación específica con la API de TFS

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

var queuedBuild = buildServer.QueueBuild(def); 

QueueBuild devuelve IQueuedBuild y yo tenía la esperanza de hacer algo como esto:

return queuedBuild.Build.BuildNumber 

Así que me gustaría tener algún valor único que pude utilizar para consultar el servidor de compilación con para recuperar la compilación correcta. Desafortunadamente Build puede o no ser nulo cuando la ejecución sale de este método, por lo que es un no ir.

Después de la construcción está en la cola entonces consultar este método

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

Esto funciona hasta cierto punto, pero si hay múltiples construye en la cola no tengo forma de saber en este método de votación si la acumulación soy trabajar con es el que hice cola en el primer método. ¿Alguien tiene alguna idea de lo que podría hacer para recuperar la construcción específica que está En cola en el primer método?

Gracias!

Respuesta

11

La clave para este escenario es usar el ID de la compilación en cola. Así que lo que hice fue:

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

Luego, en el método de sondeo

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

Espero que esto ayude a alguien por el camino.

2

Si la acumulación se pone en cola de espera para un agente, puede llamar a queueBuild.WaitForStart();

A continuación, devolver la propiedad queryResult.Build.Uri; y usarlo para sondear con, número de compilación no se asigna inmediatamente.

A continuación, puede utilizar el método IBuildDetail buildDetail = server.GetBuild(buildUri); para obtener el estado de la compilación.

+0

Si no conozco el Uri cuando ingrese al método de votación, ¿cómo sabré cuál es la que estoy buscando? – dparsons

+1

En lugar de devolver el número de compilación en su primer método, devuelva 'Build.Uri' – DaveShaw

+0

Eso no funcionará. La propiedad Build de queuedBuild es nula si hay otra compilación antes de la compilación que estoy iniciando. – dparsons

Cuestiones relacionadas