Как добавить новую динамически обнаруживаемую возможность для агента? - PullRequest
0 голосов
/ 16 октября 2019

Обновления

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

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

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

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

Предлагается один дополнительный поставщик с именем ExecutableCapabilitiesProvider.

Thisновый 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 Ответ

0 голосов
/ 16 октября 2019

Если вы хотите добавить пользовательские возможности, то вы можете написать скрипт для вызова API REST для обновления возможностей агента.

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 "==========================================================" 
...