Windows代理Azure Pipeline Bash脚本获取构建号遇安全配置错误
解决方案
1. 解决「Enhanced Security Configuration」报错
这个错误是Windows代理服务器开启了**Internet Explorer增强安全配置(IE ESC)**导致的,它会拦截对Azure DevOps API的请求,可二选一处理:
- 登录Windows代理服务器,打开「服务器管理器」→「本地服务器」→找到「IE增强安全配置」,设置为「关闭」(需管理员权限)
- 在代理服务器的IE/Edge中,将
dev.azure.com添加到「受信任的站点」列表
2. 修正Bash脚本问题
你的脚本存在URL格式和SSL限制问题,修正后如下:
#!/bin/bash echo "TAG: $TAG" echo "VER: $VER" echo "SYSTEM_ACCESSTOKEN: $SYSTEM_ACCESSTOKEN" echo "Executing call to get latest build from pipeline definition Id" # 补充URL中的问号,修复API地址格式 API_URL="${URL}?api-version=7.1-preview.1" echo "API URL: $API_URL" # 空用户名+系统令牌做Basic认证,添加--ssl-no-revoke绕过Windows SSL限制 RESPONSE=$(curl -u ":$SYSTEM_ACCESSTOKEN" --location --request GET "$API_URL" --ssl-no-revoke) echo "Response: $RESPONSE" # 提取构建号 BUILD_NUMBER=$(echo "$RESPONSE" | jq -r '.buildNumber') echo "Latest Build Number: $BUILD_NUMBER"
关键修正点:
- URL缺少
?分隔路径与查询参数,导致API地址无效 - 添加
--ssl-no-revoke参数,绕过Windows环境下的SSL证书验证限制 - Azure DevOps不校验Basic auth的用户名,留空即可,仅需令牌
3. 修正PowerShell脚本问题
PowerShell中系统令牌的引用方式错误,同时存在URL格式和参数冲突问题,修正后如下:
# 正确引用Azure DevOps系统令牌环境变量 $connectionToken = $env:SYSTEM_ACCESSTOKEN $base64AuthInfo = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$connectionToken")) # 补充URL中的问号,修复API地址格式 $BuildPipelineUrl = "$url`?$top=1&api-version=6.0" Write-Host "URL: $BuildPipelineUrl" # 移除-UseDefaultCredential参数,避免与令牌认证冲突 $BuildPipelineInfo = Invoke-RestMethod -Uri $BuildPipelineUrl -Method Get -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} $ver = $BuildPipelineInfo.value.buildnumber Write-Host "Latest Build Number: $ver"
关键修正点:
- Azure DevOps的系统令牌在PowerShell中需通过
$env:SYSTEM_ACCESSTOKEN引用(环境变量用下划线代替点) - URL缺少
?分隔符,导致API请求无效 - 移除
-UseDefaultCredential参数,避免与自定义Authorization头冲突
4. 更简便的替代方案:使用Azure DevOps CLI
如果代理服务器已安装Azure DevOps CLI,无需手动编写HTTP请求,直接用以下命令获取最新构建号:
# 流水线中自动使用系统令牌,无需手动登录 az devops login --organization "$ORG_URL" # 获取指定流水线的最新构建号(替换YOUR_PIPELINE_ID为目标流水线ID) BUILD_NUMBER=$(az pipelines build list --definition-id YOUR_PIPELINE_ID --top 1 --query "[0].buildNumber" --output tsv) echo "Latest Build Number: $BUILD_NUMBER"
该方式无需处理令牌转换和HTTP请求细节,兼容性更好。
系统令牌相关说明
- 系统令牌无需额外转换,直接作为Basic auth的密码部分即可(用户名留空)
- 必须确保流水线任务已勾选「Allow scripts to access the OAuth token」,否则
SYSTEM_ACCESSTOKEN环境变量不会被注入 - 系统令牌的权限由流水线服务账号决定,需确保该账号有目标流水线的「读取」权限
内容的提问来源于stack exchange,提问作者Diego Laurora
相关产品推荐
相关产品推荐

