2011-12-02 32 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)" 
    } 
} 
相關問題