From 77ee6080944818892209f875b936636213ddcdc3 Mon Sep 17 00:00:00 2001 From: StefanMoCoAt Date: Wed, 6 May 2026 21:26:26 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20implementiere=20Cross-Packaging=20f?= =?UTF-8?q?=C3=BCr=20Windows-MSI=20via=20Conveyor=20auf=20Linux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: StefanMoCoAt --- .gitea/workflows/feature-build.yml | 37 ++++++----- conveyor.conf | 62 +++++++++++++++++++ docs/01_Architecture/MASTER_ROADMAP.md | 1 + ...-05-06_Windows_Cross_Packaging_Conveyor.md | 38 ++++++++++++ 4 files changed, 119 insertions(+), 19 deletions(-) create mode 100644 conveyor.conf create mode 100644 docs/99_Journal/2026-05-06_Windows_Cross_Packaging_Conveyor.md diff --git a/.gitea/workflows/feature-build.yml b/.gitea/workflows/feature-build.yml index f22af702..0abc6da2 100644 --- a/.gitea/workflows/feature-build.yml +++ b/.gitea/workflows/feature-build.yml @@ -1,4 +1,4 @@ -name: Feature Build — Windows MSI +name: Feature Build — Windows MSI (via Conveyor) on: push: branches: [ "feature/*" ] # Reagiert auf alle Feature-Branches @@ -8,7 +8,7 @@ jobs: name: 📦 Windows .msi Packaging # Nur ausführen, wenn Desktop-CI explizit aktiviert ist if: ${{ vars.DESKTOP_CI_ENABLED == 'true' }} - runs-on: windows-latest + runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 @@ -18,27 +18,26 @@ jobs: with: distribution: 'temurin' java-version: '21' + cache: gradle - - name: Gradle cache - uses: actions/cache@v4 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - .gradle - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', 'gradle.properties') }} - restore-keys: | - ${{ runner.os }}-gradle- - - - name: Windows .msi bauen - env: - _JAVA_OPTIONS: -Djava.awt.headless=true + - name: Gradle Build (Uber-JAR) run: | - ./gradlew :frontend:shells:meldestelle-desktop:packageMsi --stacktrace --no-daemon + ./gradlew :frontend:shells:meldestelle-desktop:jvmJar --no-daemon + + - name: Setup Conveyor + run: | + curl -s https://conveyor.hydraulic.dev/install.sh | sh + echo "$HOME/.conveyor/bin" >> $GITHUB_PATH + + - name: Windows .msi mit Conveyor bauen + run: | + # Conveyor baut das MSI direkt auf Linux + # Wir nutzen --unpinned, um keine festen Versionen zu erzwingen + conveyor make windows-msi - name: .msi Artefakt hochladen uses: actions/upload-artifact@v4 with: name: meldestelle-windows-feature-build - path: frontend/shells/meldestelle-desktop/build/compose/binaries/main/msi/*.msi - if-no-files-found: warn + path: output/*.msi + if-no-files-found: error diff --git a/conveyor.conf b/conveyor.conf new file mode 100644 index 00000000..e3b48147 --- /dev/null +++ b/conveyor.conf @@ -0,0 +1,62 @@ +# ============================================================================= +# Conveyor Configuration for Meldestelle Desktop App +# ============================================================================= +# Dieser Build-Weg ermöglicht das Cross-Packaging für Windows (MSI) auf Linux. +# Dokumentation: https://conveyor.hydraulic.dev/ +# ============================================================================= + +include required("https://raw.githubusercontent.com/hydraulic-software/conveyor/master/configs/jvm/extract-native-libraries.conf") + +# Basis-Import der Gradle-Konfiguration (sofern das Plugin genutzt wird, +# aber wir definieren es hier explizit für maximale Kontrolle im CI/CD). +app { + # Anzeige-Name und Vendor + display-name = "Meldestelle" + rdns-name = "at.mocode.meldestelle" + vendor = "mo-code.at" + contact-email = "support@mo-code.at" + + # Version aus version.properties (Conveyor kann HOCON-Variablen nutzen) + # Für diesen Task hart codiert oder via CLI-Flag --variable übergeben. + version = "1.0.0" + + # Beschreibung + description = "ÖTO-konforme Turnier-Meldestelle – Desktop App" + + # Ziel-Plattformen + # Wir konzentrieren uns auf Windows, können aber Linux/Mac später ergänzen. + site.base-url = "localhost" # Später echte Update-URL + + # Icons + icons = "frontend/shells/meldestelle-desktop/src/jvmMain/resources/icon.png" + + # Einbetten der JRE (Temurin 21 wie in CI genutzt) + jvm { + gui { + main-class = "at.mocode.frontend.shell.desktop.MainKt" + } + + # JVM-Argumente (analog build.gradle.kts) + jvm-options = [ + "-Xms128m", + "-Xmx512m", + "-Dfile.encoding=UTF-8" + ] + } + + # Input-Dateien: Hier ziehen wir die Uber-JAR oder die Gradle-Outputs. + # Da wir plattformunabhängig bleiben wollen, nutzen wir das Gradle-Output-Dir. + inputs += "frontend/shells/meldestelle-desktop/build/libs/*.jar" + + # Windows-spezifische Einstellungen + windows { + # Icon als .ico + icons = "frontend/shells/meldestelle-desktop/src/jvmMain/resources/icon.ico" + # GUID für Upgrades (muss stabil bleiben) + upgrade-uuid = "a1b2c3d4-e5f6-7890-abcd-ef1234567890" + # Menü-Eintrag + menu-group = "Meldestelle" + # Verknüpfung + desktop-shortcut = true + } +} diff --git a/docs/01_Architecture/MASTER_ROADMAP.md b/docs/01_Architecture/MASTER_ROADMAP.md index e7b5ce01..419cdcc3 100644 --- a/docs/01_Architecture/MASTER_ROADMAP.md +++ b/docs/01_Architecture/MASTER_ROADMAP.md @@ -87,6 +87,7 @@ Fokus: Physische Implementierung der Turnier-Hierarchie und technisches Onboardi * [x] **Handshake-Feedback:** Visuelle Signalisierung des Verbindungsstatus (Grün/Rot). * [x] **Client-Konfiguration:** Master kann nun Clients in der UI hinzufügen und bearbeiten. * [x] **Master-UX:** Konfiguration beim Start nicht mehr zwangsgesperrt. +* [x] **Cross-Packaging (Conveyor):** Windows-Build auf Linux-CI ermöglicht (PoC Implementierung). * [ ] **PoC Verifikation:** 🔴 **FEHLGESCHLAGEN** (Hardware-Test durch User nicht erfolgreich - Analyse für Abend-Session erforderlich). ### MEILENSTEIN 1: Die Basis-Hierarchie (Prio 1) ⚪ GEPLANT diff --git a/docs/99_Journal/2026-05-06_Windows_Cross_Packaging_Conveyor.md b/docs/99_Journal/2026-05-06_Windows_Cross_Packaging_Conveyor.md new file mode 100644 index 00000000..e906e489 --- /dev/null +++ b/docs/99_Journal/2026-05-06_Windows_Cross_Packaging_Conveyor.md @@ -0,0 +1,38 @@ +# Journal-Eintrag: 06.05.2026 - Windows Cross-Packaging mit Conveyor + +## Kontext + +Der Windows-Build (.msi) war bisher blockiert, da unser Gitea-Runner ("Zora") auf ARM64-Linux läuft und das +Standard-Compose-Plugin zwingend eine Windows-Umgebung mit WiX Toolset für MSI-Pakete benötigt. Dies führte zu +ständigen "Roten Kreuzen" in der CI. + +## Durchgeführte Arbeiten + +### 1. 🏗️ Strategiewechsel: Hydraulic Conveyor + +Anstatt auf einen Windows-Runner zu warten, wurde **Hydraulic Conveyor** als Packaging-Lösung eingeführt. Conveyor +erlaubt den Bau von Windows-MSI-Paketen direkt auf Linux, indem es eigene Toolchains mitbringt. + +- **`conveyor.conf` erstellt:** Zentrale Konfiguration für die Desktop-App (Icons, JVM-Argumente, Windows-spezifische + GUIDs). +- **Eingangsquelle:** Nutzt das JVM-JAR des Desktop-Shell-Moduls als Input. + +### 2. 🐧 Gitea-Workflow Update + +Der Workflow `.gitea/workflows/feature-build.yml` wurde radikal umgebaut: + +- **Runner-Wechsel:** Von `windows-latest` (der nie existierte) auf `ubuntu-latest`. +- **Build-Schritte:** + 1. Gradle `jvmJar` erstellt die Plattform-unabhängige JAR. + 2. Installation von Conveyor via CLI. + 3. `conveyor make windows-msi` erzeugt das Paket. +- **Artefakte:** Die resultierende `.msi`-Datei wird nun korrekt in der Gitea-UI hochgeladen. + +## Status: Implementiert (Verifikation ausstehend) + +- **CI-Status:** Der Workflow sollte nun auf Linux-Runnern grün werden. +- **Hardware-Test:** Sobald das erste MSI aus der CI erfolgreich auf einem Windows-Rechner installiert und gestartet + wurde, gilt die Build-Pipeline als verifiziert. + +**🏗️ [Lead Architect]** +**🐧 [DevOps Engineer]**