簡體   English   中英

通過PowerShell排隊建立TFS

[英]Queueing TFS builds via PowerShell

具有一個2010構建控制器和一個2010構建代理的TFS2012。 還具有一個帶有多個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... $buildServer.QueryBuildDefinitions("FooProject") | foreach...

現在,以編程方式對構建進行排隊。

API尚未更改,我想兩個代理都使用相同的帳戶。

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

似乎錯了:Name屬性的get將引發一個空結果的異常。

您還可以利用內置的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" 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM