## Why Last CI run on a PR took **~16m 36s** wall (browser-tests dominated). Total CPU ~34 min. Several easy wins identified. ## Baseline (run 25169327223) | Job | Wall | Critical step | |---|---|---| | browser-tests | 16m 36s | Browser Tests 718s, Build 166s, Playwright 50s | | tests | 9m 38s | Tests 334s, Build 173s | | performance-tests | 4m 19s | Build 173s | | linter | 2m 54s | Pint 109s | | static-analysis | 36s | — | ## Changes (one commit each) **A. Shard browser tests 4×** — `pest --shard=N/4` matrix. ~12 min → ~3 min critical path. **B. Build assets once, share via artifact** — new `build-assets` job uploads `public/build`; tests/browser-tests/performance-tests download it. Saves ~340s of duplicated CPU. **C. Disable xdebug in tests job** — `coverage: xdebug` was set but `--coverage` never passed. Silent ~30-50% slowdown. **D. Parallel Pest with Testcontainers** — `pest --parallel --processes=4`, `TESTCONTAINERS=true` so each worker gets isolated MySQL. Drops job-level mysql service. **E. Cache composer + bun deps** — `actions/cache` for composer cache dir and `~/.bun/install/cache` keyed on lockfiles. Saves 30-60s/job warm. **F. Cache Playwright browsers** — cache `~/.cache/ms-playwright` keyed on bun.lock; on hit only runs `install-deps`. Saves ~50s. **G. Pint parallel + cache** — `--parallel --cache-file=.pint.cache` with persisted cache. ~109s → ~5-10s warm. ## Expected wall time after Browser shards become critical path: **~6-7 min** (down from 16-17 min). ## Risks - **D**: 4 paratest workers each spawn a MySQL container — watch RAM/runner load. Drop to `--processes=2` if flaky. - **A**: more concurrent runners. Adjust shard count if MySQL service init becomes the new bottleneck per shard. - **B**: `build-assets` is now a hard dep for tests/browser-tests/performance-tests. ## Test plan CI itself is the test. Watch this PR run, compare timings to baseline. |
||
|---|---|---|
| .. | ||
| automerge.yml | ||
| ci.yml | ||
| release.yml | ||