我正在尝试自动化部署过程,作为其中的一部分,我需要从命令行运行我的发布版本。我可以使用像
这样的命令来做到这一点 .\TFSBuild start http://server-name:8080/tfs/project-collection project-name build-name priority:High /queue
它甚至会为排队的构建返回一些代码 - Build queued. Queue position: 2, Queue ID: 11057
。
我不知道的是,如何从powershell命令行获取有关当前正在运行的版本的信息,或者关于
我已经获得了所有必要的powershell脚本,可以从构建结果创建部署包,压缩它,复制到生产并安装在那里。我现在所需要的 - 知道我的构建何时成功。
答案 0 :(得分: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)
}
您可以获取TFSBuild.exe返回的ID,然后调用该函数。
$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 :(得分:1)
使用E.Hofman提供的工作here,可以编写一个使用TFS SDK的C#控制台应用程序,并显示当前是否有任何构建代理正在运行,如下所示:
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
是在构建执行期间切换为'True'的原因。
对不起,我的powershell技能不足以提供上述的PS变体。请看一下here,bwerks的工作可以帮助你做到这一点。
答案 2 :(得分: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)"
}
}