name: Rust release artifacts # Triggered on tag push (v*) — builds release binaries across desktop targets # and assembles a GitHub Release draft. The `build` job builds the real # `op-host-desktop` crate (winit + skia-safe runner that drives the Rust # editor); its shipped executable keeps the stable `openpencil-desktop` # name. Full DMG / AppImage / EXE installer packaging lands in Step 1f. # The wasm web bundle is currently DEFERRED (see comment block below); when # the CI-side C-hard pipeline (emscripten install + EMSDK + symlink hack + # wasm-bindgen + wasm-opt) lands it will re-enter the matrix. 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 # macos-13 (Intel) deprecated; cross-compile x86_64-apple-darwin # from Apple Silicon (cargo supports cross-compile to host's other # arch out of the box, no `cross` needed). - label: macos-x86_64 runner: macos-latest 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 # Windows ARM64 — cargo cross-compile from x86_64 windows runner. - label: windows-aarch64 runner: windows-latest target: aarch64-pc-windows-msvc archive: zip steps: - uses: actions/checkout@v4 with: submodules: recursive - uses: dtolnay/rust-toolchain@stable with: toolchain: '1.94' 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 op-host-desktop --target ${{ matrix.target }} --release - name: Build (cross) if: matrix.cross == true run: cross build -p op-host-desktop --target ${{ matrix.target }} --release - name: Package archive (unix) if: matrix.archive == 'tar.gz' shell: bash run: | cd target/${{ matrix.target }}/release tar czf ../../../openpencil-desktop-${{ matrix.label }}.tar.gz openpencil-desktop - name: Package archive (windows) if: matrix.archive == 'zip' shell: pwsh run: | Compress-Archive ` -Path target\${{ matrix.target }}\release\openpencil-desktop.exe ` -DestinationPath openpencil-desktop-${{ matrix.label }}.zip - name: Upload artifact uses: actions/upload-artifact@v4 with: name: openpencil-desktop-${{ matrix.label }} path: | openpencil-desktop-${{ matrix.label }}.tar.gz openpencil-desktop-${{ matrix.label }}.zip if-no-files-found: ignore # Phase 1b release wasm artifact: explicitly DEFERRED (not silently # dropped). The local C-hard pipeline (vendor/skia-safe-op fork + # crates/wasm-libc-shim) does produce a runtime-loadable # wasm32-unknown-unknown bundle today (verified 2026-05-09: 0 env.* # imports, 597 KiB gzip). Re-introducing the release job requires # CI-side automation that we have NOT yet built: # 1. install brew emscripten 5.0.7 + EMSDK shim on ubuntu-latest # 2. set EMSDK env var for the cargo build # 3. run `cargo build … --features skia --release` # 4. apply the `.wasm.a` → `.a` symlink hack in the # skia-bindings out/ dir (manual today; tracked as a follow-up # automation item — fold into `vendor/skia-safe-op` build.rs) # 5. run `wasm-bindgen --target web` + `wasm-opt -Oz` # 6. browser-side manual smoke (Phase E in spec) before publishing # # Until that pipeline lands, tagged releases ship desktop artifacts # only. This is a CONSCIOUS choice — see plan §Cheat-sheet for the # tracking item. release-draft: name: Create / update GitHub Release draft # `wasm` job deferred (see comment block above); when the # CI-side C-hard pipeline lands, re-add the job and append its # name to this `needs:` list. needs: [build] 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