TFS rest API - 在同一台机器上构建队列

时间:2018-05-07 20:38:31

标签: tfs tfsbuild

我正在尝试查看是否可以在与另一个版本相同的VM上对构建进行排队。注意,我在vNext系统中。我知道可以配置有关代理队列的信息。但我希望得到更具体的一点。我不确定我的想法是否超出了构建最佳实践的范围,但无论如何我都想问。

考虑以下的构建A& amp; B:

  1. 有4个代理:服务器1上2个,服务器2上2个代理可以选择构建A或构建B ....我知道如何设置需求,因此只有这些VM上的代理可以选择这个版本。

  2. Build A使用其余的API对构建B进行排队,并等待它完成。现在,在当前配置下,生成的构建B可以被剩下的3个代理中的任何一个接收(所以与构建A在同一台机器上的自由代理,或者在其他服务器上的任何代理)。

  3. 当构建A启动构建B时,我想尝试在与构建A相同的服务器上运行构建B.换句话说,如果服务器1上的代理程序选择构建A,我希望构建B启动它使用相同的服务器(使用机器上的其他代理)。相反,如果服务器2选择构建A,我希望它启动的构建B也被服务器2拾取。假设我知道代理ID,Agemt机器名等等,我想在c#中使用其余的API来模拟启动构建B以试图控制哪台机器选择它。

  4. 我可以配置代理,这样两个版本只能在一台机器上运行,但我试图避免在一台机器上运行太多的代理。我可以配置上述4个代理程序在1台机器上运行,但我想尽可能地分发代理程序。我知道可以指定代理队列/池等信息,而不是机器。我试图避免限制运行一组代理的机器数量。

  5. 我知道这看起来有点不寻常......但是我正在处理一个场景,我希望在构建之间共享信息,如果它们在同一台机器上运行则会被简化。如果构建B是单独启动的,那么机器选择它并不重要。如果这是不可能的,我会尝试其他方式在构建之间共享信息。

    是否可以这样做?

1 个答案:

答案 0 :(得分:-1)

是的,您可以通过在对构建进行排队时使用REST API设置需求来实现这一目标。

例如,您可以使用以下PowerShell脚本使用特定代理对构建进行排队:

Param(
   [string]$collectionurl = "http://server:8080/tfs/DefaultCollection/",
   [string]$projectName = "ProjectName",
   [string]$keepForever = "true",
   [string]$BuildDefinitionId = "1",
   [string]$user = "username",
   [string]$token = "password"
)

# Base64-encodes the Personal Access Token (PAT) appropriately
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))

function CreateJsonBody
{

    $value = @"
  {
  "definition": {
    "id": $BuildDefinitionId
  },

  "sourceBranch": "$/xxxx",
  "demands":["Agent.Name -equals Agent1"]
 }           

}
"@

 return $value
}

$json = CreateJsonBody

$uri = "$($collectionurl)/$($projectName)/_apis/build/builds?api-version=2.0"
$result = Invoke-RestMethod -Uri $uri -Method Post -Body $json -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

在您的方案中:(假设Agent1是代理的名称,您可以从代理Capabilities获取<)

  • Server1:Agent1,Agent2
  • Server2:Agent3,Agent4

如果Build A排队了Agent1,那么你可以设置"demands":["Agent.Name -equals Agent2"]来排队Build B.

同样的事情,如果Build A与Agent3排队,那么你就可以设置"demands":["Agent.Name -equals Agent4"]来排队Build B.

您还可以创建一个简单的PowerShell脚本,并在定义A的构建步骤结束时添加PowerShell步骤,然后在构建A完成后运行PS脚本将构建B排队。

如果您想在C#中使用REST API对构建进行排队,那么您可以参考下面的线程:

Queue vNext build from c# using REST API (Tfs on premise)