You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过API为Azure DevOps拉取请求添加评审人?调用失败求助

问题:Azure DevOps REST API添加拉取请求评审人失败

尝试通过REST API为Azure DevOps拉取请求添加评审人,但使用用户名/邮箱均无效。Groovy脚本相关代码如下:

if (codeReviewer) {
def reviewerId = getUserGUID(codeReviewer)
println("reviewerId: " + reviewerId)

if (reviewerId) {
    callAzureDevopsRestAPI([
        'azureRestUrlSuffix': "${GIT_PROJECT}/_apis/git/repositories/${GIT_REPO}/pullrequests/${pr.pullRequestId}/reviewers",
        'httpMode': 'POST',
        'requestBody': "{ \"id\": \"$reviewerId\" }"
    ])
}

def getUserGUID(String reviewer) {
    def response = callAzureDevopsRestAPI([
        'azureRestUrlSuffix': "_apis/graph/userentitlements?api-version=7.1-preview.1",
        'httpMode': 'GET'
    ])

    def jsonResponse = new groovy.json.JsonSlurper().parseText(response.data.toString())

    def user = jsonResponse.value.find {
        it.principalName?.equalsIgnoreCase(reviewer) ||
        it.displayName?.equalsIgnoreCase(reviewer) ||
        it.mail?.equalsIgnoreCase(reviewer)
    }

    return user ? user.descriptor : null
}

已尝试用邮箱和显示名称获取用户描述符,但获取标识符的API调用始终失败,不确定是否请求体遗漏内容或使用了错误的用户标识符。


解决方案

1. 更换用户标识符获取API

_apis/graph/userentitlements返回的descriptor并非拉取请求评审人API所需的标识符,应使用_apis/users API直接获取用户的GUID(id字段):

def getUserGUID(String reviewer) {
    // 对搜索关键词编码,避免特殊字符导致的请求异常
    def encodedReviewer = URLEncoder.encode(reviewer, 'UTF-8')
    def response = callAzureDevopsRestAPI([
        'azureRestUrlSuffix': "_apis/users?api-version=7.1-preview.1&searchQuery=${encodedReviewer}",
        'httpMode': 'GET'
    ])

    def jsonResponse = new groovy.json.JsonSlurper().parseText(response.data.toString())

    def user = jsonResponse.value.find {
        it.principalName?.equalsIgnoreCase(reviewer) ||
        it.displayName?.equalsIgnoreCase(reviewer) ||
        it.mail?.equalsIgnoreCase(reviewer)
    }

    // 返回用户的GUID而非descriptor
    return user ? user.id : null
}

2. 修正请求体格式

拉取请求添加评审人的API要求请求体为数组格式(即使仅添加单个评审人),调整请求体:

callAzureDevopsRestAPI([
    'azureRestUrlSuffix': "${GIT_PROJECT}/_apis/git/repositories/${GIT_REPO}/pullrequests/${pr.pullRequestId}/reviewers",
    'httpMode': 'POST',
    'requestBody': "[{ \"id\": \"$reviewerId\" }]"
])

3. 验证API请求头

确保callAzureDevopsRestAPI函数在POST请求中添加了正确的请求头:

Content-Type: application/json

如果该函数未默认设置此头,需要手动添加。

4. 检查权限

确认调用API的服务账号拥有以下权限:

  • 目标项目的代码评审者或更高权限
  • 拉取请求所在仓库的参与权限

内容的提问来源于stack exchange,提问作者Bernana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 22:47:14