Files
Orchestrator/bahn/project-audit/scripts/sonarqube-smells-detail.ps1
ankn a5f8fb49ab Migrate all repos into monorepo context folders
Bahn: aisupport, Analyse-O2C-C2S, awesome-bahn-mcp-servers, beam-mcp,
      Confluence_Bot, db-planet-mcp-server, O2C-Harness, project-audit,
      Projekt-KIQ-HP, teamlandkarte-mcp
Dhive: Jury-Voting
Privat: CV, NoteGraph (NOTE: NoteGraph needs complete redo after consolidation)
Shared: AI-Orchestrator, OrgMyLife, power_skills_and_more
Shared/references: symphony (read-only)

Bahn repos remain available as independent remotes - this monorepo
pulls them in via subtree, the originals are untouched.
2026-06-30 20:39:52 +02:00

121 lines
5.2 KiB
PowerShell

<#
.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