--- name: publish description: "APK publizieren: Version bumpen, APK bauen, auf VPS hochladen, Server-Version aktualisieren, QR-Code/Download-Seite verifizieren. Verwende diesen Skill immer wenn eine neue App-Version veröffentlicht werden soll – auch wenn der User nur 'publish', 'release', 'veröffentlichen', 'neue Version', 'APK hochladen', 'APK deployen', 'Update bereitstellen' oder 'QR-Code aktualisieren' sagt. Trigger-Phrasen: 'publish', 'release', 'veröffentlichen', 'APK hochladen', 'neue Version', 'Update ausrollen', 'QR-Code'." --- # Skill: Publish (APK auf VPS veröffentlichen) Dieser Skill deckt den vollständigen Workflow ab, um eine neue App-Version auf dem VPS bereitzustellen, sodass: 1. Die **Homepage** (QR-Code + Download-Link) die aktuelle APK anbietet 2. Die **Update-Prüfung in der App** die neue Version erkennt und zum Download anbietet --- ## Architektur-Überblick ``` App (lokal) VPS (195.246.231.210) ───────────── ───────────────────── app/build.gradle.kts /opt/bollwerk/ versionCode / versionName ├── docker-compose.yml (BOLLWERK_APP_VERSION_CODE/NAME) ├── data/app-latest.apk (statisch ausgeliefert) ./gradlew assembleDebug └── Server-Container (Ktor) → app-debug.apk ├── GET / → Homepage mit QR-Code ├── GET /api/version → JSON {versionCode, versionName, apkUrl} scp → /opt/bollwerk/data/ └── GET /static/* → Dateien aus data/ ``` ### Wie die Update-Prüfung funktioniert 1. App ruft `GET {serverUrl}/api/version` auf → erhält `VersionInfo(versionCode, versionName, apkUrl)` 2. `CheckForUpdateUseCase` vergleicht `versionInfo.versionCode > BuildConfig.VERSION_CODE` 3. Falls neuer → zeigt Download-Button, lädt APK herunter, installiert via `ApkInstaller` ### Wie die Homepage funktioniert - `GET /` liefert HTML mit QR-Code (via qrcodejs) + Download-Link auf `/static/app-latest.apk` - Version wird aus `BOLLWERK_APP_VERSION_CODE` / `BOLLWERK_APP_VERSION_NAME` Env-Vars gelesen --- ## Publish-Workflow (Schritte) ### Schritt 1 – Version bumpen In `app/build.gradle.kts`: - `versionCode` um 1 erhöhen - `versionName` passend anpassen (z.B. "1.2" → "1.3") ### Schritt 2 – Build & Test ```powershell .\gradlew.bat assembleDebug test ``` Die APK liegt danach unter: `app/build/outputs/apk/debug/app-debug.apk` ### Schritt 3 – APK auf VPS hochladen ```powershell scp app/build/outputs/apk/debug/app-debug.apk root@195.246.231.210:/opt/bollwerk/data/app-latest.apk ``` **Voraussetzung:** SSH-Agent muss laufen und Key geladen sein (siehe vps-deploy Skill). ### Schritt 4 – Server-Version aktualisieren Die Version wird über Environment-Variablen in der `docker-compose.yml` auf dem VPS gesetzt: ```powershell # Neue Werte per sed in docker-compose.yml eintragen ssh root@195.246.231.210 "cd /opt/bollwerk && sed -i 's/BOLLWERK_APP_VERSION_CODE=.*/BOLLWERK_APP_VERSION_CODE=/' docker-compose.yml && sed -i 's/BOLLWERK_APP_VERSION_NAME=.*/BOLLWERK_APP_VERSION_NAME=/' docker-compose.yml" ``` Falls die Env-Vars noch nicht in der docker-compose.yml stehen, müssen sie einmalig hinzugefügt werden: ```powershell ssh root@195.246.231.210 "cd /opt/bollwerk && sed -i '/BOLLWERK_JWT_SECRET/a\ - BOLLWERK_APP_VERSION_CODE=\n - BOLLWERK_APP_VERSION_NAME=' docker-compose.yml" ``` ### Schritt 5 – Server neustarten ```powershell ssh root@195.246.231.210 "cd /opt/bollwerk && docker compose up -d" ``` ### Schritt 6 – Verifizieren ```powershell # Version-API prüfen Invoke-WebRequest -Uri "http://195.246.231.210:8080/api/version" -UseBasicParsing | Select-Object -ExpandProperty Content # Homepage prüfen (QR-Code-Seite) Invoke-WebRequest -Uri "http://195.246.231.210:8080/" -UseBasicParsing | Select-Object StatusCode, StatusDescription ``` Erwartete Ausgabe von `/api/version`: ```json {"versionCode":,"versionName":"","apkUrl":"http://195.246.231.210:8080/static/app-latest.apk"} ``` --- ## Automatisiertes Skript Das Skript `publish-apk.ps1` in diesem Skill-Ordner automatisiert Schritte 3–6: ```powershell & ".github/skills/publish/publish-apk.ps1" -VersionCode 4 -VersionName "1.3" ``` **Parameter:** | Parameter | Pflicht | Beschreibung | | -------------- | ------- | --------------------------------------------- | | `-VersionCode` | ja | Neuer versionCode (Integer) | | `-VersionName` | ja | Neuer versionName (String, z.B. "1.3") | | `-ApkPath` | nein | Pfad zur APK (Default: debug-APK) | | `-SkipVerify` | nein | Verifizierung überspringen | --- ## Wichtige Dateien | Datei | Beschreibung | |-------|-------------| | `app/build.gradle.kts` (L18-19) | `versionCode` / `versionName` | | `server/src/main/resources/application.conf` (L18-21) | Server-Version-Defaults + Env-Var-Override | | `server/src/main/kotlin/.../routes/VersionRoutes.kt` | Homepage + `/api/version` Endpoint | | `server/src/main/kotlin/.../plugins/Routing.kt` | `staticFiles("/static", File("data"))` | | `app/src/main/java/.../usecase/CheckForUpdateUseCase.kt` | Update-Prüfung in der App | | `app/src/main/java/.../ui/update/UpdateViewModel.kt` | Update-UI + Download-Logik | --- ## Bekannte Lücken / TODOs - **Kein Release-Build:** Aktuell wird `assembleDebug` verwendet. Für Produktion → Signing-Config + `assembleRelease` einrichten. - **Kein HTTPS:** Server läuft auf HTTP. QR-Code zeigt `http://`-URL. Für Play Store / Sicherheit → Caddy als Reverse Proxy. - **Manuelle Version-Env-Vars:** Beim ersten Publish müssen die Env-Vars in die VPS docker-compose eingefügt werden. Das Skript erledigt das automatisch.