- En-Dash durch Hyphen ersetzt (UTF-8 Encoding-Problem) - SSH-Befehle: && durch ; ersetzt (PS 5.1 kennt kein &&) - 2>/dev/null aus PS-Parsing entfernt (String-Konkatenation) - SSH-Array-Rueckgabe korrekt behandeln (letztes Element)
103 lines
4.6 KiB
PowerShell
103 lines
4.6 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
Publiziert eine APK auf den Krisenvorrat 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/krisenvorrat"
|
|
|
|
# --- 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 "KRISENVORRAT_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/KRISENVORRAT_APP_VERSION_CODE=.*/KRISENVORRAT_APP_VERSION_CODE=$VersionCode/' docker-compose.yml; sed -i 's/KRISENVORRAT_APP_VERSION_NAME=.*/KRISENVORRAT_APP_VERSION_NAME=$VersionName/' docker-compose.yml"
|
|
ssh $VPS $sedCmd
|
|
} else {
|
|
# Erstmalig hinzufügen (nach JWT_SECRET-Zeile)
|
|
$addCmd = "cd $RemoteDir; sed -i '/KRISENVORRAT_JWT_SECRET/a\ - KRISENVORRAT_APP_VERSION_CODE=$VersionCode' docker-compose.yml; sed -i '/KRISENVORRAT_APP_VERSION_CODE/a\ - KRISENVORRAT_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
|