azure CLI не выходит из строя, когда это должно быть

#azure-cli

Вопрос:

Я использую задачу 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:WindowsSystem32WindowsPowerShellv1.0powershell.exe'
2021-09-09T09:49:15.2656808Z ##[debug]STDIO streams have closed for tool 'C:WindowsSystem32WindowsPowerShellv1.0powershell.exe'
 

Итак, похоже, что если какая-то команда az завершится ошибкой в середине, power shell каким-то образом не сможет ее обнаружить? Я попытался установить значение failOnStderr в значение true, но это не сработает, так как любое предупреждающее сообщение от команды AZ let будет рассматриваться как сбой.

Ответ №1:

Это связано с тем, что по умолчанию строка if ((Test-Path -LiteralPath variable:\LASTEXITCODE)) { exit $LASTEXITCODE } добавляется в конец вашего сценария. Это приведет к тому, что последний код выхода из внешней команды будет распространен как код выхода PowerShell. Поэтому, если последняя команда выполняется успешно, несмотря на az сбой промежуточных команд, она не завершает задачу.

Обработка ошибок с помощью команд Azure CLI в среде PS может быть немного сложной. Во время выполнения команд Azure CLI в PowerShell я обнаружил, что проверка автоматической переменной $? помогает эффективно определять состояние выполнения команды следующим образом:

 # 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 будет рассматриваться как сбой.

Чтобы CLI Azure подавлял предупреждения и отображал ошибки только во время вызова команд, вы можете использовать --only-show-errors параметр таким образом , чтобы в него записывались только ошибки stderr , подавляя предупреждения из предварительного просмотра, устаревших и экспериментальных команд. Обязательно установите значение powerpellerroractionpreference (ввод задачи Azure CLI, который преобразуется в $ErrorActionPreference переменную PowerShell) в 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"
 

Изменить:
Проверьте обработку ошибок для Azure CLI в PowerShell для получения инструкций по обработке ошибок с помощью команд Azure CLI в средах PS.