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 可能为空,也可能不为空,所以这是不行的。

构建排队后,我然后轮询此方法

 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 回答