I have a classic build pipeline (not yaml, yet!) with three tasks
- Install Pester -> works as expected
- Run Pester tests -> always fails!
- Publish test results -> works as expected
My script for "Run Pester tests"
Import-Module Pester -Force
$config = [PesterConfiguration]::Default
$config.TestResult.Enabled = $true
$config.TestResult.OutputFormat = "NUnitXml"
$config.TestResult.OutputPath = "$env:SYSTEM_DEFAULTWORKINGDIRECTORY\TEST-results.xml"
$config.Run.Path = ".\my\path*"
$config.Run.PassThru = $true
$results = Invoke-Pester -Configuration $config
if($results.Result -eq "Passed")
{
Write-host "All tests passed"
Write-Host "##vso[task.complete result=Succeeded;]DONE"
exit 0
}
Sample output in Azure DevOps is
Tests completed in 11.43s
Tests Passed: 67, Failed: 0, Skipped: 0 NotRun: 0
All tests passed
Finishing: Run Pester Unit Tests
However, the task always fails
I know from robocopy that Powershell Tasks in Azure will check $LASTEXITCODE and that you are able to overwrite that via Write-Host "##vso[task.complete result=Succeeded;]DONE" and exit 0. Why is this not working here?
What else have I tried?
- Activate
SilentlyContinue-> results in Warning - Activate
Continue on Error-> results in Warning - Activate
Ignore $LASTEXITCODE-> results in Failure - Activate
Fail on Standard Error-> results in Failure

Oh boy this was a tough one: The comment by Shayki Abramczyk enabled me to track it down. Is it possible to grant him the bounty somehow?
The cause was a unit test, that was changing the Azure DevOps task output via
Write-Host "##vso[task.complete result=Failed;]DONE". Since my Powershell scripts are supposed to work in Azure DevOps, they should do things like this. The test was named nicely for Pesterit "Should print out error if build requirement not found"My learning here
Write-Host "##vso[task.complete result=Failed;]DONE"Write-Host "##vso[task.complete result=Succeeded;]DONE"