API TFS 2015 удаляет агент из пула с помощью PowerShell

Я работаю над временным удалением агента из пула, устанавливаю новое программное обеспечение на сервер сборки, на котором находится агент, проверяю, работает ли он, а затем снова добавляю агент в пул.

Я хотел бы сделать это программно, либо с помощью PowerShell, либо, если это невозможно, сделать это с помощью С#.

Проблема в том, что я не могу найти никакой документации, которая могла бы помочь мне в этом, ни с помощью API REST TFS, ни с помощью инструментов, поставляемых с Visual Studio.

Поэтому я специально спрашиваю:

Как удалить именованный агент из пула сборки и как добавить именованный агент обратно в пул сборки?

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

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

Invoke-RestMethod :
404 - File or directory not found.
Server Error

Позже я устранил большую часть ошибки, так как обнаружил, что проблема связана с прокси моей компании. Читайте здесь: Справочник по API REST Azure DevOps Services

Но я заставил его работать с помощью 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 a variable
    try {
        [System.Net.WebResponse]$webResponse = $webRequest.GetResponse()
    }
    catch {
        $ErrorMessage = $_.Exception.Message
        Write-Host "TFSwebRequest Failed = " $ErrorMessage -ForegroundColor Red
    }

    # Stream webresponse to a 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

person Setorica    schedule 20.12.2016    source источник
comment
Ваш агент сборки работает как служба или работает в интерактивном режиме?   -  person Eddie Chen - MSFT    schedule 22.12.2016
comment
Я добавил в свой ответ код powershell и отключил/включил REST API агента сборки, вы можете это проверить.   -  person starian chen-MSFT    schedule 23.12.2016
comment
Вы решаете эту проблему с помощью моего решения?   -  person starian chen-MSFT    schedule 26.12.2016


Ответы (2)


REST API пула агентов и агента:

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

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

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

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
}

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

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)}

Подробнее: Вызов VSTS API с помощью PowerShell

Код С# для вызова 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);

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

person starian chen-MSFT    schedule 22.12.2016
comment
Все, кроме агента отключения/включения, работает отлично. Патч-вызов возвращает ошибку. Проверьте мой отредактированный вопрос - person Setorica; 09.01.2017
comment
@Setorica Каков подробный URL-адрес, тело и тип контента вашего запроса? Вы можете зафиксировать фактический запрос с помощью сетевого отслеживания инструментов разработчика, а затем сравнить его с вашим запросом через PowerShell. (msdn. microsoft.com/en-us/library/). - person starian chen-MSFT; 10.01.2017
comment
Как мне использовать инструмент разработчика для захвата этого запроса? - person Setorica; 16.01.2017
comment
@Setorica Вы можете обратиться к этой статье: msdn.microsoft.com/en-us/library/ - person starian chen-MSFT; 16.01.2017

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

C:\Agent\ConfigureAgent.cmd

Затем отвечайте на подсказки. Установите флажок Развернуть агент в Windows для TFS 2015.

person Cece Dong - MSFT    schedule 21.12.2016