feat(devops): configure desktop packaging and introduce semantic versioning

- Added `nativeDistributions` for Linux (.deb), Windows (.msi), and macOS (.dmg) in `build.gradle.kts` with platform-specific settings, embedded JRE, and JVM-args.
- Implemented centralized semantic versioning via `version.properties` as the single source of truth, applying it across all builds.
- Introduced CI/CD release workflow (`.gitea/workflows/release.yml`) for auto-tagging, artifact builds, and release summaries.
- Created `CHANGELOG.md` following Keep-a-Changelog format for tracking changes.
- Documented icon requirements and packaging steps in `ICONS_PLACEHOLDER.md`.
- Updated DevOps roadmap to reflect completed Sprint C-1 and C-2 tasks.

Signed-off-by: Stefan Mogeritsch <stefan.mo.co@gmail.com>
This commit is contained in:
2026-04-03 11:26:43 +02:00
parent c696b8c50e
commit 7ff48ed3d7
9 changed files with 598 additions and 35 deletions
+55 -25
View File
@@ -28,24 +28,37 @@
- [x] Headless-Flag: `-Djava.awt.headless=true`
- [x] Gradle Wrapper auf `9.4.0` aktualisiert
### Sprint C — Abgeschlossen
- [x] **C-1** | Desktop-App Packaging konfiguriert
- [x] `compose.desktop.nativeDistributions` vollständig in `build.gradle.kts` konfiguriert
- [x] Linux: `.deb`-Paket — `packageDeb` Task, Icon PNG 512×512, `debMaintainer`, `menuGroup`
- [x] Windows: `.msi`-Installer — `packageMsi` Task, Icon ICO, `upgradeUuid`, `menuGroup`, `shortcut`
- [x] macOS: `.dmg`-Image — `packageDmg` Task, Icon ICNS, `bundleID`, `appCategory`
- [x] App-Metadaten: `packageName`, `description`, `vendor`, `copyright`, `licenseFile`
- [x] Eingebettetes JRE: `modules(...)` mit minimalem JRE-Footprint konfiguriert
- [x] JVM-Args für gepackte App: `-Xms128m`, `-Xmx512m`, `-Dfile.encoding=UTF-8`
- [x] Icon-Ressourcen-Verzeichnis angelegt + `ICONS_PLACEHOLDER.md` mit Anforderungen
- [ ] ⚠️ **Offen:** Echte Icon-Dateien (`icon.png`, `icon.ico`, `icon.icns`) erstellen/einfügen
- [ ] ⚠️ **Offen:** Testinstallation auf Ziel-Betriebssystem durchführen (nach Icon-Erstellung)
- [x] **C-2** | Semantic Versioning eingeführt
- [x] Versionierungsschema definiert: `MAJOR.MINOR.PATCH[-QUALIFIER]`
- [x] Zentrale Versionsquelle: `version.properties` im Root-Projekt (Single Source of Truth)
- [x] Root `build.gradle.kts`: Version wird aus `version.properties` gelesen (kein Hardcode mehr)
- [x] Desktop `build.gradle.kts`: `packageVersion` aus `version.properties` (reines `MAJOR.MINOR.PATCH`)
- [x] Git-Tagging-Strategie definiert: `vMAJOR.MINOR.PATCH` (z. B. `v1.0.0`)
- [x] Release-Workflow angelegt: `.gitea/workflows/release.yml`
- Trigger: Änderung an `version.properties` auf `main`/`master` + manuell (Dry-Run-Option)
- Job 1: Version lesen, Tag-Duplikat-Check, Git-Tag erstellen & pushen
- Job 2: Linux `.deb` bauen & als Artefakt hochladen
- Job 3: Windows `.msi` bauen & als Artefakt hochladen
- Job 4: Release-Summary (Markdown-Report)
- [x] `CHANGELOG.md` angelegt (Keep-a-Changelog-Format, SemVer)
---
## 🔴 Sprint C — Priorität 1 (diese Woche)
- [ ] **C-1** | Desktop-App Packaging konfigurieren
- [ ] `compose.desktop.nativeDistributions` in `build.gradle.kts` konfigurieren
- [ ] Windows: `.msi`-Installer bauen
- [ ] Linux: `.deb`-Paket bauen
- [ ] macOS: `.dmg`-Image bauen (falls erforderlich)
- [ ] App-Icon und Metadaten (Name, Version, Publisher) eintragen
- [ ] Testinstallation auf Ziel-Betriebssystem durchführen
- [ ] **C-2** | Semantic Versioning einführen
- [ ] Versionierungsschema definieren: `MAJOR.MINOR.PATCH`
- [ ] Gemeinsame Versions-Quelle für Frontend und Backend festlegen
- [ ] Git-Tagging-Strategie definieren (`v1.0.0`, `v1.0.0-backend`, etc.)
- [ ] Release-Tagging in CI/CD-Pipeline integrieren
- [ ] `CHANGELOG.md`-Vorlage anlegen
## 🔴 Sprint C — Restpunkte
- [ ] **C-3** | Produktions-Deployment vorbereiten
- [ ] Reverse-Proxy-Konfiguration (Nginx / Traefik) für Backend prüfen
@@ -71,17 +84,34 @@
## 📌 Abhängigkeiten
| Warte auf | Von wem | Betrifft |
|----------------------------|-------------------|---------------------|
| ADR-0022 LAN-Sync | 🏗️ Architect B-1 | D-2 mDNS-Infra |
| QA: Test-Integration in CI | 🧐 QA C-4 | C-1 Packaging-Tests |
| Warte auf | Von wem | Betrifft |
|-----------------------------|-------------------|---------------------|
| ADR-0022 LAN-Sync | 🏗️ Architect B-1 | D-2 mDNS-Infra |
| QA: Test-Integration in CI | 🧐 QA C-4 | C-1 Packaging-Tests |
| Icon-Dateien (PNG/ICO/ICNS) | 🖌️ UI/UX | C-1 Release-Build |
---
## 💡 Empfehlungen (nach Priorität)
1. **C-1 Desktop-Packaging** — Für erste echte Auslieferung an Endnutzer zwingend notwendig; `.msi`/`.deb` sollten vor
dem ersten Beta-Test bereitstehen.
2. **C-2 Semantic Versioning** — Ohne klare Versionierung ist kein koordiniertes Release möglich; einfach zu
implementieren, hoher Nutzen.
3. **D-1 Tenant-Backup** — Wenn eine Veranstaltung = eine Datenbank, muss jeder Tenant einzeln gesichert werden können.
1. **Icons erstellen** — Vor dem ersten echten Release-Build müssen `icon.png`, `icon.ico` und
`icon.icns` in `frontend/shells/meldestelle-desktop/src/jvmMain/resources/` abgelegt werden.
Siehe `ICONS_PLACEHOLDER.md` für Anforderungen und ImageMagick-Schnell-Befehle.
2. **Testinstallation** — Nach Icon-Erstellung: `.deb` auf Ubuntu/Debian, `.msi` auf Windows 10/11
installieren und Startmenü-Eintrag / Desktop-Verknüpfung prüfen.
3. **C-3 Produktions-Deployment** — Reverse-Proxy + HTTPS vor erstem Beta-Test konfigurieren.
4. **D-1 Tenant-Backup** — Wenn eine Veranstaltung = eine Datenbank, muss jeder Tenant einzeln
gesichert werden können.
---
## 🗂️ Geänderte Dateien (diese Session)
| Datei | Änderung |
|----------------------------------------------------------------------------------|------------------------------------------------------------------------|
| `version.properties` | **NEU** — Zentrale SemVer-Quelle (`1.0.0-SNAPSHOT`) |
| `build.gradle.kts` (root) | Version aus `version.properties` statt hardcoded |
| `frontend/shells/meldestelle-desktop/build.gradle.kts` | Vollständige `nativeDistributions`-Konfiguration (Linux/Windows/macOS) |
| `frontend/shells/meldestelle-desktop/src/jvmMain/resources/ICONS_PLACEHOLDER.md` | **NEU** — Icon-Anforderungen dokumentiert |
| `.gitea/workflows/release.yml` | **NEU** — Release-Workflow (Tag + Packaging) |
| `CHANGELOG.md` | **NEU** — Keep-a-Changelog-Format |
@@ -14,7 +14,7 @@
| 👷 Backend | ⚠️ A-1/A-3 offen | 🔴 B-1 teilweise | ⬜ Nicht gestartet | A-1 Rollout + Reiter/Pferde-APIs |
| 🎨 Frontend | ✅ Abgeschlossen | 🟡 B-2 teilweise/B-3 teilweise/B-4 offen | ⬜ Nicht gestartet | B-2 StoreV2-Ablösung + B-3 Bewerb-Kontext-Validierung |
| 📜 Rulebook | ✅ Abgeschlossen | 🔴 B-2 offen | ⬜ Nicht gestartet | B-2 Spec an Backend übergeben |
| 🐧 DevOps | ✅ Abgeschlossen | ✅ Abgeschlossen | 🔴 C-1 offen | C-1 Desktop-Packaging (.msi/.deb) |
| 🐧 DevOps | ✅ Abgeschlossen | ✅ Abgeschlossen | C-1/C-2 fertig | C-3 Produktions-Deployment |
| 🧐 QA | ✅ Abgeschlossen | 🔴 B-1..B-4 offen | ⬜ Nicht gestartet | B-2 Onboarding-Tests + B-3 Abteilungs-Tests |
| 🖌️ UI/UX | ✅ Abgeschlossen | 🔴 B-1/B-4 offen | ⬜ Nicht gestartet | B-1 Finale Entscheidung Editier-Formulare |
| 🧹 Curator | ✅ Abgeschlossen | 🔴 B-1..B-3 offen | ⬜ Nicht gestartet | B-1 Roadmaps pflegen ← *diese Session* |
@@ -63,8 +63,14 @@ Diese Aufgaben blockieren andere Agenten und müssen zuerst erledigt werden:
### 🐧 DevOps Engineer
1. **C-1** Desktop-Packaging (`.msi` / `.deb`) konfigurieren
2. **C-2** Semantic Versioning + Git-Tagging einführen
1. **C-1** Desktop-Packaging (`.msi` / `.deb` / `.dmg`) konfiguriert
- `nativeDistributions` vollständig (Linux/Windows/macOS), JRE-Module, JVM-Args
- ⚠️ Icons (`icon.png`/`icon.ico`/`icon.icns`) noch ausstehend → 🖌️ UI/UX
2.**C-2** Semantic Versioning + Git-Tagging eingeführt
- `version.properties` als Single Source of Truth
- `.gitea/workflows/release.yml`: Auto-Tag + `.deb`/`.msi` Packaging
- `CHANGELOG.md` angelegt
3. 🔴 **C-3** Produktions-Deployment vorbereiten (nächste Session)
### 🧐 QA Specialist
@@ -0,0 +1,144 @@
# 🐧 DevOps — Sprint C: Desktop-Packaging & Semantic Versioning
> **Datum:** 3. April 2026
> **Agent:** 🐧 DevOps Engineer
> **Sprint:** C — Aufgaben C-1 und C-2
> **Status:** ✅ Implementiert (Icons ausstehend)
---
## 📋 Zusammenfassung
Diese Session implementiert die Desktop-Packaging-Konfiguration (C-1) und führt Semantic
Versioning mit Git-Tagging ein (C-2). Beide Aufgaben sind vollständig konfiguriert; der einzige
verbleibende manuelle Schritt ist die Erstellung der App-Icons durch 🖌️ UI/UX.
---
## ✅ C-1 — Desktop-Packaging konfiguriert
### Was wurde gemacht
**`frontend/shells/meldestelle-desktop/build.gradle.kts`** vollständig überarbeitet:
- `nativeDistributions` für alle drei Plattformen konfiguriert:
- **Linux `.deb`**: `packageDeb` Task, PNG-Icon, `debMaintainer`, `menuGroup`, `shortcut`
- **Windows `.msi`**: `packageMsi` Task, ICO-Icon, `upgradeUuid` (unveränderliche GUID!), `shortcut`, `dirChooser`
- **macOS `.dmg`**: `packageDmg` Task, ICNS-Icon, `bundleID`, `appCategory`
- Gemeinsame Metadaten: `packageName`, `description`, `vendor`, `copyright`, `licenseFile`
- Eingebettetes JRE mit minimalem Footprint (`modules(...)`)
- JVM-Args für gepackte App: `-Xms128m -Xmx512m -Dfile.encoding=UTF-8`
- Version wird automatisch aus `version.properties` gelesen (kein Hardcode)
**`frontend/shells/meldestelle-desktop/src/jvmMain/resources/ICONS_PLACEHOLDER.md`** angelegt:
- Dokumentiert Icon-Anforderungen (PNG 512×512, ICO Multi-Size, ICNS 1024×1024)
- ImageMagick-Schnell-Befehle für Konvertierung
### Gradle-Befehle
```bash
# Linux .deb bauen
./gradlew :frontend:shells:meldestelle-desktop:packageDeb
# Windows .msi bauen (auf Windows-Runner)
./gradlew :frontend:shells:meldestelle-desktop:packageMsi
# macOS .dmg bauen (auf macOS-Runner)
./gradlew :frontend:shells:meldestelle-desktop:packageDmg
# Alle Plattformen (auf jeweiligem OS)
./gradlew :frontend:shells:meldestelle-desktop:packageReleaseDistributables
```
### Offene Punkte
| # | Aufgabe | Zuständig |
|---|-------------------------------------------|-----------|
| 1 | `icon.png` (512×512 PNG) erstellen | 🖌️ UI/UX |
| 2 | `icon.ico` (Multi-Size ICO) erstellen | 🖌️ UI/UX |
| 3 | `icon.icns` (1024×1024 ICNS) erstellen | 🖌️ UI/UX |
| 4 | Testinstallation `.deb` auf Ubuntu/Debian | 🐧 DevOps |
| 5 | Testinstallation `.msi` auf Windows 10/11 | 🐧 DevOps |
---
## ✅ C-2 — Semantic Versioning eingeführt
### Was wurde gemacht
**`version.properties`** (neu, Root-Projekt):
- Single Source of Truth für alle Versionen
- Format: `VERSION_MAJOR`, `VERSION_MINOR`, `VERSION_PATCH`, `VERSION_QUALIFIER`
- Aktuell: `1.0.0-SNAPSHOT`
**`build.gradle.kts`** (Root):
- Version wird aus `version.properties` gelesen statt hardcoded `"1.0.0-SNAPSHOT"`
- Alle Subprojekte erben die Version automatisch via `allprojects { version = semVer }`
**`.gitea/workflows/release.yml`** (neu):
```
Trigger: version.properties geändert auf main/master ODER manuell (Dry-Run-Option)
├── Job 1: tag-release
│ ├── Version aus version.properties lesen
│ ├── Prüfen ob Tag bereits existiert (Idempotenz)
│ └── Git-Tag "vMAJOR.MINOR.PATCH" erstellen & pushen
├── Job 2: package-linux (ubuntu-latest)
│ └── packageDeb → Artefakt hochladen
├── Job 3: package-windows (windows-latest)
│ └── packageMsi → Artefakt hochladen
└── Job 4: release-summary
└── Markdown-Report mit Status aller Jobs
```
**`CHANGELOG.md`** (neu):
- Keep-a-Changelog-Format
- SemVer-Erklärung im Header
- `[Unreleased]` Sektion für laufende Änderungen
- `[1.0.0-SNAPSHOT]` mit Sprint A+B Zusammenfassung
### Release-Workflow (manuell)
```bash
# 1. Version erhöhen
vim version.properties # z. B. VERSION_MINOR=1, VERSION_QUALIFIER=
# 2. CHANGELOG aktualisieren
vim CHANGELOG.md # [Unreleased] → [1.1.0] mit Datum
# 3. Commit & Push → CI erstellt automatisch Tag v1.1.0
git add version.properties CHANGELOG.md
git commit -m "chore: release v1.1.0"
git push origin main
# → CI: Tag v1.1.0 wird gesetzt, .deb und .msi werden gebaut
```
---
## 🗂️ Geänderte Dateien
| Datei | Art | Beschreibung |
|----------------------------------------------------------------------------------|----------|--------------------------------------|
| `version.properties` | NEU | Zentrale SemVer-Quelle |
| `build.gradle.kts` | GEÄNDERT | Version aus `version.properties` |
| `frontend/shells/meldestelle-desktop/build.gradle.kts` | GEÄNDERT | Vollständige Packaging-Konfiguration |
| `frontend/shells/meldestelle-desktop/src/jvmMain/resources/ICONS_PLACEHOLDER.md` | NEU | Icon-Anforderungen |
| `.gitea/workflows/release.yml` | NEU | Release-Workflow |
| `CHANGELOG.md` | NEU | Keep-a-Changelog |
| `docs/04_Agents/Roadmaps/DevOps_Roadmap.md` | GEÄNDERT | C-1/C-2 als erledigt markiert |
---
## 🔗 Nächste Schritte
1. **🖌️ UI/UX** → Icons erstellen und in `src/jvmMain/resources/` ablegen
2. **🐧 DevOps** → Testinstallation nach Icon-Erstellung
3. **🐧 DevOps** → C-3 Produktions-Deployment (nächste Session)