我正在尝试查看是否可以在与另一个版本相同的VM上对构建进行排队。注意,我在vNext系统中。我知道可以配置有关代理队列的信息。但我希望得到更具体的一点。我不确定我的想法是否超出了构建最佳实践的范围,但无论如何我都想问。
考虑以下的构建A& amp; B:
有4个代理:服务器1上2个,服务器2上2个代理可以选择构建A或构建B ....我知道如何设置需求,因此只有这些VM上的代理可以选择这个版本。
Build A使用其余的API对构建B进行排队,并等待它完成。现在,在当前配置下,生成的构建B可以被剩下的3个代理中的任何一个接收(所以与构建A在同一台机器上的自由代理,或者在其他服务器上的任何代理)。
当构建A启动构建B时,我想尝试在与构建A相同的服务器上运行构建B.换句话说,如果服务器1上的代理程序选择构建A,我希望构建B启动它使用相同的服务器(使用机器上的其他代理)。相反,如果服务器2选择构建A,我希望它启动的构建B也被服务器2拾取。假设我知道代理ID,Agemt机器名等等,我想在c#中使用其余的API来模拟启动构建B以试图控制哪台机器选择它。
我可以配置代理,这样两个版本只能在一台机器上运行,但我试图避免在一台机器上运行太多的代理。我可以配置上述4个代理程序在1台机器上运行,但我想尽可能地分发代理程序。我知道可以指定代理队列/池等信息,而不是机器。我试图避免限制运行一组代理的机器数量。
我知道这看起来有点不寻常......但是我正在处理一个场景,我希望在构建之间共享信息,如果它们在同一台机器上运行则会被简化。如果构建B是单独启动的,那么机器选择它并不重要。如果这是不可能的,我会尝试其他方式在构建之间共享信息。
是否可以这样做?
答案 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
获取<)
如果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对构建进行排队,那么您可以参考下面的线程: