<# .SYNOPSIS Exportiert Top Code Smells pro Komponente aus SonarQube #> $SonarUrl = "https://sonarqube.build.bsz-dev.cnp-test.comp.db.de" $OutputDir = "project-audit\data\sonarqube" [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 Write-Host "============================================================" Write-Host " SonarQube Smells Detail-Analyse" Write-Host "============================================================" $SonarToken = Read-Host "SonarQube Token" $SonarAuth = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("${SonarToken}:")) $SonarHeaders = @{ "Authorization" = "Basic $SonarAuth" } # Kern-Projekte (Master/Main Branch Keys) $Projects = @( @{ key = "steuerung-vertrieb-master"; name = "Steuerung Vertrieb"; team = "CIB" } @{ key = "portal-ui-master"; name = "Portal UI"; team = "404" } @{ key = "portal-middleware-master"; name = "Portal Middleware"; team = "404" } @{ key = "auftrags-verwaltung-trasse-master"; name = "Auftrags-Verwaltung"; team = "CIB" } @{ key = "common-interface-master"; name = "Common Interface"; team = "Zero" } @{ key = "taftap-tdm-konverter-main"; name = "TAF/TAP TDM Konverter"; team = "Zero" } @{ key = "archivierungsservice-master"; name = "Archivierungsservice"; team = "CIB" } @{ key = "stammdaten-bereitstellung-master"; name = "Stammdaten-Bereitstellung"; team = "Zero" } @{ key = "tadef-connector-main"; name = "TADEF Connector"; team = "Zero" } @{ key = "camunda-backup-wizard-main"; name = "Camunda Backup Wizard"; team = "CIB" } ) $AllSmells = @() foreach ($P in $Projects) { Write-Host "" Write-Host ">> $($P.name) ($($P.team))..." -ForegroundColor Yellow # Issues mit Typ CODE_SMELL laden $Issues = @() $Page = 1 do { try { $Uri = "$SonarUrl/api/issues/search?componentKeys=$($P.key)&types=CODE_SMELL&statuses=OPEN,CONFIRMED&ps=100&p=$Page&facets=rules" $R = Invoke-WebRequest -Uri $Uri -Headers $SonarHeaders -UseBasicParsing -ErrorAction Stop $Data = $R.Content | ConvertFrom-Json $Issues += $Data.issues if ($Page -eq 1 -and $Data.facets) { # Rule-Facetten extrahieren (Top Smells nach Haeufigkeit) $RuleFacet = $Data.facets | Where-Object { $_.property -eq "rules" } if ($RuleFacet) { Write-Host " $($Data.total) Smells, Top Rules:" $TopRules = $RuleFacet.values | Sort-Object count -Descending | Select-Object -First 15 foreach ($Rule in $TopRules) { $AllSmells += [PSCustomObject]@{ Project = $P.name Team = $P.team Rule = $Rule.val Count = $Rule.count } Write-Host " $($Rule.val): $($Rule.count)" } } } $Page++ } catch { Write-Host " FEHLER: $($_.Exception.Message)" -ForegroundColor Red break } } while ($Issues.Count -lt [Math]::Min($Data.total, 500) -and $Page -le 5) } # Speichern $AllSmells | Export-Csv "$OutputDir\smells-by-rule.csv" -Delimiter ";" -Encoding UTF8 -NoTypeInformation # Cross-Projekt Analyse: Gleiche Rules ueber Projekte Write-Host "" Write-Host "=== Cross-Projekt Analyse ===" -ForegroundColor Yellow $ByRule = $AllSmells | Group-Object Rule $CrossProject = $ByRule | Where-Object { $_.Count -gt 1 } | Sort-Object { ($_.Group | Measure-Object -Property Count -Sum).Sum } -Descending Write-Host "" Write-Host "Rules die in mehreren Projekten auftreten:" foreach ($R in $CrossProject | Select-Object -First 20) { $TotalCount = ($R.Group | Measure-Object -Property Count -Sum).Sum $ProjectList = ($R.Group | ForEach-Object { "$($_.Project)($($_.Count))" }) -join ", " Write-Host " $($R.Name): $TotalCount total [$ProjectList]" } # Markdown $Md = @("# SonarQube Smells Detail-Analyse", "") $Md += "## Top Smells pro Komponente" $Md += "" foreach ($P in $Projects) { $PSmells = $AllSmells | Where-Object { $_.Project -eq $P.name } | Sort-Object Count -Descending if ($PSmells.Count -eq 0) { continue } $Md += "### $($P.name) ($($P.team))" $Md += "| Rule | Count |" $Md += "|------|-------|" foreach ($S in $PSmells | Select-Object -First 10) { $Md += "| $($S.Rule) | $($S.Count) |" } $Md += "" } $Md += "## Cross-Projekt: Gleiche Rules" $Md += "| Rule | Total | Projekte |" $Md += "|------|-------|----------|" foreach ($R in $CrossProject | Select-Object -First 20) { $TotalCount = ($R.Group | Measure-Object -Property Count -Sum).Sum $ProjectList = ($R.Group | ForEach-Object { "$($_.Project)($($_.Count))" }) -join ", " $Md += "| $($R.Name) | $TotalCount | $ProjectList |" } $Md -join "`n" | Out-File "$OutputDir\smells-detail.md" -Encoding UTF8 Write-Host "" Write-Host "============================================================" -ForegroundColor Green Write-Host " FERTIG! Ergebnisse in $OutputDir" -ForegroundColor Green Write-Host "============================================================" -ForegroundColor Green