debugMinor
How do fail a Packer pipeline upon powershell provisioner pester test failure?
Viewed 0 times
packeruponprovisionerpowershellpesterfailtesthowfailurepipeline
Problem
I'm building a packer pipeline and having an issue in getting the failure of a powershell provisioner step to fail the packer job itself. This is important as without failing the Packer job, the AMI would be published, despite the test failure.
How I'm proceeding:
However, even with issue count being > 0 it is not causing the pipeline to fail. Additionally some errors thrown in other provisioner steps also fail to cause the Packer job to stop. I've set
Here's part of the provisioning workflow for packer.
``
How I'm proceeding:
- Run provisioning setup steps
- Copy Pester Script to Remote machine
- Invoke inline powershell statement to
Invoke-Pester
- Download the test results from the Pester remote run
- Next provisioning step parses the file to count errors and throws error upon issue count > 0
However, even with issue count being > 0 it is not causing the pipeline to fail. Additionally some errors thrown in other provisioner steps also fail to cause the Packer job to stop. I've set
$ErrorActionPreference = 'Stop' on one of them and it didn't seem to make any difference.Here's part of the provisioning workflow for packer.
``
... {
"type": "file",
"source": "{{ template_dir }}/tests/windows-server.tests.ps1",
"destination": "{{ user TEMP_DIRECTORY }}/"
},
{
"type": "powershell",
"environment_vars": [
"TEMP_DIRECTORY={{ user TEMP_DIRECTORY }}/"
],
"inline": [
"if(-not (Get-InstalledModule Pester -MinimumVersion 4.10.1)){ Install-Module Pester -Scope AllUsers -AllowClobber -Force -verbose} ",
"Import-Module Pester -MinimumVersion 4.10.1 -Force -DisableNameChecking",
"$null = New-Item -Path $ENV:TEMP_DIRECTORY -ItemType Directory -Force -ErrorAction SilentlyContinue",
"$testresult = Invoke-Pester -Script (Join-Path $ENV:TEMP_DIRECTORY 'windows-server.tests.ps1') -OutputFile (Join-Path $ENV:TEMP_DIRECTORY 'TEST-pester-results.xml') -OutputFormat 'NUnitXML' -PassThru"
]
},
{
"type": "file",
"direction": "download",
"source": "{{ user TEMP_DIRECTORY` }}/TEST-pester-resulSolution
After resolving some syntax issues, I found the true cause of failing to throw the error.
In my prior usage I was doing this through Inspec provisioner, which handled the exit codes.
If you are using Pester and having to do the workaround I described above, then to ensure error's in a step are thrown you need to throw an exit code other than 0.
The two steps I took that seem to work fine (I like some emoji fire in my logs )
Note that you will want to make sure your Azure DevOps Pipeline has the following settings to publish test results regardless of failing:
In my prior usage I was doing this through Inspec provisioner, which handled the exit codes.
If you are using Pester and having to do the workaround I described above, then to ensure error's in a step are thrown you need to throw an exit code other than 0.
The two steps I took that seem to work fine (I like some emoji fire in my logs )
$ErrorActionPreference = 'Stop'
try
{
# Do code here
}
catch
{
Write-Error " Failed to do something important `$TestFile: $TestFile"
exit 1 # packer will recognize failure at this point
}Note that you will want to make sure your Azure DevOps Pipeline has the following settings to publish test results regardless of failing:
# ℹ Using Invoke-Build to call Packer. You can do this with a packer extension or any other way you prefer
- task: PowerShell@2
displayName: Run Packer Configuration
inputs:
filePath: build/build.ps1
arguments: '-Task PackerBuild -Configuration $(Configuration)'
errorActionPreference: 'Continue'
pwsh: true
continueOnError: true #I want to publish the test results regardless
- task: PublishTestResults@2
displayName: Publish Pester Tests
inputs:
testResultsFormat: 'NUnit'
testResultsFiles: '**/TEST-*.xml'
condition: succeededOrFailed()
Code Snippets
$ErrorActionPreference = 'Stop'
try
{
# Do code here
}
catch
{
Write-Error " Failed to do something important `$TestFile: $TestFile"
exit 1 # packer will recognize failure at this point
}Context
StackExchange DevOps Q#11050, answer score: 4
Revisions (0)
No revisions yet.