无法使用参数变量触发 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)}