Как добавить агенту новую возможность динамического обнаружения?

Обновления

Я собираюсь предложить поставщика возможностей здесь в качестве обновления моего сообщения. Если вам нужна дополнительная информация, дайте мне знать.

В настоящее время у нас есть несколько поставляемых поставщиков возможностей в исходном коде агента:

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

  • Агент
  • Среда
  • Nix
  • PowerShell

Предлагается еще один поставщик, названный 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 выполнен на оболочке.

1 ответ

Если вы хотите добавить возможности, определяемые пользователем, вы можете написать сценарий для вызова 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 "==========================================================" 
Другие вопросы по тегам