API TFS 2015 удаляет агент из пула с powershell

Я временно работаю над удалением агента из пула, устанавливаю новое программное обеспечение на сервер сборки, на котором включен агент, проверяю его работоспособность, а затем снова добавляю агент в пул. Я хотел бы сделать это программно, либо с powershell, либо, если это невозможно, то сделайте это с помощью C#.

Проблема в том, что я не могу найти какую-либо документацию, которая могла бы помочь мне сделать это, либо через TFS rest api, либо через инструменты, поставляемые с Visual Studio.

Итак, что я конкретно спрашиваю: как удалить именованный агент из пула сборки и как добавить именованный агент обратно в пул сборки.

В принципе, мне нужна та же функциональность, что и переход к веб-администрированию TFS и снятие отметки / проверки агента в пуле.

Edit->

Когда я пытаюсь включить / отключить агент с информацией, предоставленной starain-msft, я получаю следующую ошибку: Invoke-RestMethod: 404 - Файл или каталог не найден. Ошибка сервера

Edit->

Устранена большая часть ошибки, так как я обнаружил, что проблема заключается в моем прокси-сервере. Прочитайте здесь: https://www.visualstudio.com/en-us/docs/integrate/get-started/rest/basics

Но я заставил его работать с помощью starain-msft.

Окончательное решение выглядит так:

Function TFSwebRequest{
param
(
    [ValidateNotNullOrEmpty()]
    [Parameter(Mandatory=$true)]
    [string] $Uri,

    [ValidateNotNullOrEmpty()]
    [Parameter(Mandatory=$true)]
    [string] $Method,

    [ValidateNotNullOrEmpty()]
    [string] $ContentType,

    [ValidateNotNullOrEmpty()]
    [string] $ContentBody,

    [ValidateNotNullOrEmpty()]
    [System.Net.WebHeaderCollection] $Headers
)

# Creating Webrequest from Uri
$webRequest = [System.Net.HttpWebRequest]::CreateHttp($Uri)

$webRequest.UseDefaultCredentials = $true
$webRequest.Method = $Method 
if($Headers.Count -ne 0){
    $webRequest.Headers = $Headers
}
if(![string]::IsNullOrEmpty($ContentType)){
    $webRequest.ContentType = $ContentType
}
if(![string]::IsNullOrEmpty($ContentBody)){
    $Body = [byte[]][char[]]$ContentBody
    $Stream = $webRequest.GetRequestStream();
    $Stream.Write($Body, 0, $Body.Length);
}

# Get webresponse to variable
try{
    [System.Net.WebResponse]$webResponse = $webRequest.GetResponse()
}
catch{
    $ErrorMessage = $_.Exception.Message
    Write-Host "TFSwebRequest Failed = " $ErrorMessage -ForegroundColor Red
}

# Stream webresponse to string
$webResponseStream = $webResponse.GetResponseStream()
$streamReader = New-Object System.IO.StreamReader $webResponseStream
$result = $streamReader.ReadToEnd() | ConvertFrom-Json

return ,$result

}
$agentUri = "http://teamfoundation:8080/tfs/Main/_apis/distributedtask/pools/$($poolID)/agents/$($agentID)?api-version=2.3-preview.1"
$contentBody = @"
{
"maxParallelism": 1,
"id": INSERTID,
"enabled": true #Or false
}
"@

$headers = New-Object System.Net.WebHeaderCollection
$headers.Add("X-HTTP-Method-Override", "PATCH")

TFSwebRequest -Uri $agentUri -Method "POST" -Headers $headers -ContentType "application/json" -ContentBody $contentBody

2 ответа

Решение

API остальных пула агентов и агента:

Получить пулы агентов (Метод запроса: Получить):

http://[TFS URL]/_apis/distributedtask/pools?api-version=2.3-preview.1

Получить агентов пула агентов (Метод запроса: Получить):

http://[TFS URL]/_apis/distributedtask/pools/[pool id]/agents?api-version=2.3-preview.1

Отключить / включить агент сборки (Метод запроса: PATCH)

http://[TFS URL]/_apis/distributedtask/pools/[pool id]/agents/[agent id]?api-version=2.3-preview.1

Тело (Content-Type: application/json)

{
    "enabled":false,
    "id":[agent id],
    "maxParallelism":1
}

Удалить агента из пула агентов (Метод запроса: Удалить):

http://[Tfs URL]/_apis/distributedtask/pools/[pool id]/agents/[agent id]?api-version=2.3-preview.1

Простой пример вызова REST API (PowerShell):

Param(
   [string]$vstsAccount = "<VSTS-ACCOUNT-NAME>",
   [string]$projectName = "<PROJECT-NAME>",
   [string]$buildNumber = "<BUILD-NUMBER>",
   [string]$keepForever = "true",
   [string]$user = "",
   [string]$token = "<PERSONAL-ACCESS-TOKEN>"
)

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

$uri = "https://$($vstsAccount).visualstudio.com/DefaultCollection/$($projectName)/_apis/build/builds?api-version=2.0&buildNumber=$($buildNumber)"
$result = Invoke-RestMethod -Uri $uri -Method Get -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}

Подробнее: вызов API-интерфейсов VSTS с помощью PowerShell

Код C# для вызова REST API:

String MyURI = "REST API URL";
            WebRequest WReq = WebRequest.Create(MyURI);
            WReq.Credentials =
                new NetworkCredential("[user name]", "[password]", "[domain]");

            WebResponse response = WReq.GetResponse();
            Console.WriteLine(((HttpWebResponse)response).StatusDescription);
            Stream dataStream = response.GetResponseStream();

            StreamReader reader = new StreamReader(dataStream);

            string responseFromServer = reader.ReadToEnd();

            Console.WriteLine(responseFromServer);

С другой стороны, вам нужно перезапустить агент сборки после установки нового программного обеспечения на машину агента, чтобы распознать их.

Нет такого API для создания или удаления агента из пула агентов. И не нужно писать свой собственный скрипт, когда вы загружаете агент, вам просто нужно запустить командную строку от имени администратора, а затем запустить ConfigureAgent.cmd на вашем компьютере агента сборки:

C:\Agent\ConfigureAgent.cmd

Затем ответьте на подсказки. Проверьте https://www.visualstudio.com/en-us/docs/build/admin/agents/v1-windows

Другие вопросы по тегам