BASH脚本调用Azure DevOps REST API的PAT编码问题求助
正确实现方案
1. PAT编码修正
你原有的PAT编码逻辑(空用户名拼接PAT后做Base64编码)完全符合Azure DevOps Basic认证的要求,唯一常见问题是GNU版本base64默认会在输出每76个字符后插入换行符,会导致认证头失效,需要加参数禁用换行:
# 兼容Linux(GNU)和macOS的base64编码 if base64 --help 2>&1 | grep -q -- "-w, --wrap"; then # Linux环境 B64_PAT=$(printf "%s" ":$PAT" | base64 -w 0) else # macOS环境 B64_PAT=$(printf "%s" ":$PAT" | base64) fi
2. 调用API代码修正
你原有代码存在两个问题:一是变量赋值时外层多余的双引号会导致语法错误,二是手动拼接JSON如果遇到含特殊字符的仓库名会破坏JSON结构,修正后完整代码如下:
# 提前定义所有需要的变量 PAT="你的PAT字符串" OrganizationName="你的组织名" projectId="你的项目ID" RepoName="要创建的仓库名" # PAT编码 if base64 --help 2>&1 | grep -q -- "-w, --wrap"; then B64_PAT=$(printf "%s" ":$PAT" | base64 -w 0) else B64_PAT=$(printf "%s" ":$PAT" | base64) fi # 调用Azure DevOps API创建仓库 Repo_Creation_Status=$(curl --write-out "%{http_code}" --location --request POST "https://dev.azure.com/${OrganizationName}/${projectId}/_apis/git/repositories?api-version=6.1-preview.1" \ --header "Authorization: Basic ${B64_PAT}" \ --header "Content-Type: application/json" \ --data-raw '{ "name": "'"${RepoName}"'", "project": { "id": "'"${projectId}"'" } }' --output output.txt --silent) # 可打印状态码快速排查问题 echo "请求返回状态码: ${Repo_Creation_Status}"
注意事项
- 请确保使用的PAT已经开通代码仓库的创建权限,对应权限范围为
Code > Read & write - 变量
projectId可以是项目的GUID,也可以是项目的名称,二者都可以被接口识别 - 如果需要处理含特殊字符的仓库名,建议用
jq工具生成合法JSON,避免手动拼接出错,示例如下:
# 用jq生成合法JSON的示例 REQUEST_BODY=$(jq -n \ --arg name "$RepoName" \ --arg pid "$projectId" \ '{name: $name, project: {id: $pid}}')
内容的提问来源于stack exchange,提问作者Devops-Learner
相关产品推荐
相关产品推荐

