无法使用参数变量触发 vNext 构建
Unable to trigger vNext build with parameter variable
我有下面的代码,如果我只指定构建定义 ID,它就可以工作。如果我指定参数,则会出现此错误。请指教。
触发 vNext 构建定义 614 失败! -- System.Net.WebException: 远程服务器返回错误:(400) 错误请求。
在 System.Net.HttpWebRequest.GetResponse()
在 TestConsoleApp.Program.TriggerVNextBuild(String WorkItemId, String BuildDefinitionId) 在 C:\TestConsoleApp\Program.cs:line 53
static private void TriggerVNextBuild(string WorkItemId, string BuildDefinitionId)
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://testtfs2017:8080/tfs/mycollection/myteamproject/_apis/build/builds?api-version=2.0");
request.Credentials = CredentialCache.DefaultNetworkCredentials;
request.Method = "Post";
request.ContentType = "application/json";
Stream stream = request.GetRequestStream();
//string json = "{\"definition\":{\"id\":" + BuildDefinitionId + "}}"; WORKING
//NOT WORKING
string json = "{\"definition\":{\" id\": " + BuildDefinitionId + "}" + "," +
"\"parameters\": {\" ReleaseWorkItemID\": " + WorkItemId + "}}";
byte[] buffer = Encoding.UTF8.GetBytes(json);
stream.Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Console.Write(response.StatusCode);
using (var streamReader = new StreamReader(response.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
}
}
catch (Exception e)
{
System.IO.File.WriteAllText(@"C:\TFSLogs\vNextAutomation.txt", "Trigger vNext Build Definition " + BuildDefinitionId + " is failed! -- " + e.ToString());
}
}
此致,
我们无法指定不可用或未定义的参数。
我测试过并且可以重现这个问题,这是 C# 中的 json 语法问题。
试试这个:
string json = "{\"definition\":{\"id\":" + BuildDefinitionId + "},\"parameters\":\"{\\"system.debug\\":\\"true\\"}\"}";
此外,您还可以使用PowerShell来触发指定参数的vNext build构建。
以下示例供您参考:
Param(
[string]$collectionurl = "http://server:8080/tfs/DefaultCollection/",
[string]$projectName = "ProjectName",
[string]$keepForever = "true",
[string]$BuildDefinitionId = "34",
[string]$user = "username",
[string]$token = "token"
)
# Base64-encodes the Personal Access Token (PAT) appropriately
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))
function CreateJsonBody
{
$value = @"
{
"definition": {
"id": $BuildDefinitionId
},
"parameters": "{\"system.debug\":\"true\",\"BuildConfiguration\":\"debug\",\"BuildPlatform\":\"x64\"}"
}
"@
return $value
}
$json = CreateJsonBody
$uri = "$($collectionurl)/$($projectName)/_apis/build/builds?api-version=2.0"
$result = Invoke-RestMethod -Uri $uri -Method Post -Body $json -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
我有下面的代码,如果我只指定构建定义 ID,它就可以工作。如果我指定参数,则会出现此错误。请指教。 触发 vNext 构建定义 614 失败! -- System.Net.WebException: 远程服务器返回错误:(400) 错误请求。 在 System.Net.HttpWebRequest.GetResponse() 在 TestConsoleApp.Program.TriggerVNextBuild(String WorkItemId, String BuildDefinitionId) 在 C:\TestConsoleApp\Program.cs:line 53
static private void TriggerVNextBuild(string WorkItemId, string BuildDefinitionId)
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://testtfs2017:8080/tfs/mycollection/myteamproject/_apis/build/builds?api-version=2.0");
request.Credentials = CredentialCache.DefaultNetworkCredentials;
request.Method = "Post";
request.ContentType = "application/json";
Stream stream = request.GetRequestStream();
//string json = "{\"definition\":{\"id\":" + BuildDefinitionId + "}}"; WORKING
//NOT WORKING
string json = "{\"definition\":{\" id\": " + BuildDefinitionId + "}" + "," +
"\"parameters\": {\" ReleaseWorkItemID\": " + WorkItemId + "}}";
byte[] buffer = Encoding.UTF8.GetBytes(json);
stream.Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Console.Write(response.StatusCode);
using (var streamReader = new StreamReader(response.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
}
}
catch (Exception e)
{
System.IO.File.WriteAllText(@"C:\TFSLogs\vNextAutomation.txt", "Trigger vNext Build Definition " + BuildDefinitionId + " is failed! -- " + e.ToString());
}
}
此致,
我们无法指定不可用或未定义的参数。
我测试过并且可以重现这个问题,这是 C# 中的 json 语法问题。
试试这个:
string json = "{\"definition\":{\"id\":" + BuildDefinitionId + "},\"parameters\":\"{\\"system.debug\\":\\"true\\"}\"}";
此外,您还可以使用PowerShell来触发指定参数的vNext build构建。
以下示例供您参考:
Param(
[string]$collectionurl = "http://server:8080/tfs/DefaultCollection/",
[string]$projectName = "ProjectName",
[string]$keepForever = "true",
[string]$BuildDefinitionId = "34",
[string]$user = "username",
[string]$token = "token"
)
# Base64-encodes the Personal Access Token (PAT) appropriately
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token)))
function CreateJsonBody
{
$value = @"
{
"definition": {
"id": $BuildDefinitionId
},
"parameters": "{\"system.debug\":\"true\",\"BuildConfiguration\":\"debug\",\"BuildPlatform\":\"x64\"}"
}
"@
return $value
}
$json = CreateJsonBody
$uri = "$($collectionurl)/$($projectName)/_apis/build/builds?api-version=2.0"
$result = Invoke-RestMethod -Uri $uri -Method Post -Body $json -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}