簡體   English   中英

如何使用TFS API獲取特定的構建

[英]How to get a specific build with the TFS API

我試圖從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;
 }

這在某種程度上有效,但如果隊列中有多個構建,我無法知道這個輪詢方法,如果我正在使用的構建是我在第一個方法中排隊的構建。 有沒有人知道我可以做些什么來取回在第一種方法中排隊的特定構建?

謝謝!

此方案的關鍵是使用排隊構建的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;
    }

希望這有助於有人在路上。

如果構建隊列等待代理,則可以調用queueBuild.WaitForStart();

然后返回queryResult.Build.Uri; 屬性和用於輪詢的內容,編號不會立即分配。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM