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.
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
<#
|
||||
.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
|
||||
Reference in New Issue
Block a user