I have a classic build pipeline (not yaml, yet!) with three tasks
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?
SilentlyContinue
-> results in WarningContinue on Error
-> results in WarningIgnore $LASTEXITCODE
-> results in FailureFail on Standard Error
-> results in FailureOh 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 Pester it "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"