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...
构建现在以编程方式排队。
答案 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"