Как сделать так, чтобы рецензент автоматически одобрил запрос на включение по завершении функционального теста? - PullRequest
0 голосов
/ 25 июня 2019

У меня есть хранилище Azure DevOps Git, которое находится в Azure DevOps в облаке.Мы используем Pull Requests для управления слиянием кода с нашей веткой релиза.

Ветвям функций назначен автоматический рецензент, единственная цель которого - добавить голос одобрения, когда функциональное тестирование будет успешно завершено в нашей среде непрерывного развертывания.Идея состоит в том, что это обеспечит более надежную проверку автоматических слияний вплоть до нашей ветки релизов.

У меня есть частичный API Powershell, который работает с REST API Azure DevOps, и я получу ссылку на рецензента взапрос извлечения, но я получаю сбои при попытке проголосовать или одобрить рецензента через API.

В документации предлагается, чтобы мне понадобился идентификатор рецензента для передачи следующего URI

https://dev.azure.com/$organization/$projectId/_apis/git/repositories/$repositoryId/pullrequests/$pullRequestId/reviewers/$reviewerId?api-version=5.0

Когда я использую идентификатор рецензента, который я получаю из запроса на извлечение

https://dev.azure.com/$organization/$projectId/_apis/git/repositories/$repositoryId/pullrequests

reviewerUrl : https://dev.azure.com/my-organization/be283e5e-0466-41ef-aeb7-24264e12f6d6/_apis/git/repositories/3c4b0093-30fc-4652-a39e-08bb442b1879/pullRequests/2/reviewers/a72ce17b-22de-41a0-b6a5-49e5ba189826
vote        : 10
isRequired  : True
displayName : testaccount@xxxxxxx.com
url         : https://spsprodcca1.vssps.visualstudio.com/A41d8d933-620f-4153-952c-4ee19c0e4c0b/_apis/Identities/a72ce17b-22de-41a0-b6a5-49e5ba189826
_links      : @{avatar=}
id          : a72ce17b-22de-41a0-b6a5-49e5ba189826
uniqueName  : testaccount@xxxxxxx.com
imageUrl    : https://dev.azure.com/my-organization/_api/_common/identityImage?id=a72ce17b-22de-41a0-b6a5-49e5ba189826

Я получаю следующую ошибку

"Недопустимое значение аргумента. \ R \ nИмя параметра: должен быть указан действительный идентификатор рецензента."

Я не уверен, правильно ли я поступаю, ноЯ хотел бы, чтобы мой Octopus Deployment запускал функциональные тесты в нашей целевой среде, а затем, после успешного завершения тестирования, для автоматического проверщика тестов было получено подтверждение по запросу с помощью REST API.

Вся документация, которую я могу найти, в конечном счете, возвращает меня к этому документу, но я не могу понять, как применить одобрение для моего рецензента.

https://docs.microsoft.com/en-us/rest/api/azure/devops/git/pull%20request%20reviewers/create%20pull%20request%20reviewer?view=azure-devops-rest-5.0

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

Я не думаю, что использование поддельного рецензента запросов на извлечение является подходящим способом. Вместо этого я предлагаю рассмотреть возможность расширения рабочего процесса запроса на получение с статусом запроса на получение .

Вы используете API статуса , чтобы добавить пользовательский статус к вашему запросу. Вы вызываете это перед началом ваших тестов (с ожидающим статусом) и после их завершения (успешно или неудачно).

0 голосов
/ 25 июня 2019

Несколько замечаний:

  1. Только рецензент может публиковать обновление статуса, поэтому вызов API должен использовать PAT для рецензента, который желает утвердить запрос на извлечение.

  2. Рецензент, который утверждает запрос на извлечение, должен иметь доступ участника к хранилищу, чтобы утвердить запрос на извлечение.Если нет, вы получите ошибки.

  3. Убедитесь, что рецензент был добавлен в запрос на извлечение.Например, добавьте его в качестве автоматического рецензента для папки, чтобы он автоматически добавлялся во все запросы на получение по запросу.

  4. Похоже, что у рецензента, найденного в запросе на получение ($ pullRequest.reviewers), есть различиячем если бы вы использовали вызов API, чтобы получить рецензент по запросу извлечения напрямую.

  5. По-видимому, версия PATCH для обновления проверяющих по запросу извлечения вызывает ошибки при попытке обновить существующего проверяющего.Вы должны использовать PUT, чтобы обновить утверждение запроса на получение для существующего рецензента.

