如何在YAML流水线中调用Azure DevOps API?遇未授权问题求助
问题分析与解决方案
你的脚本出现未授权响应,主要有几个核心原因,咱们一步步来解决:
1. Bash变量替换失效(最直接的问题)
你在curl命令里用了单引号包裹Authorization头,而Bash中,单引号内的变量是不会被解析替换的——也就是说,你实际发送的令牌值是字面量$SYSTEMACCESSTOKEN,而不是环境变量里的真实令牌!
把单引号改成双引号就能解决这个变量替换问题:
- bash: | url="https://dev.azure.com/myOrg/myProj/_apis/build/builds/$(resources.pipeline.build.runID)/workitems" # 把Bearer后的单引号改成双引号,让变量被正确解析 response=$(curl $url -H "Authorization: Bearer $SYSTEMACCESSTOKEN") echo $response env: SYSTEMACCESSTOKEN: $(System.AccessToken)
2. 流水线权限配置缺失
即使变量替换正常,System.AccessToken也需要足够的权限才能访问工作项,你需要检查两个配置:
启用脚本访问OAuth令牌:
在你的流水线编辑界面,找到对应的代理作业,进入「选项」标签页,确认「允许脚本访问OAuth令牌」选项已设置为「启用」。这个开关是让流水线脚本能拿到System.AccessToken的前提。配置服务账户权限:
System.AccessToken对应的是「项目集合构建服务(你的组织名)」或「项目构建服务(你的项目名)」这个内置账户。你需要确保它有工作项读取权限:- 进入项目设置 → 权限 → 找到上述构建服务账户
- 在「工作项跟踪」权限组里,确认「查看工作项」权限已设置为「允许」
3. 额外验证小技巧
如果还是有问题,可以做以下排查:
- 在脚本里先添加
echo $SYSTEMACCESSTOKEN(注意不要在公开流水线中执行,避免泄露令牌),确认变量是否有值 - 在curl命令后加上
-v参数(curl -v $url ...),查看详细的HTTP响应,确认错误是令牌无效还是权限不足
内容的提问来源于stack exchange,提问作者Tomato
相关产品推荐
相关产品推荐

