mirror of
https://github.com/PowerShell/PowerShell
synced 2026-06-08 12:12:50 +00:00
Add GitHub Actions annotations for Pester test failures (#26789)
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: TravisEz13 <10873629+TravisEz13@users.noreply.github.com> Co-authored-by: Travis Plunk <travis.plunk@microsoft.com>
This commit is contained in:
co-authored by
TravisEz13
Travis Plunk
parent
2e26e4b690
commit
4db414ca33
@@ -24,6 +24,7 @@ $testIgnoredCount = 0
|
||||
$testSkippedCount = 0
|
||||
$testInvalidCount = 0
|
||||
|
||||
# Process test results and generate annotations for failures
|
||||
Get-ChildItem -Path "${TestResultsFolder}/*.xml" -Recurse | ForEach-Object {
|
||||
$results = [xml] (get-content $_.FullName)
|
||||
|
||||
@@ -35,6 +36,61 @@ Get-ChildItem -Path "${TestResultsFolder}/*.xml" -Recurse | ForEach-Object {
|
||||
$testIgnoredCount += [int]$results.'test-results'.ignored
|
||||
$testSkippedCount += [int]$results.'test-results'.skipped
|
||||
$testInvalidCount += [int]$results.'test-results'.invalid
|
||||
|
||||
# Generate GitHub Actions annotations for test failures
|
||||
# Select failed test cases
|
||||
if ("System.Xml.XmlDocumentXPathExtensions" -as [Type]) {
|
||||
$failures = [System.Xml.XmlDocumentXPathExtensions]::SelectNodes($results.'test-results', './/test-case[@result = "Failure"]')
|
||||
}
|
||||
else {
|
||||
$failures = $results.SelectNodes('.//test-case[@result = "Failure"]')
|
||||
}
|
||||
|
||||
foreach ($testfail in $failures) {
|
||||
$description = $testfail.description
|
||||
$testName = $testfail.name
|
||||
$message = $testfail.failure.message
|
||||
$stack_trace = $testfail.failure.'stack-trace'
|
||||
|
||||
# Parse stack trace to get file and line info
|
||||
$fileInfo = Get-PesterFailureFileInfo -StackTraceString $stack_trace
|
||||
|
||||
if ($fileInfo.File) {
|
||||
# Convert absolute path to relative path for GitHub Actions
|
||||
$filePath = $fileInfo.File
|
||||
|
||||
# GitHub Actions expects paths relative to the workspace root
|
||||
if ($env:GITHUB_WORKSPACE) {
|
||||
$workspacePath = $env:GITHUB_WORKSPACE
|
||||
if ($filePath.StartsWith($workspacePath)) {
|
||||
$filePath = $filePath.Substring($workspacePath.Length).TrimStart('/', '\')
|
||||
# Normalize to forward slashes for consistency
|
||||
$filePath = $filePath -replace '\\', '/'
|
||||
}
|
||||
}
|
||||
|
||||
# Create annotation title
|
||||
$annotationTitle = "Test Failure: $description / $testName"
|
||||
|
||||
# Build the annotation message
|
||||
$annotationMessage = $message -replace "`n", "%0A" -replace "`r"
|
||||
|
||||
# Build and output the workflow command
|
||||
$workflowCommand = "::error file=$filePath"
|
||||
if ($fileInfo.Line) {
|
||||
$workflowCommand += ",line=$($fileInfo.Line)"
|
||||
}
|
||||
$workflowCommand += ",title=$annotationTitle::$annotationMessage"
|
||||
|
||||
Write-Host $workflowCommand
|
||||
|
||||
# Output a link to the test run
|
||||
if ($env:GITHUB_SERVER_URL -and $env:GITHUB_REPOSITORY -and $env:GITHUB_RUN_ID) {
|
||||
$logUrl = "$($env:GITHUB_SERVER_URL)/$($env:GITHUB_REPOSITORY)/actions/runs/$($env:GITHUB_RUN_ID)"
|
||||
Write-Host "Test logs: $logUrl"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@"
|
||||
|
||||
Reference in New Issue
Block a user