使用C#和Rest API将TFS版本部署到特定环境

时间:2018-11-29 18:24:41

标签: c# rest tfs

我正在尝试使用C#和TFS的REST API向特定环境发布版本。

我获得了用于执行请求的代码,但是我不知道如何组织补丁请求的参数。

public void LaunchRelease(string tfsServerIncludingCollection, string personalAccessToken, string projectName, int releaseId, int environmentId)
{

var releaseUrl = $"{tfsServerIncludingCollection}/{projectName}/_apis/release/releases/{releaseId}/environments/{environmentId}";

var base64Token = Convert.ToBase64String(Encoding.ASCII.GetBytes($":{personalAccessToken}"));

var patchDocument = new Object[1];
using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64Token);

    var patchValue = new StringContent(JsonConvert.SerializeObject(patchDocument), Encoding.UTF8, "application/json-patch+json");

    var method = new HttpMethod("PATCH");
    var request = new HttpRequestMessage(method, releaseUrl) { Content = patchValue };
    var response = client.SendAsync(request).Result;

    if (response.IsSuccessStatusCode)
    {
        var result = response.Content.ReadAsStringAsync().Result;

    }
}

}

我已经在互联网上看到它应该类似于(取自另一个示例):

patchDocument[0] = new { op = "replace", path = "/relations/attributes/comment", value = "Adding traceability to dependencies" };

但是我不知道如何将其与PATCH操作所需的参数结合起来。有想法吗?

更新:通过在浏览器上重放TFS请求,我看到用于内部请求的API是3.2-preview.4

然后进入邮递员,我可以成功创建请求。我导出了C#内容,并将其包含在VS中(它使用Restsharp)。而且有效。

var client = new RestClient("http://MYURL/tfs/MyCollection/MyProj/_apis/Release/releases/3329/environments/11719?api-version=3.2-preview.4");
var request = new RestRequest(Method.PATCH);
request.AddHeader("postman-token", "3f94c3a4-da61-9487-8aeb-7238b4355a77");
request.AddHeader("cache-control", "no-cache");
request.AddHeader("content-type", "application/json");
request.AddHeader("authorization", "Basic MyToken");
request.AddParameter("application/json", "{\"status\":2,\"scheduledDeploymentTime\":null,\"comment\":null}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);

尽管进行了相关更改,但仍然无法使原始代码正常工作。这是当前代码

public async Task<string> LaunchRelease(string tfsServerIncludingCollection, string personalAccessToken, string projectName, int releaseId, int environmentId)
{

    //Create the URI with the environment to deploy to:
    var releaseUrl = $"{tfsServerIncludingCollection}/{projectName}/_apis/release/releases/{releaseId}/environments/{environmentId}?api-version=3.2-preview.4";

    //Create the patch Document
    var patchDocument = new
    {
        status = 2, 
    };
    var json = JsonConvert.SerializeObject(patchDocument);
    var patchContent = new StringContent(json, Encoding.UTF8, "application/json-patch+json");

    using (var client = new HttpClient())
    {
        var base64Token = Convert.ToBase64String(Encoding.ASCII.GetBytes($":{personalAccessToken}"));
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64Token);

        var method = new HttpMethod("PATCH");
        var request = new HttpRequestMessage(method, releaseUrl) { Content = patchContent };
        var response = await client.SendAsync(request);
        if (response.IsSuccessStatusCode)
        {
            var result = await response.Content.ReadAsStringAsync();

            return result;
        }
        return null;
    }
}

我可以使用RestSharp,但我想知道为什么它在一种情况下有效,而在另一种情况下无效。

1 个答案:

答案 0 :(得分:1)

这里的假设是environmentId是要部署到的环境。

我在这里关注了这篇文章

引用VSTS/TFS REST API: The basics and working with builds and releases

使用PowerShell执行API请求。

我只是将其调整为您已经提供的代码。

public async Task LaunchRelease(string tfsServerIncludingCollection, string personalAccessToken, string projectName, int releaseId, int environmentId) {

    //Create the URI with the environment to deploy to:
    var releaseUrl = $"{tfsServerIncludingCollection}/{projectName}/_apis/release/releases/{releaseId}/environments/{environmentId}?api-version=3.2-preview.4";

    //Create the patch Document
    var patchDocument = new {
        status = 2
    };
    var json = JsonConvert.SerializeObject(patchDocument);
    var patchContent = new StringContent(json, Encoding.UTF8, "application/json");

    using (var client = new HttpClient()) {
        var base64Token = Convert.ToBase64String(Encoding.ASCII.GetBytes($":{personalAccessToken}"));
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64Token);

        var method = new HttpMethod("PATCH");
        var request = new HttpRequestMessage(method, releaseUrl) { Content = patchContent };
        var response = await client.SendAsync(request);
        if (response.IsSuccessStatusCode) {
            var result = await response.Content.ReadAsStringAsync();

            //...
        }else {
            var error = await response.Content.ReadAsStringAsync();

            //...
        }
    }
}

记下文章

  

如果在部署环境尚未批准之前获得了部署前的批准,则需要在此之前致电该PATCH请求。

我还检查了官方文档,以确认请求正文中的预期参数。

引用Releases - Update Release Environment