通过PowerShell排队TFS构建

问题描述 投票:1回答:2

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...替换它

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

powershell tfs build tfs2012
2个回答
1
投票

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

这条线

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

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


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" 
© www.soinside.com 2019 - 2024. All rights reserved.