<# .SYNOPSIS Publiziert eine APK auf den Bollwerk VPS. .DESCRIPTION Lädt die APK auf den VPS hoch, aktualisiert die Version in der docker-compose.yml und startet den Server-Container neu. .PARAMETER VersionCode Neuer versionCode (Integer, muss > aktueller sein). .PARAMETER VersionName Neuer versionName (z.B. "1.3"). .PARAMETER ApkPath Pfad zur APK-Datei. Default: app/build/outputs/apk/debug/app-debug.apk .PARAMETER SkipVerify Verifizierung nach dem Deploy überspringen. #> param( [Parameter(Mandatory)] [int] $VersionCode, [Parameter(Mandatory)] [string] $VersionName, [string] $ApkPath = "app/build/outputs/apk/debug/app-debug.apk", [switch] $SkipVerify ) $ErrorActionPreference = "Stop" $VPS = "root@195.246.231.210" $RemoteDir = "/opt/bollwerk" # --- Preflight --- Write-Host "=== Publish APK v$VersionName (build $VersionCode) ===" -ForegroundColor Cyan if (-not (Test-Path $ApkPath)) { Write-Error "APK nicht gefunden: $ApkPath - bitte zuerst './gradlew assembleDebug' ausfuehren." exit 1 } # SSH-Agent prüfen $sshKeys = ssh-add -l 2>&1 if ($LASTEXITCODE -ne 0) { Write-Error "SSH-Agent hat keinen Key geladen. Bitte 'ssh-add' ausfuehren." exit 1 } Write-Host "[OK] SSH-Agent aktiv" -ForegroundColor Green # --- Schritt 1: APK hochladen --- Write-Host "`n[1/4] APK hochladen..." -ForegroundColor Yellow ssh $VPS "mkdir -p $RemoteDir/data" scp $ApkPath "${VPS}:${RemoteDir}/data/app-latest.apk" if ($LASTEXITCODE -ne 0) { Write-Error "APK-Upload fehlgeschlagen."; exit 1 } Write-Host "[OK] APK hochgeladen" -ForegroundColor Green # --- Schritt 2: Version in docker-compose.yml aktualisieren --- Write-Host "`n[2/4] Version in docker-compose.yml aktualisieren..." -ForegroundColor Yellow # Prüfen ob Env-Vars bereits vorhanden sind (bash-Syntax in einfachen Anführungszeichen) $checkCmd = 'grep -c "BOLLWERK_APP_VERSION_CODE" ' + $RemoteDir + '/docker-compose.yml 2>/dev/null || echo 0' $checkResult = ssh $VPS $checkCmd # SSH kann Array zurückgeben (z.B. Banner + Ergebnis) - letzte Zeile nehmen if ($checkResult -is [array]) { $checkResult = $checkResult[-1] } $hasVersionCode = [int]($checkResult.Trim()) if ($hasVersionCode -gt 0) { # Update bestehende Einträge $sedCmd = "cd $RemoteDir; sed -i 's/BOLLWERK_APP_VERSION_CODE=.*/BOLLWERK_APP_VERSION_CODE=$VersionCode/' docker-compose.yml; sed -i 's/BOLLWERK_APP_VERSION_NAME=.*/BOLLWERK_APP_VERSION_NAME=$VersionName/' docker-compose.yml" ssh $VPS $sedCmd } else { # Erstmalig hinzufügen (nach JWT_SECRET-Zeile) $addCmd = "cd $RemoteDir; sed -i '/BOLLWERK_JWT_SECRET/a\ - BOLLWERK_APP_VERSION_CODE=$VersionCode' docker-compose.yml; sed -i '/BOLLWERK_APP_VERSION_CODE/a\ - BOLLWERK_APP_VERSION_NAME=$VersionName' docker-compose.yml" ssh $VPS $addCmd } if ($LASTEXITCODE -ne 0) { Write-Error "Version-Update fehlgeschlagen."; exit 1 } Write-Host "[OK] Version gesetzt: $VersionName (build $VersionCode)" -ForegroundColor Green # --- Schritt 3: Server neustarten --- Write-Host "`n[3/4] Server-Container neustarten..." -ForegroundColor Yellow ssh $VPS "cd $RemoteDir; docker compose up -d" if ($LASTEXITCODE -ne 0) { Write-Error "Container-Neustart fehlgeschlagen."; exit 1 } Write-Host "[OK] Container neu gestartet" -ForegroundColor Green # --- Schritt 4: Verifizieren --- if ($SkipVerify) { Write-Host "`n[4/4] Verifizierung uebersprungen." -ForegroundColor DarkGray } else { Write-Host "`n[4/4] Verifizieren (warte 5s auf Server-Start)..." -ForegroundColor Yellow Start-Sleep -Seconds 5 try { $response = Invoke-WebRequest -Uri "http://195.246.231.210:8080/api/version" -UseBasicParsing -TimeoutSec 10 $versionJson = $response.Content | ConvertFrom-Json if ($versionJson.versionCode -eq $VersionCode -and $versionJson.versionName -eq $VersionName) { Write-Host "[OK] Server meldet Version $($versionJson.versionName) (build $($versionJson.versionCode))" -ForegroundColor Green Write-Host (" APK-URL: " + $versionJson.apkUrl) -ForegroundColor DarkGray } else { Write-Warning ("Server meldet unerwartete Version: " + ($versionJson | ConvertTo-Json -Compress)) } } catch { Write-Warning "Verifizierung fehlgeschlagen: $_" Write-Host "Manuell pruefen: http://195.246.231.210:8080/api/version" -ForegroundColor DarkGray } } Write-Host "`n=== Publish abgeschlossen ===" -ForegroundColor Cyan Write-Host "Homepage: http://195.246.231.210:8080/" -ForegroundColor DarkGray Write-Host "API: http://195.246.231.210:8080/api/version" -ForegroundColor DarkGray