Развертывание выпуска TFS в определенной среде с использованием C # и Rest API - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь запустить выпуск для конкретной среды, используя CEST и RFS API TFS.

Я получил код для выполнения запроса, но не могу понять, как организовать параметры длязапрос патча.

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

К тому времени, войдя в Postman, я смог успешносоздать запрос.Я экспортировал содержимое 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 голосов
/ 02 декабря 2018

Предполагается, что environmentId - это среда для развертывания.

Я следовал статье здесь,

Ссылка VSTS / TFS REST API: основы и работасо сборками и выпусками

, которые использовали 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 до этого.

Я также проверил официальные документы для подтверждения ожидаемых параметров в теле запроса.

Ссылка Выпуски - Обновление среды выпуска

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...