Consider following scripted pipeline:
node ('windows') { stage ("stage 1") { powershell ''' & C:\\Temp\\test.ps1 ''' } stage ("stage 2") { echo "stage 2" } }
Contents of the test.ps1 is following:
param ($param1)
$ErrorActionPreference = "Stop"
Set-StrictMode -Version Latest
Write-Host $undefVar
The script is specifically designed to fail on trying to access undefined variable. This scenario is working correctly, Jenkins detects that PowerShell script returned something other than 0 exit code and fails pipeline execution.
However! If the script to be changed this way (only line 1 has changed):
param ([Parameter(Mandatory=$false)] $param1) $ErrorActionPreference = "Stop" Set-StrictMode -Version Latest Write-Host $undefVar
Then the script fails exactly the same way, but Jenkins fails to detect this failure and proceeds to execute stage 2.
Invoking both versions of the PowerShell script manually shows that in both cases powershell process exit code is 1. I fail to understand how adding parameter attribute to PowerShell script affects Jenkins ability to detect script outcome.