Azure DevOps经典发布管道中Bash任务无法识别变量
问题:Azure DevOps经典发布管道Bash任务中文件脚本调用变量失败
背景
在Azure DevOps经典发布管道的Bash任务中,执行以下.sh脚本:
set -e pip install azure-identity pip install azure-cosmos pip install requests set +e az login --service-principal -u $(AZURE_CLIENT_ID) --tenant $(AZURE_TENANT_ID) --allow-no-subscriptions --federated-token $(AZURE_ID_TOKEN)
执行脚本前,已通过SPN完成Azure认证,并通过以下脚本成功设置并验证变量:
az account show echo "##vso[task.setvariable variable=AZURE_CLIENT_ID]$servicePrincipalId" echo "##vso[task.setvariable variable=AZURE_ID_TOKEN]$idToken" echo "##vso[task.setvariable variable=AZURE_TENANT_ID]$tenantId"
问题现象
- 使用
inline内联脚本运行时,代码执行完全正常 - 切换为
filePath文件脚本(代码与内联脚本完全一致)时,出现错误:
ERROR: argument --username/-u: expected one argument 2024-09-10T10:36:22.9450758Z 2024-09-10T10:36:22.9451406Z Examples from AI knowledge base: 2024-09-10T10:36:22.9451894Z az login --service-principal -u http://azure-cli-2016-08-05-14-31-15 -p VerySecret --tenant contoso.onmicrosoft.com 2024-09-10T10:36:22.9453690Z Log in with a service principal using client secret. Use -p=secret if the first character of the password is '-'. 2024-09-10T10:36:22.9454012Z 2024-09-10T10:36:22.9454461Z az login --service-principal -u http://azure-cli-2016-08-05-14-31-15 -p ~/mycertfile.pem --tenant contoso.onmicrosoft.com 2024-09-10T10:36:22.9454937Z Log in with a service principal using client certificate. 2024-09-10T10:36:22.9455157Z 2024-09-10T10:36:22.9455468Z az login -u johndoe@contoso.com -p VerySecret 2024-09-10T10:36:22.9456041Z Log in with username and password. This doesn't work with Microsoft accounts or accounts that have two-factor authentication enabled. Use -p=secret if the first character of the password is '-'. 2024-09-10T10:36:22.9456402Z
已尝试手动设置环境变量但无效,确认凭据有效且内联脚本可正常调用变量,仅文件脚本出现该问题。
解决方案
1. 修改变量引用语法
Azure DevOps中,filePath模式的脚本默认不会自动解析$(变量名)格式的占位符,而内联脚本会自动处理。需改用Bash原生环境变量语法:
set -e pip install azure-identity pip install azure-cosmos pip install requests set +e az login --service-principal -u "$AZURE_CLIENT_ID" --tenant "$AZURE_TENANT_ID" --allow-no-subscriptions --federated-token "$AZURE_ID_TOKEN"
2. 启用文件脚本的变量替换(可选)
在Bash任务的高级设置中,勾选替换文件中的变量选项,Azure DevOps会自动将$(变量名)替换为对应值。注意此选项仅支持特定格式占位符,优先推荐使用Bash原生语法。
3. 验证变量加载情况
在文件脚本开头添加打印语句,确认变量是否正确传递到脚本环境:
echo "AZURE_CLIENT_ID: $AZURE_CLIENT_ID" echo "AZURE_TENANT_ID: $AZURE_TENANT_ID" echo "AZURE_ID_TOKEN: $AZURE_ID_TOKEN"
内容的提问来源于stack exchange,提问作者Ankit Kushwaha
相关产品推荐
相关产品推荐

