You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 14:03:26