簡體   English   中英

azure CLI 在應該失敗的時候沒有失敗

[英]azure CLI not failing when it should

我使用 azure cli 任務來創建一些 azure 資源,例如:

- job: provision_job
  steps:        
    - task: AzureCLI@2
      displayName: Create app service plan, site, keyvault and appinsight
      inputs:
        azureSubscription: '${{ parameters.azureSubscriptionName }}'
        scriptType: ps
        scriptLocation: inlineScript
        inlineScript: |
          
          az appservice plan create --name '${{ parameters.servicePlanName }}' -g ${{ parameters.groupName }} --sku ${{ parameters.servicePlanNameSKU }}
          
          az webapp create -g ${{ parameters.groupName }} -p "${{ parameters.servicePlanName }}" -n "${{ parameters.webAppName }}"  --runtime '${{ parameters.webAppRuntime }}' --assign-identity [system] --tags ${{ parameters.tags }}
          
          az keyvault create --location ${{ parameters.keyvaultLocation}} --name ${{ parameters.keyvaultName}} --resource-group ${{ parameters.groupName }} --enable-soft-delete=true
                          
          az resource create --resource-group ${{ parameters.groupName }} --resource-type "Microsoft.Insights/components" --name ${{ parameters.appInsightName }} --location ${{ parameters.appInsightLocation }} --properties '{\"Application_Type\":\"web\"}'

當 keyvault 創建失敗時,日志將打印一條錯誤消息The Vault 'xxx' not found within subscription ,但是,任務成功了。 調試日志說:

##[debug]$LASTEXITCODE: 0
2021-09-09T09:49:15.2655965Z ##[debug]Exit code 0 received from tool 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'
2021-09-09T09:49:15.2656808Z ##[debug]STDIO streams have closed for tool 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe'

所以看起來如果某些 az 命令在中間失敗,power shell 不知何故無法檢測到它? 我嘗試將 failOnStderr 設置為 true,但它不起作用,因為來自 AZ 命令 let 的任何警告消息都將被視為失敗。

這是因為,默認情況下,行if ((Test-Path -LiteralPath variable:\\LASTEXITCODE)) { exit $LASTEXITCODE }附加到腳本的末尾。 這將導致外部命令的最后一個退出代碼作為退出代碼 PowerShell 傳播。因此,如果最后一個命令成功,盡管中間az命令失敗,它不會使任務失敗。

在 PS 環境中使用 Azure CLI 命令處理錯誤可能有點棘手。 在 PowerShell 上運行 Azure CLI 命令時,我發現檢查自動變量$? 有助於有效判斷命令的執行狀態,如下:

# Returns False as the command errors out
PS C:\> $output = az group create -g myRG | ConvertFrom-Json
if (!$?) {
    Write-Error "Error creating resource group"
}
else {
    Write-Output "RG created"
}

az : ERROR: the following arguments are required: --location/-l
At line:2 char:11

####

# Returns True as the command succeeds
PS C:\> $output = az group create -g myRG -l eastus | ConvertFrom-Json
if (!$?) {
    Write-Error "Error creating resource group"
}
else {
    Write-Output "RG created"
}

RG created

同樣的檢查可以應用於您的 Azure CLI 命令以及在任務級別啟用failOnStandardError

我嘗試將failOnStderr設置為 true,但它不起作用,因為來自 AZ cmdlet 的任何警告消息都將被視為失敗。

要使 Azure CLI 在命令調用期間抑制警告並僅顯示錯誤,您可以使用--only-show-errors參數以便僅將錯誤寫入stderr ,從而抑制來自預覽、棄用和實驗命令的警告。 不過,請務必將powerShellErrorActionPreference (轉換為 PowerShell 的$ErrorActionPreference變量的 Azure CLI 任務輸入)設置為Stop

# Can be set within the script or at the Task level
$ErrorActionPreference = "Stop"

$output = az group create -g myRG --only-show-errors | ConvertFrom-Json
if (!$?) {
    Write-Error "Error creating resource group"
}
else {
    Write-Output "RG created"
}

# Change it back to the old value
$ErrorActionPreference = "Continue"

編輯:檢查PowerShell 中 Azure CLI 的錯誤處理,以獲取有關在 PS 環境中使用 Azure CLI 命令處理錯誤的指導。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM