Public/ConvertTo-ADOLogFormat.ps1
|
function ConvertTo-ADOLogFormat { <# .SYNOPSIS Convert code review violations to Azure DevOps logging commands .DESCRIPTION Transforms violation objects into Azure DevOps logging commands that appear as warnings/errors in the pipeline results and are linked to specific files/lines. .PARAMETER Violations Array of violation objects with file, line, severity, and message properties .PARAMETER SeverityFailBuild Severity level that should fail the build (error, warning, none). Default: error .EXAMPLE $violations | ConvertTo-ADOLogFormat Output violations as Azure DevOps logging commands .EXAMPLE ConvertTo-ADOLogFormat -Violations $violations -SeverityFailBuild "warning" Fail build on warnings or errors .OUTPUTS System.Int32 - Error count (0 if success, >0 if should fail) .NOTES Author: waldo Version: 1.0.0 #> [CmdletBinding()] param( [Parameter(Mandatory = $true, ValueFromPipeline = $true)] [AllowEmptyCollection()] [array]$Violations, [Parameter(Mandatory = $false)] [ValidateSet('error', 'warning', 'none')] [string]$SeverityFailBuild = 'error' ) begin { Write-Verbose "Starting $($MyInvocation.MyCommand.Name)" $allViolations = @() } process { try { $allViolations += $Violations } catch { Write-Error "Error in $($MyInvocation.MyCommand.Name): $_" throw } } end { try { Write-Host "`n=========================================" Write-Host "AI Code Review Results" Write-Host "=========================================`n" if ($allViolations.Count -eq 0) { Write-Host "✅ No violations found! Code looks good." Write-Host "" Write-Host "##vso[build.addbuildtag]AI-Review-Passed" return 0 } # Count by severity $errorCount = ($allViolations | Where-Object { $_.severity -eq 'error' }).Count $warningCount = ($allViolations | Where-Object { $_.severity -eq 'warning' }).Count $infoCount = ($allViolations | Where-Object { $_.severity -eq 'info' }).Count Write-Host "Summary:" Write-Host " Errors: $errorCount" Write-Host " Warnings: $warningCount" Write-Host " Info: $infoCount" Write-Host "" # Group by file $violationsByFile = $allViolations | Group-Object -Property file foreach ($fileGroup in $violationsByFile) { Write-Host "File: $($fileGroup.Name)" Write-Host "----------------------------------------" foreach ($violation in ($fileGroup.Group | Sort-Object -Property line)) { $emoji = switch ($violation.severity) { 'error' { '❌' } 'warning' { '⚠️' } 'info' { 'ℹ️' } } Write-Host " $emoji Line $($violation.line): $($violation.message)" if ($violation.suggestion) { Write-Host " 💡 Suggestion: $($violation.suggestion)" } # Output Azure DevOps logging command $issueType = if ($violation.severity -eq 'info') { 'warning' } else { $violation.severity } $adoMessage = "##vso[task.logissue type=$issueType;sourcepath=$($violation.file);linenumber=$($violation.line)]$($violation.message)" Write-Host $adoMessage } Write-Host "" } # Determine if build should fail $shouldFail = switch ($SeverityFailBuild) { 'error' { $errorCount -gt 0 } 'warning' { ($errorCount + $warningCount) -gt 0 } 'none' { $false } } if ($shouldFail) { Write-Host "❌ Build will FAIL due to violations (severity threshold: $SeverityFailBuild)" Write-Host " Fix the issues above and push changes." Write-Host "" Write-Host "##vso[task.complete result=Failed;]Code review found blocking violations" Write-Host "##vso[build.addbuildtag]AI-Review-Failed" } else { Write-Host "✅ Build will CONTINUE despite violations (severity threshold: $SeverityFailBuild)" Write-Host "" Write-Host "##vso[build.addbuildtag]AI-Review-Passed-With-Warnings" } Write-Host "=========================================" return $errorCount } catch { Write-Error "Error in $($MyInvocation.MyCommand.Name): $_" throw } finally { Write-Verbose "Completed $($MyInvocation.MyCommand.Name)" } } } |