name: Test & Build on: push: branches: ["main"] paths-ignore: - "**.md" - "ui/**" pull_request: branches: ["main"] workflow_dispatch: permissions: contents: read env: CARGO_TERM_COLOR: always jobs: test: name: Test on ${{ matrix.name }} runs-on: ${{ matrix.platform }} container: image: ${{ matrix.container }} options: --user root strategy: fail-fast: false matrix: # On Push: Linux only. On PR: All platforms. include: - platform: "ubuntu-22.04" name: "Ubuntu 22.04" - platform: "ubuntu-22.04" name: "Arch Linux (Wayland)" container: "archlinux:latest" wayland: true - platform: "windows-latest" name: "Windows" - platform: "macos-14" name: "macOS" steps: - uses: actions/checkout@v4 - name: Install Dependencies (Ubuntu) if: runner.os == 'Linux' && !matrix.wayland run: | sudo apt-get update || true sudo apt-get install -y libwebkit2gtk-4.1-dev build-essential curl wget file libssl-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev libfuse2 - name: Install Dependencies (Arch Linux) if: matrix.wayland run: | pacman -Syu --noconfirm pacman -S --noconfirm webkit2gtk-4.1 base-devel curl wget file openssl gtk3 - name: Setup Wayland Environment (Arch) if: matrix.wayland run: | echo "WAYLAND_DISPLAY=wayland-1" >> $GITHUB_ENV echo "GDK_BACKEND=wayland" >> $GITHUB_ENV echo "XDG_SESSION_TYPE=wayland" >> $GITHUB_ENV echo "Wayland test environment configured" - name: Install Rust uses: dtolnay/rust-toolchain@stable - name: Install Node.js uses: actions/setup-node@v4 with: node-version: 22 - name: Install pnpm uses: pnpm/action-setup@v2 with: version: 9 - name: Install Frontend Dependencies working-directory: ./ui run: pnpm install - name: Install Tauri CLI run: cargo install tauri-cli - name: Rust Cache uses: swatinem/rust-cache@v2 with: workspaces: ./src-tauri - name: Run Tests working-directory: ./src-tauri run: cargo test --verbose - name: Build App (Debug) run: cargo tauri build --debug - name: Get Short SHA id: slug run: echo "sha8=$(echo ${GITHUB_SHA} | cut -c1-8)" >> $GITHUB_OUTPUT - name: Upload Artifact (Linux) if: runner.os == 'Linux' uses: actions/upload-artifact@v4 with: name: dropout-linux-${{ matrix.wayland && 'arch' || 'ubuntu' }}-${{ steps.slug.outputs.sha8 }} path: | src-tauri/target/debug/bundle/appimage/*.AppImage src-tauri/target/debug/bundle/deb/*.deb src-tauri/target/debug/dropout retention-days: 5 - name: Upload Artifact (Windows) if: runner.os == 'Windows' uses: actions/upload-artifact@v4 with: name: dropout-windows-${{ steps.slug.outputs.sha8 }} path: | src-tauri/target/debug/bundle/msi/*.msi src-tauri/target/debug/bundle/nsis/*.exe src-tauri/target/debug/dropout.exe retention-days: 5 - name: Upload Artifact (macOS) if: runner.os == 'macOS' uses: actions/upload-artifact@v4 with: name: dropout-macos-${{ steps.slug.outputs.sha8 }} path: | src-tauri/target/debug/bundle/dmg/*.dmg src-tauri/target/debug/bundle/macos/DropOut.app retention-days: 5