Bitbucket流水线通过Azure CLI部署至Azure VM时无法访问脚本文件
问题根因
你当前的错误核心原因是:az vm run-command invoke 的 --scripts 参数如果直接传文件路径,指向的是目标Azure VM本地的文件路径,而非Bitbucket流水线运行环境(runner)上的本地路径。你传入的 $BITBUCKET_CLONE_DIR/SetupSimpleSite.ps1 是Bitbucket Linux runner上的本地路径,Windows VM完全无法访问该路径,自然会报路径不存在的错误。
你之前执行az account show正常,是因为该命令直接在流水线加载的azure-cli容器内执行,不需要和目标VM交互,和run-command的运行逻辑完全不同。
解决方案
你不需要调整脚本存放位置,仅修改流水线配置即可实现调用源代码中的PowerShell脚本:
方法一:使用az cli原生@本地文件语法(推荐)
az cli原生支持参数值前加@前缀,会自动读取对应本地文件的内容作为参数值上传到Azure侧,不需要手动处理文件内容和转义,修改你的CLI_COMMAND配置如下:
CLI_COMMAND: 'az vm run-command invoke --command-id RunPowerShellScript --name $AZURE_VM_NAME --resource-group $AZURE_RESOURCE_GROUP_NAME --scripts @$BITBUCKET_CLONE_DIR/SetupSimpleSite.ps1'
仅需要在原文件路径前加@符号即可解决问题。
方法二:手动读取脚本内容传参
如果你的脚本包含大量特殊字符,用方法一出现转义异常,可以先在流水线中读取脚本内容存入变量,再传给run-command:
test-azure-cli-pipeline: - step: name: "Deploy to Azure VM" deployment: staging script: - PS_SCRIPT_CONTENT=$(cat $BITBUCKET_CLONE_DIR/SetupSimpleSite.ps1 | tr '\n' ';' | sed 's/"/\\"/g') - pipe: microsoft/azure-cli-run:1.1.0 variables: AZURE_APP_ID: $AZURE_APP_ID AZURE_PASSWORD: $AZURE_PASSWORD AZURE_TENANT_ID: $AZURE_TENANT_ID CLI_COMMAND: 'az vm run-command invoke --command-id RunPowerShellScript --name $AZURE_VM_NAME --resource-group $AZURE_RESOURCE_GROUP_NAME --scripts "$PS_SCRIPT_CONTENT"'
补充注意事项
- 如果你的PowerShell脚本需要传入动态参数,可以在命令后追加
--parameters 参数名1=参数值1 参数名2=参数值2即可。 - 请确认你的Azure VM已开启运行命令功能,且所用服务主体有
Microsoft.Compute/virtualMachines/runCommand/action权限。
内容的提问来源于stack exchange,提问作者Jerome2606
相关产品推荐
相关产品推荐

