name: Web E2E on: push: branches: [master] paths: - 'solitaire_server/web/**' - 'solitaire_server/src/**' - 'solitaire_server/e2e/**' - 'solitaire_wasm/**' - 'solitaire_web/**' - 'solitaire_engine/**' - 'solitaire_data/**' - 'solitaire_core/**' - 'Cargo.toml' - 'Cargo.lock' - 'build_wasm.sh' - '.gitea/workflows/web-e2e.yml' workflow_dispatch: jobs: web-e2e: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Install Rust uses: dtolnay/rust-toolchain@stable with: targets: wasm32-unknown-unknown - name: Cache cargo build uses: Swatinem/rust-cache@v2 # The wasm bundles (solitaire_server/web/pkg/) are not in the repo — # build them here so the served pages have real wasm to load. Tool # versions are pinned; keep in sync with solitaire_server/Dockerfile. - name: Install wasm-bindgen-cli + wasm-pack (pinned) uses: taiki-e/install-action@v2 with: tool: wasm-bindgen-cli@0.2.120,wasm-pack@0.14.0 - name: Install binaryen 130 (wasm-opt, pinned) run: | set -euo pipefail curl -sSL \ https://github.com/WebAssembly/binaryen/releases/download/version_130/binaryen-version_130-x86_64-linux.tar.gz \ | tar xz echo "$PWD/binaryen-version_130/bin" >> "$GITHUB_PATH" - name: Build WASM artifacts run: ./build_wasm.sh # Prebuild the server so Playwright's `webServer` (which runs # `cargo run -p solitaire_server`) starts from a compiled binary instead # of cold-compiling the whole dependency graph (axum/sqlx/reqwest) inside # its 120s startup window — the timeout that was failing every run. # SQLX_OFFLINE uses the checked-in `.sqlx/` query cache (no live DB). - name: Prebuild server env: SQLX_OFFLINE: 'true' run: cargo build -p solitaire_server --quiet - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' cache-dependency-path: solitaire_server/e2e/package-lock.json - name: Install e2e dependencies working-directory: solitaire_server/e2e run: npm ci - name: Install Playwright browser working-directory: solitaire_server/e2e run: npx playwright install --with-deps chromium - name: Run web e2e tests working-directory: solitaire_server/e2e run: npm test - name: Run cycle regression gate working-directory: solitaire_server/e2e run: npm run review:cycles:regression