TFS 2015 API使用PowerShell从池中删除代理

问题描述 投票:2回答:2

我正在努力暂时从池中删除代理,在代理所在的构建服务器上安装新软件,测试它是否有效,然后再将代理添加到池中。

我想以编程方式执行此操作,无论是使用PowerShell还是不可能,都可以使用C#执行此操作。

问题是,我找不到任何可以帮助我这样做的文档,无论是通过TFS REST API还是通过Visual Studio附带的工具。

所以我特意问:

如何从构建池中删除命名代理,如何将命名代理添加回构建池?

我基本上想要进入TFS的Web管理和取消选中/检查池中的代理的相同功能。

当我尝试使用starain-msft提供的信息启用/禁用代理时,我收到以下错误:

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

后来我删除了大部分错误,因为我发现该问题存在于我公司的代理中。在这里阅读:Azure DevOps Services REST API Reference

但是我在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
c# rest powershell tfs2015 build-agent
2个回答
3
投票

代理池和代理的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)}

有关详细信息:Calling VSTS APIs with PowerShell

用于调用REST API的C#代码:

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
投票

没有此类API可以从代理池创建或删除代理。而且不需要编写自己的脚本。下载代理时,只需要以管理员身份运行命令提示符,然后在构建代理计算机上运行ConfigureAgent.cmd

C:\Agent\ConfigureAgent.cmd

然后回应提示。检查Deploy an agent on Windows for TFS 2015

© www.soinside.com 2019 - 2024. All rights reserved.