2012-05-11 40 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