2012-05-11 31 views
6

ile belirli bir yapı nasıl elde edilir TFS'den belirli bir yapı oluşturmaya çalışıyorum ama bu oldukça zor.TFS API'sı

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

var queuedBuild = buildServer.QueueBuild(def); 

QueueBuild IQueuedBuild döner ve ben böyle bir şey yapmak umuyordum: Elimden bazı farklı bir değere sahip olacağını Yani

return queuedBuild.Build.BuildNumber 

Böyle bir yapı tetikleyen bir MVC uygulaması vardır doğru yapıyı geri almak için yapı sunucusunu sorgulamak için kullanın. Ne yazık ki İnşa bu yöntemden çıkıldığında null olmayabilir ya da olmayabilir, bu yüzden bir yok.

inşa Sonra bu yöntemi

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

Bu bir dereceye kadar çalışır ancak birden varsa ben inşa eğer ben bu yoklama yönteminde bilmenin bir yolu var kuyrukta inşa anket sıraya sonra İlk yöntemde sıraya koydum. İlk yöntemde Sıraya Alınmış belirli yapıyı geri almak için neler yapabileceğimi bilen var mı?

Teşekkürler! Bir yapı bir ajan bekliyor sıraya alındı ​​edilirse

cevap

11

Bu senaryodaki anahtar, kuyruğa alınmış yapının kimliğini kullanmaktır. Yani ne yaptığını oldu: Bu birileri yol olur yoklama yöntemiyle

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

Umut içinde Sonra

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

.

2

, sayı hemen atanmamış inşa Sonra queueBuild.WaitForStart();

çağrı queryResult.Build.Uri; özelliğini dönmek ve ile yoklamak için kullanabilirsiniz.

Yapının durumunu öğrenmek için IBuildDetail buildDetail = server.GetBuild(buildUri); yöntemini kullanabilirsiniz.

+0

Yoklama yöntemine girdiğimde Uri'yi tanımıyorsam, hangi yapının aradığımı nasıl anlarım? – dparsons

+1

Yaptığınız ilk yöntemde yapı numarasını döndürmek yerine, 'Build.Uri' – DaveShaw

+0

döndürün. QueuedBuild'in Build özelliği, başlattığım yapıdan başka bir yapı olması durumunda boştur. – dparsons