gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:32:34 25 4
gpt4 key购买 nike

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

我想以编程方式执行此操作,要么使用 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

最佳答案

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

另一方面,您需要在将新软件安装到代理机器后重新启动构建代理才能识别它们。

关于c# - TFS 2015 API 使用 PowerShell 从池中删除代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41239341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com