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

を正しいビルドバックを得るためにビルドサーバに問い合わせるのに使います。残念なことに、ビルドは、実行がこのメソッドを終了するときに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 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; 
    } 

ホープその後

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

ビルドがエージェントを待ってキューイングされている場合は、queryResult.Build.Uri;プロパティを返すとしてポーリングすることを使用して、番号がすぐに割り当てられていない構築後queueBuild.WaitForStart();

を呼び出すことができます。

次に、IBuildDetail buildDetail = server.GetBuild(buildUri);メソッドを使用してビルドの状態を取得できます。

+0

私がポーリング方法に入るとき私がウリを知らないのであれば、私が探しているビルドがどのようになっているかわかりますか? – dparsons

+1

最初のメソッドでビルド番号を返すのではなく、 'Build.Uri'を返します。 – DaveShaw

+0

これは動作しません。 queuedBuildのBuildプロパティは、ビルドの前に別のビルドがある場合はnullです。 – dparsons