Вот что я сделал, чтобы заставить его работать:

Административный материал:

  • Убедитесь, что рецензент имеет учетную запись в DevOps Azure и имеет ОСНОВНОЙ уровень доступа

  • Убедитесь, что рецензент является частью команды проекта итаким образом, он имеет право доступа к проекту со стороны участника и, что наиболее важно, может утверждать запросы на получение данных.

  • Убедитесь, что рецензент имеет токен PAT, который можно использовать для доступа к API.

API Stuff

  • GET Запрос проверки извлечения для известного запроса извлечения с использованием PAT, назначенного обозревателю:

  • Обновите голоса рецензента до 10

  • Убедитесь, что данные рецензента правильно преобразованы в формат JSON.

  • Убедитесь, что передаваемые вами заголовкис вызовом API PUT имеют правильный тип авторизации и типа контента."Basic <Base64String>" и "application/json"

function ConvertTo-Base64 {

    [CmdletBinding()]
    param([Parameter(Mandatory=$true)][System.String]$input)

    $inputBytes = [System.Text.Encoding]::ASCII.GetBytes($input);
    $inputBase64 = [System.Convert]::ToBase64String($inputBytes);
    return $inputBase64
}

function Get-AzureDevOpsPullRequestReviewer {

    [CmdletBinding()]
    param([Parameter(Mandatory=$true)][System.String]$token,
          [Parameter(Mandatory=$true)][System.String]$organization,
          [Parameter(Mandatory=$true)][System.String]$projectId,
          [Parameter(Mandatory=$true)][System.String]$repositoryId,
          [Parameter(Mandatory=$true)][System.String]$pullRequestId,
          [Parameter(Mandatory=$false)][System.String]$reviewerId=$null)

    $uri = "https://dev.azure.com/$organization/$projectId/_apis/git/repositories/$repositoryId/pullrequests/$pullrequestId/reviewers";

    if ($reviewerId) { $uri = "$uri/$reviewerId" }

    $uri = "$uri`?api-version=5.0";

    $tokenBase64 = ConvertTo-Base64(":$token");

    $headers = @{
        "Accept" = "application/json";
        "Authorization" = "Basic $tokenBase64";
    }

    $response = Invoke-WebRequest -Uri $uri -headers $headers;

    $content = ConvertFrom-Json($response.Content);
    if ($reviewerId) { return $content } else { return $content.value }
}

function Approve-AzureDevOpsPullRequest {

    [CmdletBinding()]
    param([Parameter(Mandatory=$true)][System.String]$token,
          [Parameter(Mandatory=$true)][System.String]$organization,
          [Parameter(Mandatory=$true)][System.String]$projectId,
          [Parameter(Mandatory=$true)][System.String]$repositoryId,
          [Parameter(Mandatory=$true)][System.String]$pullRequestId,
          [Parameter(Mandatory=$true)]$reviewer)

    $uri = "https://dev.azure.com/$organization/$projectId/_apis/git/repositories/$repositoryId/pullrequests/$pullRequestId/reviewers/$($reviewer.id)`?api-version=5.0"

    $tokenBase64 = ConvertTo-Base64(":$token");

    $headers = @{
        "Accept" = "application/json";
        "Authorization" = "Basic $tokenBase64";
        "Content-Type" = "application/json";
    }

    $body = ConvertTo-Json($reviewer);

    $response = Invoke-WebRequest -Uri $uri -headers $headers -body $body -Method Put

    return $response;
}

$myOrganization  = "benco-devops";
$myProjectId     = "47b0a6fc-a58f-4bbf-9950-2d5e33ae0587";
$myRepositoryId  = "1582ab2b-ae01-41e1-9695-f9966fdd7985";
$myReviewerId    = "ben-project-pipeline@benco-devops.com";
$myReviewerPAT   = "1z3xq9zmw1syznfhqzoeaoppbx2xsowvqscgnowuin7xkxk5fy7c";
$myPullRequestId = 2;

$reviewer = Get-AzureDevopsPullRequestReviewer -token $myReviewerPAT -organization $myOrganization -projectId $myProjectId -repositoryId $myRepositoryId -pullRequestId $myPullRequestId | ? uniqueId -eq $myReviewerId;

$reviewer.votes = 10;

Approve-AzureDevOpsPullRequest -token $myReviewerPAT -organization $myOrganization -projectId $myProjectId -repositoryId $myRepositoryId -pullRequestId $myPullRequestId -reviewer $reviewer;
...