2011-12-02 42 views
2

我试图自动化部署过程,并作为其中的一部分,我需要从命令行运行我的发布版本。 Build queued. Queue position: 2, Queue ID: 11057 - 我可以像如何从命令行获取正在运行的TFS构建列表?

.\TFSBuild start http://server-name:8080/tfs/project-collection project-name build-name priority:High /queue

它甚至返回排队构建一些代码做到这一点,使用命令。

什么我不知道,是如何获得信息约当前正在运行的构建,或约我跑步的状态修建从PowerShell命令行最终目标是在构建完成后开始发布。

我已经得到了所有必要的PowerShell脚本来创建从构建结果部署包,拉链,复制到生产和安装在那里。我现在需要的 - 知道我的构建何时成功。

回答

5

此功能将等待与TFSBuild.exe给出的队列ID构建:

function Wait-QueuedBuild { 
    param(
     $QueueID 
    ) 

    [void][Reflection.Assembly]::LoadWithPartialName('Microsoft.TeamFoundation.Build.Client') 
    [void][Reflection.Assembly]::LoadWithPartialName('Microsoft.TeamFoundation.Client') 

    $uri = [URI]"http://server-name:8080/tfs/project-collection" 
    $projectCollection = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($uri) 
    $buildServer = $projectCollection.GetService([Microsoft.TeamFoundation.Build.Client.IBuildServer]) 
    $spec = $buildServer.CreateBuildQueueSpec('*','*') 

    do { 
     $build = $buildServer.QueryQueuedBuilds($spec).QueuedBuilds| where {$_.Id -eq $QueueID} 
     sleep 1 
    } while ($build) 
} 

你可以得到ID,由TFSBuild.exe返回,然后调用该函数。

$tfsBuild = .\TFSBuild start http://server-name:8080/tfs/project-collection project-name build-name priority:High /queue 
Wait-QueuedBuild [regex]::Match($tfsBuild[-1],'Queue ID: (?<id>\d+)').Groups['id'].Value 
1

利用可用here就可以编写使用TFS SDK并揭示如有构建代理当前正在运行如下一个C#控制台应用程序E.Hofman工作:

using System; 
using Microsoft.TeamFoundation.Build.Client; 
using Microsoft.TeamFoundation.Client; 

namespace ListAgentStatus 
{ 
    class Program 
    { 
     static void Main() 
     { 
      TfsTeamProjectCollection teamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("http://TFSServer:8080")); 
      var buildServer = teamProjectCollection.GetService<IBuildServer>(); 

      foreach (IBuildController controller in buildServer.QueryBuildControllers(true)) 
      { 
       foreach (IBuildAgent agent in controller.Agents) 
       { 
        Console.WriteLine(agent.Name+" is "+agent.IsReserved); 
       } 
      } 
     } 
    } 
} 

参数.IsReserved是在构建执行期间切换为“真”的原因。

我对不起我的PowerShell技巧不够好,与上述的PS变种提供。请看看here,那里的排气管工作可能会帮助你做到这一点。

1
# load classes for execution 
[Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Build.Client") | Out-Null 
[Reflection.Assembly]::LoadWithPartialName("Microsoft.TeamFoundation.Client") | Out-Null 

# declare working variables 
$Uri = New-Object System.Uri "http://example:8080/tfs" 

# get reference to projection collection 
$ProjectCollection = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($Uri) 

# get reference to build server 
$BuildServer = $ProjectCollection.GetService([Microsoft.TeamFoundation.Build.Client.IBuildServer]) 

# loop through the build servers 
foreach($Controller in $BuildServer.QueryBuildControllers($true)) 
{ 
    # loop through agents 
    foreach($BuildAgent in $Controller.Agents) 
    { 
     Write-Host "$($BuildAgent.Name) is $($BuildAgent.IsReserved)" 
    } 
}