2016-12-20 9 views
2

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

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

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

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

Edit ->

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

Edit->

Убрана большая часть ошибок, как я выяснил, что проблема лежит в моих Компаниса прокси Читайте здесь: https://www.visualstudio.com/en-us/docs/integrate/get-started/rest/basics#http-method-override

Но я получил его на работу с помощью 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 
+0

Работает ли ваш агент сборки как служба или запускается в интерактивном режиме? –

+0

Я добавил код powershell и отключил/разрешил агент REST API REST для моего ответа, вы можете его проверить. –

+0

Вы решаете эту проблему с моим решением? –

ответ

3

Rest API пула агента и агента:

пулы Get агент (метод запроса: 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 

Отключить/включить агент построения (метод запроса: ЗАПЛАТА)

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

Body (Content-Type: применение/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)} 

Для деталей: Calling VSTS APIs with 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); 

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

+0

Все, кроме агента отключения/включения, отлично работает. Вызов исправления возвращает ошибку. Проверьте мой отредактированный вопрос – Setorica

+0

@Setorica Что такое адрес, тело и тип содержимого вашего запроса? Вы можете захватить фактический запрос через отслеживание сети инструмента разработчика, а затем сравнить с вашим запросом через PowerShell. (Https://msdn.microsoft.com/en-us/library/dn255004%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396). –

+0

Как использовать инструмент разработчика для захвата этого запроса? – Setorica

0

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

C:\Agent\ConfigureAgent.cmd 

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