2012-05-11 28 views
6

Tôi đang cố gắng xây dựng một công trình cụ thể từ TFS nhưng khó thực hiện được. Tôi có một ứng dụng MVC sẽ kích hoạt xây dựng như thế này:Cách nhận một bản dựng cụ thể với TFS API

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

var queuedBuild = buildServer.QueueBuild(def); 

QueueBuild trả IQueuedBuild và tôi đã hy vọng để làm một cái gì đó như thế này:

return queuedBuild.Build.BuildNumber 

Vì vậy, rằng tôi sẽ có một số giá trị duy nhất mà tôi có thể sử dụng để truy vấn máy chủ xây dựng để có được bản dựng chính xác trở lại. Thật không may Xây dựng có thể hoặc có thể không được null khi thực hiện thoát khỏi phương pháp này vì vậy đó là một không đi.

Sau khi xây dựng được xếp hàng sau đó tôi thăm dò ý kiến ​​phương pháp này

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

này hoạt động ở mức độ nào nhưng nếu có nhiều xây dựng trong hàng đợi tôi không có cách nào biết được trong phương pháp bỏ phiếu này nếu xây dựng Tôi làm việc với là thứ tôi xếp hàng trong phương thức đầu tiên. Có ai có bất kỳ ý tưởng những gì tôi có thể làm để lấy lại các xây dựng cụ thể đó là xếp hàng trong phương pháp đầu tiên?

Cảm ơn!

Trả lời

11

Chìa khóa cho kịch bản này là sử dụng ID của phiên bản được xếp hàng đợi. Vì vậy, những gì tôi đã làm là:

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

Sau đó, trong phương pháp bỏ phiếu

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

Hy vọng điều này sẽ giúp người xuống đường.

2

Nếu xây dựng được xếp hàng đợi chờ một đại lý, bạn có thể gọi queueBuild.WaitForStart();

Sau đó trả lại queryResult.Build.Uri; sở hữu và sử dụng để thăm dò ý kiến ​​với, xây dựng số không được phân định ngay lập tức.

Sau đó, bạn có thể sử dụng phương thức IBuildDetail buildDetail = server.GetBuild(buildUri); để nhận trạng thái của bản dựng.

+0

Nếu tôi không biết Uri khi tôi tham gia phương pháp bỏ phiếu, làm thế nào tôi có thể tìm ra công trình nào mà tôi đang tìm kiếm? – dparsons

+1

Thay vì trả lại số bản dựng trong phương thức đầu tiên, hãy trả về 'Build.Uri' – DaveShaw

+0

Điều đó sẽ không hoạt động. Thuộc tính Build của queuedBuild là null nếu có một build khác phía trước build mà tôi đang khởi động. – dparsons

Các vấn đề liên quan