6

TFSから特定のビルドを取得しようとしていますが、イライラするほど困難です。次のようなビルドをトリガーするMVCアプリケーションがあります。

 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になる場合と、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;
 }

これはある程度機能しますが、キューに複数のビルドがある場合、このポーリングメソッドで、作業しているビルドが最初のメソッドでキューに入れられたビルドであるかどうかを知る方法がありません。最初の方法でキューに入れられた特定のビルドを取り戻すために私が何ができるかを誰かが知っていますか?

ありがとう!

4

2 に答える 2

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

これが将来の誰かに役立つことを願っています。

于 2012-05-14T13:09:40.537 に答える
2

ビルドがエージェントを待機してキューに入れられている場合は、queueBuild.WaitForStart();

次に、プロパティを返し、それqueryResult.Build.Uri;を使用してポーリングします。ビルド番号はすぐには割り当てられません。

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

于 2012-05-11T20:08:55.650 に答える