name: Cross-platform build on: workflow_dispatch: push: branches: [main] permissions: contents: read jobs: build: name: ${{ matrix.name }} strategy: fail-fast: false matrix: include: - name: Linux x64 os: ubuntu-22.04 args: --bundles appimage,deb - name: Windows x64 os: windows-2022 args: --bundles nsis,msi - name: macOS Apple Silicon os: macos-15 args: --target aarch64-apple-darwin --bundles app,dmg - name: macOS Intel os: macos-15-intel args: --target x86_64-apple-darwin --bundles app,dmg runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 22 cache: npm - uses: dtolnay/rust-toolchain@stable - name: Install Linux system dependencies if: runner.os == 'Linux' run: | sudo apt-get update sudo apt-get install -y libwebkit2gtk-4.1-dev libayatana-appindicator3-dev librsvg2-dev patchelf - run: npm ci - run: npm test - run: cargo test --locked --manifest-path src-tauri/Cargo.toml # These are build/test artifacts. Release signing happens separately with # the operator-held key; CI never receives that key or publishes stable.json. - run: npm run tauri:build -- --config scripts/tauri-unsigned.json ${{ matrix.args }} - name: Prepare unsigned macOS updater archive if: runner.os == 'macOS' run: | python3 - <<'PY' import json from pathlib import Path import tarfile apps = list(Path('src-tauri/target').glob('*/release/bundle/macos/*.app')) if len(apps) != 1: raise SystemExit('Expected exactly one macOS application bundle') app = apps[0] version = json.loads(Path('src-tauri/tauri.conf.json').read_text())['version'] architecture = app.parts[2].split('-')[0] archive = app.parent / f'ShaCraft.Launcher_{version}_{architecture}.app.tar.gz' with tarfile.open(archive, 'w:gz') as output: output.add(app, arcname=app.name) PY - name: Upload Windows installers if: runner.os == 'Windows' uses: actions/upload-artifact@v4 with: name: shacraft-launcher-windows-x64 if-no-files-found: error path: | src-tauri/target/release/bundle/nsis/*.exe src-tauri/target/release/bundle/msi/*.msi - name: Upload Linux packages if: runner.os == 'Linux' uses: actions/upload-artifact@v4 with: name: shacraft-launcher-linux-x64 if-no-files-found: error path: | src-tauri/target/release/bundle/appimage/*.AppImage src-tauri/target/release/bundle/deb/*.deb - name: Upload macOS package if: runner.os == 'macOS' uses: actions/upload-artifact@v4 with: name: shacraft-launcher-${{ matrix.name == 'macOS Apple Silicon' && 'macos-arm64' || 'macos-x64' }} if-no-files-found: error path: | src-tauri/target/*/release/bundle/dmg/*.dmg src-tauri/target/*/release/bundle/macos/*.app.tar.gz