name: CI on: push: branches: [main] pull_request: permissions: contents: read jobs: tests: strategy: fail-fast: false matrix: node-version: [20] runner: - name: Windows os: windows-latest - name: Linux os: namespace-profile-default - name: macOS os: macos-14 # Exclude windows and macos from being built on feature branches on-main-branch: - ${{ github.ref == 'refs/heads/main' }} exclude: - on-main-branch: false runner: name: Windows - on-main-branch: false runner: name: macOS runs-on: ${{ matrix.runner.os }} timeout-minutes: 30 name: ${{ matrix.runner.name }} steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: 'pnpm' # Cargo already skips downloading dependencies if they already exist - name: Cache cargo uses: actions/cache@v4 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} # Cache the `oxide` Rust build - name: Cache oxide build uses: actions/cache@v4 with: path: | ./target/ ./crates/node/*.node ./crates/node/index.js ./crates/node/index.d.ts key: ${{ runner.os }}-oxide-${{ hashFiles('./crates/**/*') }} - name: Install dependencies run: pnpm install - name: Build run: pnpm run build env: CARGO_PROFILE_RELEASE_LTO: 'off' CARGO_TARGET_X86_64_PC_WINDOWS_MSVC_LINKER: 'lld-link' - name: Lint run: pnpm run lint # Only lint on linux to avoid \r\n line ending errors if: matrix.runner.os == 'ubuntu-latest' - name: Test run: pnpm run test - name: Install Playwright Browsers run: npx playwright install --with-deps - name: Run Playwright tests run: npm run test:ui - name: Notify Discord if: failure() && github.ref == 'refs/heads/main' uses: discord-actions/message@v2 with: webhookUrl: ${{ secrets.DISCORD_WEBHOOK_URL }} message: 'The [most recent build](<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}>) on the `main` branch has failed.'