Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用TFSAPI获得特定的构建_C#_Asp.net Mvc 3_Tfs - Fatal编程技术网

C# 如何使用TFSAPI获得特定的构建

C# 如何使用TFSAPI获得特定的构建,c#,asp.net-mvc-3,tfs,C#,Asp.net Mvc 3,Tfs,我正试图从TFS获得一个特定的构建,但这是令人沮丧的困难。我有一个MVC应用程序,可以触发如下构建: IBuildServer buildServer = (IBuildServer)Server.GetService(typeof(IBuildServer)); IBuildDefinition def = buildServer.GetBuildDefinition(TeamProject, BuildDefinition); var queuedBuild = buildServe

我正试图从TFS获得一个特定的构建,但这是令人沮丧的困难。我有一个MVC应用程序,可以触发如下构建:

 IBuildServer buildServer = (IBuildServer)Server.GetService(typeof(IBuildServer));
 IBuildDefinition def = buildServer.GetBuildDefinition(TeamProject, BuildDefinition);

 var queuedBuild = buildServer.QueueBuild(def);
return queuedBuild.Build.BuildNumber
QueueBuild返回iQueueEdBuild,我希望这样做:

 IBuildServer buildServer = (IBuildServer)Server.GetService(typeof(IBuildServer));
 IBuildDefinition def = buildServer.GetBuildDefinition(TeamProject, BuildDefinition);

 var queuedBuild = buildServer.QueueBuild(def);
return queuedBuild.Build.BuildNumber
这样我就有了一些独特的值,可以用来查询构建服务器以获得正确的构建。不幸的是,当执行退出此方法时,构建可能为空,也可能不为空,所以这是不可能的

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

 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;
 }
这在某种程度上是可行的,但是如果队列中有多个构建,我无法在这个轮询方法中知道我正在使用的构建是否是我在第一个方法中排队的构建。有人知道我可以做些什么来恢复在第一个方法中排队的特定构建吗


谢谢

如果生成排队等待代理,则可以调用

然后返回
queryResult.Build.Uri属性并使用该属性进行轮询,生成编号不会立即分配


然后可以使用方法
ibuildDetailbuildDetail=server.GetBuild(buildUri)
获取生成的状态。

此场景的关键是使用排队生成的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;
    }

希望这对以后的人有所帮助。

如果我在输入轮询方法时不知道Uri,我如何确定哪个版本是我要查找的版本?不要在第一个方法中返回版本号,而是返回
build.Uri
,这样做行不通。如果在我启动的构建之前还有另一个构建,queuedBuild的Build属性将为null。我认为这会起作用,尽管(我假设)它将阻止当前线程。我当然可以分叉,但这使得这个过程比它需要的更复杂。我在下面添加了一个基于排队构建ID的解决方案。