2012-05-11 70 views
6

我想從TFS獲取特定版本,但這非常困難。我有一個MVC應用程序觸發構建這樣的:如何使用TFS API獲取特定版本

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

var queuedBuild = buildServer.QueueBuild(def); 

QueueBuild返回IQueuedBuild和我希望做這樣的事情:

return queuedBuild.Build.BuildNumber 

所以我將有一些獨特的價值,我可以用於查詢構建服務器以獲取正確的構建。不幸的是,當執行退出這個方法時,Build可能會或者可能不會爲null,所以這是一個不行的方法。

後生成進行排隊,然後我查詢這種方法

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

此作品在一定程度上,但如果有多個建立在隊列中我沒有在此輪詢方法知道如果構建我的方式與我一起工作的是第一種方法排隊的人。有沒有人知道我能做些什麼來取回在第一種方法中排隊的特定構建?

謝謝!

回答

11

此場景的關鍵是使用排隊構建的ID。所以我所做的就是:

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

然後在輪詢方法

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

希望這可以幫助別人的道路。

2

如果構建排隊等待代理,你可以叫queueBuild.WaitForStart();

然後返回queryResult.Build.Uri;屬性,並使用與輪詢,版本號是未分配立竿見影。

然後,您可以使用方法IBuildDetail buildDetail = server.GetBuild(buildUri);來獲取構建狀態。

+0

如果我不知道Uri當我進入輪詢方法時,我會如何確定哪個構建是我正在尋找的? – dparsons

+1

而不是返回您的第一個方法中的內部版本號返回'Build.Uri' – DaveShaw

+0

這將無法正常工作。如果在開始構建之前還有另一個構建,則queuedBuild的Build屬性爲null。 – dparsons