0

更新

我将在这里提出一个功能提供者作为我帖子的更新。如果您需要更多详细信息,请告诉我。

我们目前在代理源代码中有一堆交付的能力提供者:

https://github.com/microsoft/azure-pipelines-agent/tree/master/src/Microsoft.VisualStudio.Services.Agent/Capabilities

  • 代理人
  • 环境
  • 尼克斯
  • 电源外壳

正在提议的是一个名为ExecutableCapabilitiesProvider.

这个新的 ExecutableCapabilitiesProvider 可能会有一个可以在代理机器上编辑的配置文件。该文件的格式可能是:

#name,executable
pip,pip3 freeze
xyz,/usr/bin/xyz-runner
abc,sh -C "ls -l /blah/blah"

作为自托管池的维护者,我将使用适合我的条目配置此文件,并让代理在启动时运行它。这样我就不会为我的能力硬编码任何值,而是在启动时确定这些值。

我会更进一步,添加一个新的 API 调用来添加比当前要求名称/值更灵活的功能。例如,将参数更改为Name, Provider, Params

efg, NixProvider, /path/to/file/efg
klm, ExecutableCapabilitiesProvider, /usr/bin/klm -a -b -c

原帖

我想让我的代理报告新功能,这些功能不是静态的,而是命令或类似的结果?我怎样才能做到这一点?我们的代理在 linux 机器上运行。具体来说,我想调用一个新功能pip-packages,其值是pip freeze在 shell 上执行的命令的结果。

4

1 回答 1

0

如果您的意思是添加用户定义的功能,那么您可以编写一个脚本来调用 REST API 来更新代理功能。

PUT https://dev.azure.com/{organization}/_apis/distributedtask/pools/{poolid}/agents/{agentid}/usercapabilities?api-version=5.0

Request body:
{"pip-packages": "xxxx"}

例如,您可以设置一个变量并运行命令pip freeze并将响应导出为该变量的值,然后通过调用 REST API 更新代理功能:

下面的 PowerShell 示例供您参考:

Param(
   [string]$collectionurl = "https://dev.azure.com/{organization}",
   [string]$poolid = "14",
   [string]$agentid = "16",
   [string]$user = "user",
   [string]$token = "PAT/Password"
)

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


# Run pip freeze command and get response as the value of the variable $pipfreeze  (Just for your reference here, you need to extract the value with running the commands)
$pipfreeze = "response of pip freeze" 

# Create json body with that value 
$baseUri = "$collectionurl/_apis/distributedtask/pools/$poolid/agents/$agentid/usercapabilities?api-version=5.0"

function CreateJsonBody
{
    $value = @"
    {"pip-packages":"$pipfreeze"}
"@
 return $value
}
$json = CreateJsonBody


# Update the Agent user capability
$agentcapability = Invoke-RestMethod -Uri $baseUri -Method Put -Body $json -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

write-host "==========================================================" 

Write-host "userCapabilities :" $agentcapability.userCapabilities.'pip-packages'

write-host "==========================================================" 
于 2019-10-16T08:07:29.070 回答