如何通过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
相关产品推荐
相关产品推荐

