# Kanalmodell (quick-260914-ku1): main -> Kanal beta (Etiketten beta + latest); # Tag v* -> Kanal live (Etiketten live + vX.Y.Z); Zweig live ohne Tag wird nur geprueft. # Die Entscheidung trifft .gitea/scripts/publish-images.sh anhand GITHUB_REF. # Tag v* (quick-260916-dcz): zusaetzlich Gitea-Release aus dem CHANGELOG.md-Abschnitt (publish-release.sh). # Phase 18 (18-02): Job `desktop` baut vor `publish` das Linux-AppImage und # uebergibt es per actions/cache; `publish` bricht ohne Manifest ab. # Phase 18 (18-05): Derselbe Job baut zusaetzlich den Windows-Installer per # Cross-Bau (cargo-xwin, NSIS aus dem Ubuntu-Paket) -- kein Windows-Rechner # in der Pipeline. `tauri.conf.json`/`Cargo.toml` bleiben dabei immer rein # numerisch (X.Y.Z), weil NSIS' Windows-Ressourcenfelder das verlangen; die # Beta-Kennzeichnung lebt ausschliesslich im Dateinamen-Suffix. # quick-260917-jdh: Job `desktop` ueberspringt den Bau auf `main`, wenn zum # Stempel (Version aus dem letzten Freigabe-Tag + letzter Commit an den # Desktop-Pfaden, siehe .gitea/scripts/desktop-stamp.sh) bereits fertige # Pakete im Zwischenspeicher des Runners liegen; Tags v* bauen immer neu; # `publish` bleibt unveraendert. # quick-260917-kgc: Die beiden tauri-build-Schritte signieren die Pakete mit dem # Updater-Schluessel (Secrets TAURI_SIGNING_PRIVATE_KEY/_PASSWORD, nur an diesen # zwei Schritten); desktop-collect.sh traegt die .sig-Inhalte ins Manifest. name: Tessera CI/CD on: push: branches: [main, live] tags: ['v*'] jobs: quality: name: Lint & Type Check runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 24 - name: Enable pnpm via corepack run: corepack enable && corepack prepare pnpm@9.15.0 --activate - name: Install dependencies run: pnpm install --frozen-lockfile - name: Lint run: pnpm lint - name: Type check run: pnpm type-check test: name: Tests runs-on: ubuntu-latest needs: quality steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 24 - name: Enable pnpm via corepack run: corepack enable && corepack prepare pnpm@9.15.0 --activate - name: Install dependencies run: pnpm install --frozen-lockfile - name: Run tests run: pnpm test desktop: name: Desktop-Pakete bauen runs-on: ubuntu-latest env: # Commit-Stempel fuer build.rs (WR-02): mit Cargo-Zwischenspeicher wuerde # `git rev-parse` im Build-Skript sonst nicht neu ausgewertet. TESSERA_COMMIT: ${{ gitea.sha }} # Der Runner teilt sich den Rechner mit Gitea und dem Dev-Stack (15 GB): # 8 parallele rustc-Prozesse (zwei Release-Baue) brachten den Host an die # Speichergrenze. 4 Prozesse kosten 1-2 Minuten, halbieren den Bedarf. CARGO_BUILD_JOBS: "4" needs: test if: gitea.ref == 'refs/heads/main' || startsWith(gitea.ref, 'refs/tags/v') steps: # Ohne volle Historie und Tags liefert `git describe` nichts -- Pflicht fuer die Version. - uses: actions/checkout@v4 with: fetch-depth: 0 # Die folgenden drei Schritte stehen bewusst vor setup-node/apt/rustup: # Sie sollen beim Ueberspringen (Desktop-Stand unveraendert) gar nicht # erst die teuren Werkzeuge installieren (quick-260917-jdh). - name: Desktop-Stempel berechnen id: stamp run: sh .gitea/scripts/desktop-stamp.sh stamp - name: Fertige Pakete zum Stempel suchen id: stamp-cache if: steps.stamp.outputs.skip_allowed == 'true' uses: actions/cache/restore@v4 with: path: desktop-dist key: desktop-dist-stamp-${{ steps.stamp.outputs.stamp }} # Bewusst OHNE restore-keys: act_runner sucht auch zum Hauptschluessel # per Praefix -- ein aelterer Stand darf nie als Treffer gelten. - name: Gefundene Pakete pruefen id: reuse env: CACHE_HIT: ${{ steps.stamp-cache.outputs.cache-hit }} STAMP_VERSION: ${{ steps.stamp.outputs.version }} STAMP_SHA7: ${{ steps.stamp.outputs.sha7 }} run: sh .gitea/scripts/desktop-stamp.sh check - uses: actions/setup-node@v4 if: steps.reuse.outputs.reuse != 'true' with: node-version: 24 - name: Enable pnpm via corepack if: steps.reuse.outputs.reuse != 'true' run: corepack enable && corepack prepare pnpm@9.15.0 --activate - name: Install dependencies if: steps.reuse.outputs.reuse != 'true' run: pnpm install --frozen-lockfile - name: Systemabhaengigkeiten if: steps.reuse.outputs.reuse != 'true' run: | sudo apt-get update sudo apt-get install -y --no-install-recommends \ libwebkit2gtk-4.1-dev libjavascriptcoregtk-4.1-dev \ libayatana-appindicator3-dev librsvg2-dev \ libgtk-3-dev libssl-dev patchelf file xdg-utils \ lld llvm clang nsis - name: Rust-Toolchain if: steps.reuse.outputs.reuse != 'true' run: | curl -sSf https://sh.rustup.rs | sh -s -- -y --profile minimal --default-toolchain stable echo "$HOME/.cargo/bin" >> "$GITHUB_PATH" "$HOME/.cargo/bin/rustup" component add clippy - name: Cargo-Zwischenspeicher if: steps.reuse.outputs.reuse != 'true' uses: actions/cache@v4 with: path: | ~/.cargo/registry ~/.cargo/git ~/.cargo/bin/cargo-xwin ~/.cache/tauri ~/.cache/cargo-xwin ~/.local/share/tauri apps/desktop/src-tauri/target key: desktop-cargo-${{ hashFiles('apps/desktop/src-tauri/Cargo.lock') }} restore-keys: desktop-cargo- - name: Windows-Werkzeuge if: steps.reuse.outputs.reuse != 'true' run: | rustup target add x86_64-pc-windows-msvc command -v cargo-xwin >/dev/null 2>&1 || cargo install --locked cargo-xwin - name: Version setzen if: steps.reuse.outputs.reuse != 'true' run: sh .gitea/scripts/desktop-version.sh - name: Rust pruefen if: steps.reuse.outputs.reuse != 'true' working-directory: apps/desktop/src-tauri run: | cargo check cargo clippy - name: Alte Bundles entfernen if: steps.reuse.outputs.reuse != 'true' run: | rm -rf apps/desktop/src-tauri/target/release/bundle rm -rf apps/desktop/src-tauri/target/x86_64-pc-windows-msvc/release/bundle - name: Linux-AppImage bauen if: steps.reuse.outputs.reuse != 'true' env: TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} run: pnpm --filter @tessera/desktop exec tauri build --bundles appimage - name: Windows-Installer bauen (Cross-Bau) if: steps.reuse.outputs.reuse != 'true' env: TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }} TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY_PASSWORD }} run: pnpm --filter @tessera/desktop exec tauri build --runner cargo-xwin --target x86_64-pc-windows-msvc --bundles nsis - name: Pakete einsammeln if: steps.reuse.outputs.reuse != 'true' run: sh .gitea/scripts/desktop-collect.sh --require linux,windows - name: Pakete unter dem Stempel ablegen # Nur nach echtem Bau und nur auf main -- Tag-Pakete tragen keinen # Beta-Suffix und duerfen nie unter einem Stempel liegen. Ein bereits # vorhandener Schluessel loest bei actions/cache/save nur eine Info # aus, keinen Fehler. if: steps.reuse.outputs.reuse != 'true' && steps.stamp.outputs.skip_allowed == 'true' uses: actions/cache/save@v4 with: path: desktop-dist key: desktop-dist-stamp-${{ steps.stamp.outputs.stamp }} # Laeuft in beiden Faellen: im Skip-Fall sichert er den restaurierten # Stand unter dem neuen SHA, deshalb muss `publish` nichts wissen. - name: Uebergabe an publish uses: actions/cache/save@v4 with: path: desktop-dist key: desktop-dist-${{ gitea.sha }} publish: name: Build & Publish Images runs-on: ubuntu-latest needs: desktop steps: # Ohne volle Historie und Tags liefert `git describe` nichts -- Pflicht fuer den Stempel. - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Desktop-Pakete aus dem Zwischenspeicher holen uses: actions/cache/restore@v4 with: path: desktop-dist key: desktop-dist-${{ gitea.sha }} fail-on-cache-miss: true - name: Pakete pruefen run: | test -f desktop-dist/manifest.json jq . desktop-dist/manifest.json - name: Log in to Gitea Container Registry run: echo "${{ secrets.REGISTRY_TOKEN }}" | docker login localhost:3002 -u ${{ gitea.actor }} --password-stdin - name: Versionsstempel berechnen, Abbilder bauen und veroeffentlichen run: sh .gitea/scripts/publish-images.sh - name: Gitea-Release zum Freigabe-Tag anlegen (nur bei Tags v*) env: GITEA_TOKEN: ${{ secrets.REGISTRY_TOKEN }} run: sh .gitea/scripts/publish-release.sh