bollwerk/.github/skills/publish/SKILL.md
Jens Reinemann a5f89e6a69 rename: Krisenvorrat -> Bollwerk
- Package: de.krisenvorrat.* -> de.bollwerk.*
- Klassen: KrisenvorratApp/Database/Theme -> Bollwerk*
- ApplicationId: de.bollwerk.app
- Server: BOLLWERK_* Env-Vars, bollwerk HOCON-Config
- Docker: bollwerk-server/db/backup Container-Namen
- Room DB: bollwerk.db, SharedPrefs: bollwerk_secure_prefs
- Export-Dateien: bollwerk_export/inventar
- UI-Strings, HTML, Admin-UI: alle auf Bollwerk
- Docs, Skills, README angepasst
- Alle Tests gruen, Build erfolgreich
2026-05-17 17:44:02 +02:00

5.9 KiB
Raw Blame History

name description
publish 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

.\gradlew.bat assembleDebug test

Die APK liegt danach unter: app/build/outputs/apk/debug/app-debug.apk

Schritt 3 APK auf VPS hochladen

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:

# 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=<neuer_code>/' docker-compose.yml && sed -i 's/BOLLWERK_APP_VERSION_NAME=.*/BOLLWERK_APP_VERSION_NAME=<neuer_name>/' docker-compose.yml"

Falls die Env-Vars noch nicht in der docker-compose.yml stehen, müssen sie einmalig hinzugefügt werden:

ssh root@195.246.231.210 "cd /opt/bollwerk && sed -i '/BOLLWERK_JWT_SECRET/a\      - BOLLWERK_APP_VERSION_CODE=<code>\n      - BOLLWERK_APP_VERSION_NAME=<name>' docker-compose.yml"

Schritt 5 Server neustarten

ssh root@195.246.231.210 "cd /opt/bollwerk && docker compose up -d"

Schritt 6 Verifizieren

# 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:

{"versionCode":<neuer_code>,"versionName":"<neuer_name>","apkUrl":"http://195.246.231.210:8080/static/app-latest.apk"}

Automatisiertes Skript

Das Skript publish-apk.ps1 in diesem Skill-Ordner automatisiert Schritte 36:

& ".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.