2010-11-03 31 views
1

Im en utilisant l'énumération Microsoft.TeamFoundation.Build.Client.BuildStatus pour chacun et il fonctionne très bien pour les statuts qu'il contient.Comment déterminer si une génération est mise en file d'attente mais non démarrée dans l'API TFS2010?

Mais existe-t-il une façon évidente de déterminer si une construction est mise en file d'attente, mais pas encore en cours? Je sais que l'explorateur de construction dans Visual Studio peut voir cela, j'ai des problèmes pour obtenir ces données par programme.

Dois-je vérifier quelque chose sur le projet teamproject au lieu de IBuildDetail lui-même? Tous les conseils appréciés.

Répondre

0

Vous devriez être en mesure de voir l'état de construction en tant que BuildStatus.NotStarted une fois que la construction atteint réellement la file d'attente. Cependant, il y a un temps avant qu'il n'atteigne la file d'attente qu'il n'a vraiment pas de statut.

Si vous soumettez votre build programme, vous pouvez le faire:

bool success = queue.WaitForBuildStart(pollingIntervalInMilliseconds, timeOutInMilliseconds); 

Tant que l'agent est à l'écoute, cela devrait effectivement revenir très rapidement. Si vous avez un réseau lent, cela pourrait prendre quelques secondes pour une prise de contact.

Une fois qu'il a passé le WaitForBuildStart, le statut est BuildStatus.NotStarted jusqu'à ce qu'il passe à InProgress et le reste de la ligne.

+0

Eh bien, il semble que le fait fond sur la definition n'obtient jamais l'état défini sur NotStarted, il s'agit uniquement de la version mise en file d'attente (IqueuedBuild) renvoyée par IBuildServer.QueueBuild qui a le statut correct. Il est intéressant de noter que les versions de la définition sont définies sur Inprogress une fois démarrées. Je suppose que c'est correct mais puisque le nouveau n'existe pas avant qu'il ne soit en cours – Erik

+0

Il semble aussi que WaitForBuildStart fasse ce qu'il dit, il attend que la compilation commence, donc je n'ai pas eu de chance d'utiliser ça non plus. – Erik

3

Malheureusement, il ne semble pas que les requêtes IBuildDetailSpec renvoient jamais des générations en file d'attente. Toutefois, vous pouvez utiliser l'interface IQueuedBuildSpec pour rechercher des générations en file d'attente.

Par exemple:

public IEnumerable<IQueuedBuild> getQueuedBuilds(TfsTeamProjectCollection tfsCollection, string teamProject) 
{ 
    // Get instance of build server service from TFS 
    IBuildServer buildServer = tfsCollection.GetService<IBuildServer>(); 

    // Set up query 
    IQueuedBuildSpec spec = buildServer.CreateBuildQueueSpec(teamProject); 
    spec.Status = QueueStatus.Queued; 

    // Execute query 
    IQueuedBuildQueryResult result = buildServer.QueryQueuedBuilds(spec); 

    // Array of queued builds will be in the result.QueuedBuilds property 
    return result.QueuedBuilds; 
} 
0

Case D'abord @ Greg Merci pour le code, vous me avez donné la solution que je cherchais. Deuxièmement, je voudrais suggérer d'utiliser le même fragment de code que le vôtre pour recevoir des notifications de TFS pour une version spécifique de Queued. Je l'ai déjà utilisé pour être averti que la construction que j'ai mise en file d'attente est terminée et qu'elle renvoie même les détails de l'exception en cas d'échec. Pour ce faire, vous devez vous connecter() à la construction mis en attente de retour à partir du code puis EVENEMENT, je voulais ajouter comme commentaire, mais ne pouvait pas longtemps texte

IQueuedBuild CurrentBuild = result.QueuedBuilds.First(); 
CurrentBuild.Connect(); 
CurrentBuild.PollingCompleted += CurrentBuild_PollingCompleted;