Azure Pipeline运行调用DevOps API的Python脚本报JSONDecodeError如何解决
解决方案
该JSON解析错误的核心原因是Azure Agent发起请求后,服务端返回的响应并非合法JSON格式,基本都是请求触发了权限错误、地址错误等场景,返回了HTML格式的错误提示页。本地运行正常说明你本地的PAT、网络配置符合要求,问题出在流水线运行环境的请求配置上,可按以下步骤排查修复:
新增请求校验逻辑,先定位具体错误原因
在解析响应前先校验HTTP状态码,并打印完整响应内容,确认报错根因,参考修改后的代码:import base64 import requests import json import os # 从流水线环境变量读取PAT,不要硬编码 AZURE_DEVOPS_PAT = os.getenv("AZURE_DEVOPS_PAT") authorization = str(base64.b64encode(bytes(':' + AZURE_DEVOPS_PAT, 'ascii')), 'ascii') headers = { 'Accept': 'application/json', 'Authorization': 'Basic ' + authorization } # 替换为官方公开API地址,注意去掉原地址里的{}、()占位符,填入实际的组织、项目名 url = 'https://dev.azure.com/你的组织名/你的项目名/_apis/distributedtask/queues?api-version=7.1-preview.1' response = requests.get(url, headers=headers) # 先校验请求状态,避免直接解析非JSON内容 if response.status_code != 200: print(f"请求失败,状态码:{response.status_code},完整响应内容:{response.text}") raise Exception(f"Azure DevOps API请求失败,状态码{response.status_code}") data = response.json() print(data)替换为官方公开API接口
你当前使用的_settings/agentqueues?__rt=fps&__ver=2是Azure DevOps前端页面的内部私有接口,鉴权逻辑不固定,流水线环境调用很容易被拦截。查询代理队列的公开标准API为/_apis/distributedtask/queues,接口稳定性和兼容性更高。修正PAT配置
不要在代码中硬编码PAT,将PAT存储到Azure Pipeline的加密变量中,命名为AZURE_DEVOPS_PAT,运行时通过环境变量读取。同时确认该PAT已开启Agent Pools > Read权限,且处于有效期内。排查网络访问限制
如果你的Azure DevOps组织配置了IP访问限制,需将流水线Agent的出口IP添加到组织的IP白名单中,避免请求被拦截。
内容的提问来源于stack exchange,提问作者Ankit Soni
相关产品推荐
相关产品推荐

