如何让审阅者在功能测试完成时自动批准请求请求?

时间:2019-06-25 14:21:51

标签: git azure-devops devops azure-devops-rest-api

我有一个Azure DevOps Git存储库,该存储库位于云中的Azure DevOps中。 我们正在使用Pull Requests来管理合并到我们发布分支中的代码。

在功能分支中分配了一个自动审阅者,其唯一目的是在我们的连续部署环境中功能测试成功完成时添加批准票。想法是,这将对自动合并到我们的发行分支提供更强大的检查。

我有一个部分Powershell API,可以访问Azure DevOps REST API,这将为我提供关于请求请求的审阅者的引用,但是尝试通过该投票对审阅者进行投票或批准却失败了

文档建议我需要审阅者ID才能传递到以下URI

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

当我使用从拉取请求中获得的审阅者ID

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参数名称:有效的审阅者ID必须   被提供。”

我不确定是否要采用正确的方法,但是我希望我的Octopus部署在目标环境中启动功能测试,然后在成功完成测试后,为<通过REST API的em>自动测试审阅者。

我可以找到的所有文档最终使我回到了该文档,但是我一生都无法看到如何为审稿人申请批准。

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 个答案:

答案 0 :(得分:2)

我不认为使用伪造的请求请求审阅者是可行的方法。相反,我建议考虑使用Pull Request status扩展拉取请求工作流程。

您使用Status API向自定义请求添加自定义状态。您可以在开始测试之前(处于待处理状态)以及测试完成(成功或失败)之前调用此方法。

答案 1 :(得分:0)

一些注意事项:

  1. 只有审阅者可以发布状态更新,因此API调用必须为希望批准请求请求的审阅者使用PAT。

  2. 正在批准请求请求的审阅者必须具有对存储库的贡献者访问权限才能批准请求请求。如果没有,您将得到错误。

  3. 确保将审阅者添加到拉取请求中。例如,将其添加为文件夹的自动审阅者,以便所有拉取请求自动添加。

  4. 在拉取请求($ pullRequest.reviewers)上找到的审阅者似乎与使用API​​调用直接获取拉取请求审阅者的区别。

  5. 用于更新请求请求审阅者的PATCH版本在尝试更新现有审阅者时似乎导致错误。您必须使用PUT为现有审阅者更新请求请求的批准。

这就是我要使其正常工作的方法:

管理内容:

  • 确保审阅者具有Azure DevOps帐户并具有BASIC访问级别

  • 确保审阅者是项目团队的成员,因此具有对项目的贡献者访问权限,最重要的是可以批准请求请求。

  • 确保审阅者具有可用于API访问的PAT令牌。

API内容

  • 使用分配给审阅者的PAT来获取已知请求请求的Pull Request审阅者:

  • 将评论者的票数更新为10

  • 确保审阅者数据已正确转换为JSON格式。

  • 确保通过PUT API调用传递的标头具有正确的授权和内容类型。 "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;