通过PowerShell排队TFS构建

时间:2014-02-17 04:37:41

标签: powershell tfs build tfs2012

TFS2012,带有一个2010构建控制器和一个2010构建代理。还有一个2012构建控制器与多个2012构建代理。

我们为多个版本的软件提供多个版本。构建根据惯例命名,例如Foo_version_1_0和Foo_version_2_0。

当我在本地计算机上运行此代码时,所有构建都会排队。当我在2012构建代理上手动运行此代码时,构建会排队。当我在2010构建代理上手动运行此代码时,没有构建排队。当代码作为TFS中触发的构建的一部分执行时(在2010或2012控制器/代理上),它不会使用我的自定义异常排队任何构建和错误,说明没有从TFS返回定义。

我的问题:

$ buildServer.QueryBuildDefinitions()函数只是管理员函数吗?即如果非管理员用户帐户(如TFSService)运行它,它将无法从TFS API获取数据?

$ buildServer.QueryBuildDefinitions()是一个仅在2012年推出的新功能吗?

还有其他方法可以实现吗?以前,我们的所有构建名称都是硬编码的 - 这对我们来说不是一个可行的方法。

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

$serverName="http://tfs:8080/tfs"
$tfs = [Microsoft.TeamFoundation.Client.TeamFoundationServerFactory]::GetServer($serverName)
$buildserver = $tfs.GetService([Microsoft.TeamFoundation.Build.Client.IBuildServer])

$buildServer.QueryBuildDefinitions("FooProject") | foreach {
if ($_.EndsWith("version_1_0"))
{
echo "Queueing build: $_.Name"
$buildServer.QueueBuild($buildServer.GetBuildDefinition("FooProject",$_.Name))
        }
    }
}

修改:已移除$buildDefinitions = $buildServer.QueryBuildDefinitions("FooProject").Name,已将其替换为$buildServer.QueryBuildDefinitions("FooProject") | foreach...

构建现在以编程方式排队。

2 个答案:

答案 0 :(得分:1)

API没有改变,我想两个代理都使用相同的帐户。

该行

  

$ buildDefinitions = $ buildServer.QueryBuildDefinitions(“FooProject”)。姓名

似乎错误:Name属性get将引发空结果的异常。

答案 1 :(得分:0)

您还可以利用内置的API之一来防止下载dll二进制文件。

以下内容适用于

TFS 2017:

https://github.com/sameer-kumar/adhoc-posh/blob/master/QueueTfsBuild.ps1

$rootTfsUri = "http://myTFS:8080/tfs"
$collectionName = "Default"
$projectName = "Project1"
$tfsUri = $rootTfsUri + "/" + $collectionName + "/" + $projectName
$buildDefinition = "DevCI-vnext"
$buildDefinitionUri = "$tfsUri/_apis/build/definitions?api-version=3.1&name=$buildDefinition" 

# first get build definition id
$buildResponse = Invoke-WebRequest -Uri $buildDefinitionUri -UseDefaultCredentials -Method Get -Verbose -UseBasicParsing -ContentType "application/json" 
$buildResponseAsJson = $buildResponse.Content | convertfrom-json
$buildDefinitionId = $buildResponseAsJson.value.id

# Now queue this build definition
$requestContentString = @"
{
    "definition": {
        "id" : "$buildDefinitionId"
    }
}
"@

$buildUri = "$tfsUri/_apis/build/builds?api-version=3.1"
$buildResponse = Invoke-WebRequest -Uri $buildUri -UseDefaultCredentials -Method Post -Verbose -UseBasicParsing -ContentType "application/json" -Body $requestContentString
$buildNumber = ($buildResponse.Content | ConvertFrom-Json).buildNumber

TFS 2015

使用了一个略有不同的结构,其中uri定义被替换为

$buildDefinitionUri = "$tfsUri/_apis/Build/builds?api-version=2.0&name=$buildDefinition"