Azure DevOps сообщает, что задача PowerShell передана, даже с кодом выхода, отличным от 0

#powershell #azure-devops #task

#powershell #azure-devops #задача

Вопрос:

В Azure DevOps у меня есть задача запустить сценарий PowerShell. В определенных сценариях сценарий должен завершаться с кодом, отличным от 0, в результате чего о задаче сообщается как о сбое. Однако Azure DevOps сообщает о задаче как о пройденной независимо.

Это проблема, потому что у меня есть последующее задание, которое должно выполняться в случае сбоя этого задания, но этого не происходит из-за ложного срабатывания.

введите описание изображения здесь

Соответствующая часть сценария показывает, что в случае скриншота был обнаружен код выхода 1 , который должен привести к завершению сценария с ошибкой.

 if ($exitCode -ne 0)
{
    Write-Output ("[Error] Failing task since return code was {0} while expected 0." -f $exitCode)
}
exit $exitCode
  

Задача выполняется как часть deployment задания, и у меня есть опция, failOnStandardError установленная на true .

 - task: AzurePowerShell@5
  displayName: Check Function App Version
  inputs:
    azureSubscription: ${{ parameters.serviceConnectionName }}
    scriptType: FilePath
    scriptPath: ${{ parameters.scriptsArtefactPath }}/Test-FunctionAppVersion.ps1
    scriptArguments: -Uri ${{ parameters.healthCheckUri }} -AuthHeaderName Authorization -AuthHeaderValue "$(healthCheckAuthHeaderValue)"
    failOnStandardError: true
    azurePowerShellVersion: LatestVersion
    pwsh: true
  

Как я могу заставить Azure DevOps соблюдать мои коды выхода?

Комментарии:

1. Я тестировал аналогичный случай с обычной задачей powershell. Все сработало, как ожидалось. Я думаю, что флаг failOnStandardError действительно ищет данные, записанные в поток ошибок. Вместо этого вам нужно будет выполнить ошибку записи, чтобы принудительно выполнить ее. Это не то, о чем вы просите, хотя я знаю. При этом, я думаю, что это связано с неправильной обработкой возврата в этой задаче. Я вижу, что в любом случае у них могут возникнуть проблемы с этим флагом для этой задачи.

2. Если это ошибка, лучшим способом получить прямое облегчение может быть ее повторное использование в проекте github.

Ответ №1:

Похоже, что у задачи Azure PowerShell возникла проблема с захватом кода выхода из файла сценария, она отлично работает со встроенными сценариями. Вы можете сообщить об этой проблеме команде разработчиков Microsoft. Надеюсь, они скоро предоставят исправление.

Однако вы можете использовать любое из приведенных ниже обходных путей, чтобы исправить это.

1, Используйте [Environment]::Exit($exitCode) вместо exit . Смотрите ниже:

 if ($exitCode -ne 0)
{
    Write-Output ("[Error] Failing task since return code was {0} while expected 0." -f $exitCode)
}
[Environment]::Exit($exitCode)
  

2, Используйте команду ведения журнала ##vso[task.complete result=Failed;]Failed , чтобы вручную завершить выполнение задачи, если код выхода не равен 0. Смотрите ниже:

 if ($exitCode -ne 0)
{
    Write-Output ("[Error] Failing task since return code was {0} while expected 0." -f $exitCode)
    Write-Host "##vso[task.complete result=Failed;]Failed"
}
exit $exitCode
  

Комментарии:

1. Спасибо за ответ, я попробую эти предложения, как только у меня появится такая возможность.

2. Привет, @DavidGard, У тебя была возможность попробовать вышеуказанный вариант. Как все прошло?

3. Протестировано только что, и первый вариант, похоже, справляется с задачей. Я добавлю дополнительный комментарий, если я столкнусь с какими-либо проблемами, когда вернусь в офис на следующей неделе. Спасибо.

Ответ №2:

Поскольку решение напрямую не сработало для меня, я немного улучшил это и использую Write-Error вместо Write-Host .

 if ($exitCode -ne 0) {
  Write-Error ("[Error] Failing task since return code was {0} while expected 0." -f $exitCode)
}
  

В сочетании с failOnStderr вы получите то, что вам нужно.

 - task: PowerShell@2
  displayName: check stuff
  inputs:
    failOnStderr: true
    targetType: 'inline'
    script: |
      do_some_thing
      if ($exitCode -ne 0) {
        Write-Error ("[Error] Failing task since return code was {0} while expected 0." -f $exitCode)
      }