name: Rust release artifacts # Triggered on tag push (v*) — builds release binaries across desktop targets, # the WASM bundle, and uploads them to a GitHub Release draft. Step 1a kill-spike # only ships `openpencil-app` (a placeholder binary entry); real desktop apps # (DMG / AppImage / EXE installer) come in Step 1f and replace this scaffolding. on: push: tags: ['v*'] workflow_dispatch: jobs: build: name: ${{ matrix.label }} runs-on: ${{ matrix.runner }} strategy: fail-fast: false matrix: include: - label: macos-aarch64 runner: macos-latest target: aarch64-apple-darwin archive: tar.gz - label: macos-x86_64 runner: macos-13 target: x86_64-apple-darwin archive: tar.gz - label: linux-x86_64 runner: ubuntu-latest target: x86_64-unknown-linux-gnu archive: tar.gz - label: linux-aarch64 runner: ubuntu-latest target: aarch64-unknown-linux-gnu archive: tar.gz cross: true - label: windows-x86_64 runner: windows-latest target: x86_64-pc-windows-msvc archive: zip steps: - uses: actions/checkout@v4 with: submodules: recursive - uses: dtolnay/rust-toolchain@stable with: toolchain: '1.85' targets: ${{ matrix.target }} - uses: Swatinem/rust-cache@v2 with: key: release-${{ matrix.target }} - name: Install Linux GL/EGL prereqs if: runner.os == 'Linux' && matrix.cross != true run: | sudo apt-get update sudo apt-get install -y \ libxkbcommon-dev libxkbcommon-x11-dev \ libwayland-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev \ libegl1-mesa-dev libgles2-mesa-dev libgbm-dev \ libfreetype-dev libfontconfig1-dev - name: Install cross if: matrix.cross == true run: cargo install cross --locked --version 0.2.5 - name: Build (host) if: matrix.cross != true run: cargo build -p openpencil-app --target ${{ matrix.target }} --release - name: Build (cross) if: matrix.cross == true run: cross build -p openpencil-app --target ${{ matrix.target }} --release - name: Package archive (unix) if: matrix.archive == 'tar.gz' shell: bash run: | cd target/${{ matrix.target }}/release tar czf ../../../openpencil-app-${{ matrix.label }}.tar.gz openpencil-app 2>/dev/null || \ tar czf ../../../openpencil-app-${{ matrix.label }}.tar.gz openpencil-app.placeholder - name: Package archive (windows) if: matrix.archive == 'zip' shell: pwsh run: | Compress-Archive ` -Path target\${{ matrix.target }}\release\openpencil-app.exe ` -DestinationPath openpencil-app-${{ matrix.label }}.zip ` -ErrorAction SilentlyContinue - name: Upload artifact uses: actions/upload-artifact@v4 with: name: openpencil-app-${{ matrix.label }} path: | openpencil-app-${{ matrix.label }}.tar.gz openpencil-app-${{ matrix.label }}.zip if-no-files-found: ignore wasm: name: wasm32 web bundle runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: submodules: recursive - uses: dtolnay/rust-toolchain@stable with: toolchain: '1.85' targets: wasm32-unknown-unknown - uses: Swatinem/rust-cache@v2 with: key: release-wasm32 - run: cargo build -p openpencil-shell-web --target wasm32-unknown-unknown --release - name: Package wasm artifact run: | cd target/wasm32-unknown-unknown/release tar czf ../../../openpencil-shell-web-wasm.tar.gz \ openpencil_shell_web.wasm 2>/dev/null || true - name: Upload artifact uses: actions/upload-artifact@v4 with: name: openpencil-shell-web-wasm path: openpencil-shell-web-wasm.tar.gz if-no-files-found: warn release-draft: name: Create / update GitHub Release draft needs: [build, wasm] runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/v') steps: - uses: actions/checkout@v4 - uses: actions/download-artifact@v4 with: path: dist - name: Flatten artifacts run: | mkdir -p release-files find dist -type f \( -name "*.tar.gz" -o -name "*.zip" \) -exec cp {} release-files/ \; ls -la release-files - name: Create / update GitHub Release uses: softprops/action-gh-release@v2 with: draft: true files: release-files/* generate_release_notes: true