如何在Bicep模板构建失败时触发Azure Pipelines任务失败?
解决Azure Pipelines中Bicep部署失败不触发任务失败的问题
问题根源
原脚本里,az deployment sub create命令执行失败时,bash默认不会中断后续步骤,不管部署成功与否,后面的变量赋值和输出步骤都会继续跑,导致AzureCLI任务误以为整个脚本执行成功,不会标记任务失败。
两种可行解决方案
方式一:开启bash的错误终止模式
在脚本开头加set -e,让任何命令执行失败时立刻终止脚本,AzureCLI任务会因为脚本返回非0退出码自动标记为失败。
修改后的完整任务脚本:
- task: AzureCLI@2 displayName: 'Deploy resource group' name: resourceGroup inputs: azureSubscription: 'ARM' scriptType: bash scriptLocation: inlineScript addSpnToEnvironment: true inlineScript: | set -e # 执行Bicep部署 resources=$(az deployment sub create \ --name blog \ --location WestUS2 \ --template-file lib/infra/main.bicep) # 提取输出变量并设置为任务输出 apiUrl=$(echo "$resources" | jq -r '.properties.outputs.apiUrl.value') staticUrl=$(echo "$resources" | jq -r '.properties.outputs.staticUrl.value') echo "##vso[task.setvariable variable=apiUrl;isOutput=true]$apiUrl" echo "##vso[task.setvariable variable=staticUrl;isOutput=true]$staticUrl"
方式二:手动检查部署命令的退出码
如果需要自定义错误提示内容,可以手动捕获az命令的退出码,判断部署是否失败,若失败则输出错误信息再终止脚本。
修改后的完整任务脚本:
- task: AzureCLI@2 displayName: 'Deploy resource group' name: resourceGroup inputs: azureSubscription: 'ARM' scriptType: bash scriptLocation: inlineScript addSpnToEnvironment: true inlineScript: | # 执行Bicep部署并保存输出内容 resources=$(az deployment sub create \ --name blog \ --location WestUS2 \ --template-file lib/infra/main.bicep) # 获取部署命令的退出码 deploy_exit_code=$? # 判断部署是否失败 if [ $deploy_exit_code -ne 0 ]; then echo "Bicep部署失败,错误详情:$resources" exit $deploy_exit_code fi # 提取并设置输出变量 apiUrl=$(echo "$resources" | jq -r '.properties.outputs.apiUrl.value') staticUrl=$(echo "$resources" | jq -r '.properties.outputs.staticUrl.value') echo "##vso[task.setvariable variable=apiUrl;isOutput=true]$apiUrl" echo "##vso[task.setvariable variable=staticUrl;isOutput=true]$staticUrl"
额外优化:检查输出变量有效性
如果部署成功但没生成预期的apiUrl或staticUrl变量,可以加个检查逻辑,避免后续任务拿到无效值:
# 提取变量后添加检查步骤 if [ -z "$apiUrl" ] || [ "$apiUrl" = "null" ]; then echo "部署成功但未找到apiUrl输出变量" exit 1 fi if [ -z "$staticUrl" ] || [ "$staticUrl" = "null" ]; then echo "部署成功但未找到staticUrl输出变量" exit 1 fi
关于从$resources读取错误触发失败
当az deployment sub create失败时,resources变量会包含JSON格式的错误详情,你可以像方式二那样,在判断退出码后把错误信息输出到日志,再执行exit命令终止脚本,这样就能手动触发任务失败。
内容的提问来源于stack exchange,提问作者Tom W
相关产品推荐
相关产品推荐

