Files
superset2/.github/workflows/bashlib.sh
Claude Code a43f3a421b ci: run E2E backend under gunicorn instead of flask dev server
Both `cypress-run-all` and `playwright-run` started the Superset backend
with `flask run --no-debugger -p $port`. The Flask development server is
single-threaded and has no crash-recovery, so heavy tests — most notably
`playwright/tests/dashboard/export.spec.ts:61` (Export YAML) and
`dashboard-list.spec.ts:266` (Import zip) — can knock the backend offline
for the rest of the run. Subsequent tests then cascade-fail with
`ECONNREFUSED`, `socket hang up`, `Missing CSRF token`, and
`page.goto: net::ERR_ABORTED; maybe frame was detached`.

Across the last 50 master runs of the E2E workflow, 6 failed (12%),
every single one with this signature.

Switch both runners to gunicorn with the same shape used in
`docker/entrypoints/run-server.sh`:

- `--workers 4 --worker-class gthread --threads 20` — concurrency that
  matches what the real product runs.
- `--timeout 120` — kill stuck workers instead of letting them hang the
  entire suite.
- `--max-requests 500 --max-requests-jitter 50` — recycle workers
  periodically so memory accumulation from long suites doesn't OOM the
  process.
- `--access-logfile - --error-logfile -` — keep the same per-run log
  capture pattern.

Only frontend (JS) coverage is captured in E2E (verified — bashlib.sh
only instruments the JS assets), so multi-worker gunicorn doesn't break
the existing coverage path.
2026-05-18 23:08:14 -05:00

11 KiB