modules/analyzer/functions.psm1
function Build-Report { param( [Parameter(mandatory)] [psobject]$Analyzer_Data ) Write-Output " ###############################" Write-Output " ## PSScriptAnalyzer Report ##" Write-Output " ###############################" Write-Output " " $return = [psobject]@(); $c1 = 1 ForEach ($Item in ($Analyzer_Data)) { $data = Get-Content "$($Item.path)" $path = ($Item.path).split("/") $real_path = ($path[5..($path.count)]) -join '/' $file = "($($c1)/$($Analyzer_Data.Count)) File: $real_path`n" $c2 = 0; $cc = 1; $wc = $Item.line.count foreach ($Rule in (1..$wc)) { $file += " `n" $file += " ($cc/$wc) Rule: $($Item.rule[$c2])`n" $file += " Severity: $($Item.severity[$c2])`n" $file += " Extent: $($Item.extent[$c2])`n" $file += " Line: $($Item.line[$c2])`n" $file += " Text: $(($data[$($Item.line[$c2] - 1)]).trim())`n" $file += " Message: $($Item.message[$c2])" $file += " `n" $c2++; $cc++ if ($c2 -eq $wc) { break } } $return += "$file"; $c1++ } return $return } function Start-PSAnalyzer { param( [System.IO.FileInfo]$scan_path = "$ENV:CI_PROJECT_DIR", [string[]]$additional_rules, [switch]$test ) # collect rules $rules = (Import-LocalizedData -FileName "standard-rules.psd1").DefaultRules if ($additional_rules) { $rules += $additional_rules } # execute PSScriptAnalyzer $scriptanalyzer = Invoke-ScriptAnalyzer "$($scan_path.FullName)" -Recurse -IncludeRule $rules | Where-Object {$_.severity -ne 'ParseError'} $jcce = [PSCustomObject]@{ scriptanalyzer = [PSCustomObject]@() } # Create File Properties $files = $scriptanalyzer.ScriptPath | Select-Object -Unique foreach ($file in $files) { $jcce.scriptanalyzer += [PSCustomObject][Ordered]@{ path = "$file" name = @() extent = @() line = @() rule = @() severity = @() message = @() } } # Add $scriptanalyzer to policy file foreach ($file in ($scriptanalyzer | Sort-Object Line)) { $temp = $jcce.scriptanalyzer | Where-Object { $_.path -eq "$($file.ScriptPath)" } $temp.name += $file.ScriptName $temp.extent += $file.Extent $temp.line += $file.Line $temp.rule += $file.RuleName $temp.severity += $file.Severity $temp.message += $file.Message } # create report for pipeline log $report = Build-Report -Analyzer_Data $jcce.scriptanalyzer # test $warnings = ($jcce.scriptanalyzer.severity | Where-Object {$_ -ne 'Information'}).count # return results if ($warnings -gt 0) { Write-Output "$report" Write-Output " " # if test tell runner to continue if ($test) { return 0 } else { return 1 } } else { Write-Output "Found No Issues In Code`n" Write-Output " " return 0 } } |