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.
159 lines
8.0 KiB
PowerShell
159 lines
8.0 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
Exportiert SonarQube Metriken fuer alle pathOS Projekte
|
|
#>
|
|
|
|
$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 Export - pathOS"
|
|
Write-Host " URL: $SonarUrl"
|
|
Write-Host "============================================================"
|
|
Write-Host ""
|
|
Write-Host " Token erstellen: $SonarUrl/account/security"
|
|
Write-Host ""
|
|
|
|
$SonarToken = Read-Host "SonarQube Token"
|
|
$SonarAuth = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("${SonarToken}:"))
|
|
$SonarHeaders = @{ "Authorization" = "Basic $SonarAuth" }
|
|
|
|
New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null
|
|
|
|
# Test Authentifizierung
|
|
Write-Host ">> Teste Authentifizierung..." -NoNewline
|
|
try {
|
|
$AuthTest = Invoke-WebRequest -Uri "$SonarUrl/api/authentication/validate" -Headers $SonarHeaders -UseBasicParsing -ErrorAction Stop
|
|
$AuthData = $AuthTest.Content | ConvertFrom-Json
|
|
if ($AuthData.valid) {
|
|
Write-Host " OK (authentifiziert)" -ForegroundColor Green
|
|
} else {
|
|
Write-Host " Token ungueltig!" -ForegroundColor Red
|
|
Write-Host " Bitte Token unter $SonarUrl/account/security neu generieren."
|
|
Write-Host " Token-Typ: 'User Token' (nicht 'Project Token')"
|
|
exit 1
|
|
}
|
|
} catch {
|
|
Write-Host " FEHLER: $($_.Exception.Message)" -ForegroundColor Red
|
|
Write-Host " Versuche ohne Auth (falls anonymer Zugriff erlaubt)..."
|
|
$SonarHeaders = @{}
|
|
}
|
|
|
|
# Projekte laden - verschiedene Endpunkte probieren
|
|
Write-Host ">> Lade Projekte..." -NoNewline
|
|
$Projects = @()
|
|
$Page = 1
|
|
|
|
# Versuch 1: projects/search (braucht Admin oder Browse-Rechte)
|
|
try {
|
|
$R = Invoke-WebRequest -Uri "$SonarUrl/api/projects/search?ps=100&p=1" -Headers $SonarHeaders -UseBasicParsing -ErrorAction Stop
|
|
$Data = $R.Content | ConvertFrom-Json
|
|
$Projects += $Data.components
|
|
Write-Host " OK (projects/search)" -ForegroundColor Green
|
|
# Rest laden
|
|
while ($Projects.Count -lt $Data.paging.total) {
|
|
$Page++
|
|
$R = Invoke-WebRequest -Uri "$SonarUrl/api/projects/search?ps=100&p=$Page" -Headers $SonarHeaders -UseBasicParsing -ErrorAction Stop
|
|
$Data = $R.Content | ConvertFrom-Json
|
|
$Projects += $Data.components
|
|
}
|
|
} catch {
|
|
Write-Host " 403 auf projects/search, versuche components/search..." -ForegroundColor Yellow
|
|
# Versuch 2: components/search_projects
|
|
try {
|
|
$R = Invoke-WebRequest -Uri "$SonarUrl/api/components/search_projects?ps=100&p=1" -Headers $SonarHeaders -UseBasicParsing -ErrorAction Stop
|
|
$Data = $R.Content | ConvertFrom-Json
|
|
$Projects += $Data.components
|
|
Write-Host " OK (components/search_projects)" -ForegroundColor Green
|
|
while ($Projects.Count -lt $Data.paging.total) {
|
|
$Page++
|
|
$R = Invoke-WebRequest -Uri "$SonarUrl/api/components/search_projects?ps=100&p=$Page" -Headers $SonarHeaders -UseBasicParsing -ErrorAction Stop
|
|
$Data = $R.Content | ConvertFrom-Json
|
|
$Projects += $Data.components
|
|
}
|
|
} catch {
|
|
Write-Host " Auch 403. Versuche components/search..." -ForegroundColor Yellow
|
|
# Versuch 3: components/search mit Qualifier TRK
|
|
try {
|
|
$R = Invoke-WebRequest -Uri "$SonarUrl/api/components/search?qualifiers=TRK&ps=100&p=1" -Headers $SonarHeaders -UseBasicParsing -ErrorAction Stop
|
|
$Data = $R.Content | ConvertFrom-Json
|
|
$Projects += $Data.components
|
|
Write-Host " OK (components/search)" -ForegroundColor Green
|
|
while ($Projects.Count -lt $Data.paging.total) {
|
|
$Page++
|
|
$R = Invoke-WebRequest -Uri "$SonarUrl/api/components/search?qualifiers=TRK&ps=100&p=$Page" -Headers $SonarHeaders -UseBasicParsing -ErrorAction Stop
|
|
$Data = $R.Content | ConvertFrom-Json
|
|
$Projects += $Data.components
|
|
}
|
|
} catch {
|
|
Write-Host ""
|
|
Write-Host " Alle Endpunkte geben 403." -ForegroundColor Red
|
|
Write-Host " Dein Account ist authentifiziert aber hat keine Projekt-Browse-Rechte ueber die API." -ForegroundColor Red
|
|
Write-Host " Loesung: Bitte im OPs-Team anfragen, dich zur SonarQube-Gruppe 'bestellsystem1' hinzuzufuegen." -ForegroundColor Yellow
|
|
Write-Host " Alternativ: Bekannte Projekt-Keys direkt abfragen (siehe unten)." -ForegroundColor Yellow
|
|
|
|
# Fallback: Bekannte Projekte direkt abfragen
|
|
Write-Host ""
|
|
Write-Host ">> Fallback: Bekannte Projekte direkt abfragen..." -ForegroundColor Yellow
|
|
$KnownKeys = @(
|
|
"steuerung-vertrieb", "auftrags-verwaltung-trasse", "portal-middleware", "portal-ui",
|
|
"common-interface", "stammdaten-bereitstellung", "kundendaten-bereitstellung",
|
|
"ifp-connector", "taftap-tdm-konverter", "vertragsdaten-verteiler",
|
|
"archivierungsservice", "rabattnummern-bereitstellung", "tbv-absicherung-konverter"
|
|
)
|
|
foreach ($Key in $KnownKeys) {
|
|
$Projects += [PSCustomObject]@{ key = $Key; name = $Key }
|
|
}
|
|
Write-Host " $($Projects.Count) bekannte Projekte" -ForegroundColor Green
|
|
}
|
|
}
|
|
}
|
|
Write-Host " $($Projects.Count) Projekte" -ForegroundColor Green
|
|
|
|
# Metriken pro Projekt
|
|
Write-Host ">> Lade Metriken..."
|
|
$Metrics = "ncloc,bugs,vulnerabilities,code_smells,coverage,duplicated_lines_density,sqale_rating,reliability_rating,security_rating,alert_status"
|
|
$Results = @()
|
|
|
|
foreach ($P in $Projects) {
|
|
Write-Host " $($P.key)..." -NoNewline
|
|
try {
|
|
$R = Invoke-WebRequest -Uri "$SonarUrl/api/measures/component?component=$($P.key)&metricKeys=$Metrics" -Headers $SonarHeaders -UseBasicParsing -ErrorAction Stop
|
|
$MData = ($R.Content | ConvertFrom-Json).component.measures
|
|
$Results += [PSCustomObject]@{
|
|
Project = $P.key
|
|
Name = $P.name
|
|
Lines = ($MData | Where-Object { $_.metric -eq "ncloc" }).value
|
|
Bugs = ($MData | Where-Object { $_.metric -eq "bugs" }).value
|
|
Vulnerabilities = ($MData | Where-Object { $_.metric -eq "vulnerabilities" }).value
|
|
CodeSmells = ($MData | Where-Object { $_.metric -eq "code_smells" }).value
|
|
Coverage = ($MData | Where-Object { $_.metric -eq "coverage" }).value
|
|
Duplications = ($MData | Where-Object { $_.metric -eq "duplicated_lines_density" }).value
|
|
Maintainability = ($MData | Where-Object { $_.metric -eq "sqale_rating" }).value
|
|
Reliability = ($MData | Where-Object { $_.metric -eq "reliability_rating" }).value
|
|
Security = ($MData | Where-Object { $_.metric -eq "security_rating" }).value
|
|
QualityGate = ($MData | Where-Object { $_.metric -eq "alert_status" }).value
|
|
}
|
|
Write-Host " OK" -ForegroundColor Green
|
|
} catch { Write-Host " Fehler" -ForegroundColor Yellow }
|
|
}
|
|
|
|
# Speichern
|
|
$Results | Export-Csv "$OutputDir\sonarqube-metrics.csv" -Delimiter ";" -Encoding UTF8 -NoTypeInformation
|
|
$Results | ConvertTo-Json -Depth 5 | Out-File "$OutputDir\sonarqube-metrics.json" -Encoding UTF8
|
|
|
|
$Md = @("# SonarQube Metriken pathOS", "", "| Projekt | Lines | Bugs | Vulns | Smells | Coverage | Dupl% | QGate |")
|
|
$Md += "|---------|-------|------|-------|--------|----------|-------|-------|"
|
|
foreach ($R in ($Results | Sort-Object { if ($_.Lines) { [int]$_.Lines } else { 0 } } -Descending)) {
|
|
$Md += "| $($R.Name) | $($R.Lines) | $($R.Bugs) | $($R.Vulnerabilities) | $($R.CodeSmells) | $($R.Coverage)% | $($R.Duplications)% | $($R.QualityGate) |"
|
|
}
|
|
$Md -join "`n" | Out-File "$OutputDir\sonarqube-metrics.md" -Encoding UTF8
|
|
|
|
Write-Host ""
|
|
Write-Host "============================================================" -ForegroundColor Green
|
|
Write-Host " FERTIG! $($Results.Count) Projekte" -ForegroundColor Green
|
|
Write-Host " Ergebnisse in $OutputDir" -ForegroundColor Green
|
|
Write-Host "============================================================" -ForegroundColor Green
|