【问题标题】:Create and start Azure devops release pipeline using C# and RestAPI使用 C# 和 Rest API 创建并启动 Azure devops 发布管道
【发布时间】:2020-07-23 16:46:51
【问题描述】:

我正在尝试发布一个使用 C# 和 Azure Devops Rest API 将数据库 dacpac 部署到另一个环境的版本。

我已使用以下代码执行请求,但无法启动管道

    var definitionId = 4;
                var testvalue = "Changed value";
                string url = @"https://vsrm.dev.azure.com/<Organisation>/<project>/_apis/release/releases?definitionId=4&api-version=5.1";
    string personalToken = "Test";
    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(    new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
         client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", personalToken);

var requestMessage = new HttpRequestMessage(HttpMethod.Post, " https://vsrm.dev.azure.com/<Organisation>/<project>/_apis/release/releases?api-version=5.1");
    
//requestMessage.Content = new StringContent("{\"definitionId\":" + definitionId + "};", Encoding.UTF8, //"application/json");
requestMessage.Content = new StringContent("{\"definitionId\":" + definitionId + ", \"variables\": { \"Test:\" { \"value\":" + testvalue +"}}};", Encoding.UTF8, "application/json");
HttpResponseMessage response = client.SendAsync(requestMessage).Result;  
    
if (response.IsSuccessStatusCode)
{
                    // Parse the response body.
}
}

尝试使用此代码并无法启动发布..

我在 powershell 中尝试了同样的方法,它可以工作。

$VSTSAccoutName="Organisation"   
$teamProjectName="Project"
$ReleaseDefId="4"
 
$ReleaseMetadata = '{"definitionId": ' + $ReleaseDefId + ',
                    "variables": {
                          "Test": {
                          "value": "changed value test"
                        }
                          }
                        }';
 
 
$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($personaltoken)"))
$header = @{authorization = "Basic $token"}
$Uri = 'https://vsrm.dev.azure.com/' + $VSTSAccoutName +'/'+ $teamProjectName + '/_apis/release/releases?api-version=5.0'
$ReleaseResponse = Invoke-RestMethod -Method Post -ContentType application/json -Uri $Uri -Body $ReleaseMetadata -Headers $header
Write-Host $ReleaseResponse 

我在上面的代码中遗漏了什么吗?您能否建议触发发布的正确方法?

【问题讨论】:

  • 您没有在 json 中为 testvalue 加上引号。您可能会考虑使用序列化程序而不是自己串接它。
  • 感谢@Crowcoder 我使用了序列化程序并将 api 版本更改为 5.0。这解决了问题。
  • @MBK。如果答案能给你一些帮助,你可以考虑accepting this answer。所以它可以帮助遇到同样问题的其他社区成员,我们可以存档这个帖子,谢谢。

标签: c# azure-devops azure-devops-rest-api rest


【解决方案1】:

同意 Crowcoder 。

使用相同的 C# 代码进行测试,我可以重现相同的问题。

要解决这个问题,需要修改参数定义。

例如:

var definitionId = "\"15\"";

var testvalue = "\"test123\" ";

这是示例代码,您可以参考:

namespace ConsoleApp12
{
    class Program
    {
        static void Main(string[] args)
        {

             var definitionId = "\"15\"";
            var testvalue = "\"test123\" ";
             string personalToken = "PAT";
            var base64Token = Convert.ToBase64String(Encoding.ASCII.GetBytes($":{personalToken}"));

            using (var client = new HttpClient())
             {
                 client.DefaultRequestHeaders.Accept.Clear();
                 client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
                 client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64Token);

                 var requestMessage = new HttpRequestMessage(HttpMethod.Post, "https://vsrm.dev.azure.com/organization/Project/_apis/release/releases?api-version=5.1");

                //requestMessage.Content = new StringContent("{\"definitionId\":" + definitionId + "};", Encoding.UTF8, //"application/json");
                //requestMessage.Content = new StringContent("{\"definitionId\":" + definitionId + "};", Encoding.UTF8, "application/json");
                requestMessage.Content = new StringContent("{\"definitionid\":" + definitionId + ", \"variables\": { \"test\" : { \"value\": " + testvalue + " }}}", Encoding.UTF8, "application/json");
                using (HttpResponseMessage response = client.SendAsync(requestMessage).Result)
                 {
                    response.EnsureSuccessStatusCode();
                 }
            }
        }
    }
}

在这种情况下,可以成功触发发布管道。

【讨论】:

  • 谢谢凯文。我更改了定义,还必须将 api 版本更改为 5.0。这解决了我的问题!
猜你喜欢
  • 2020-10-04
  • 2022-01-02
  • 2021-12-12
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2020-05-23
  • 1970-01-01
相关资源
最近更新 更多