diff --git a/.gitea/workflows/check.yml b/.gitea/workflows/check.yml index ee73864..a58a9cc 100644 --- a/.gitea/workflows/check.yml +++ b/.gitea/workflows/check.yml @@ -3,6 +3,9 @@ on: [push] jobs: check: runs-on: ubuntu-latest + # Bounds script/cibuild, a cold-cache build included, so a hang frees + # the shared runner. README.md "In CI" has the measured times. + timeout-minutes: 10 steps: # actions/checkout v4.2.2, 2026-02-22 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 diff --git a/.gitea/workflows/e2e.yml b/.gitea/workflows/e2e.yml index 53313e5..d15adeb 100644 --- a/.gitea/workflows/e2e.yml +++ b/.gitea/workflows/e2e.yml @@ -35,6 +35,10 @@ on: [push] jobs: e2e-chrome: runs-on: ubuntu-latest + # Bounds the image build, a cold cache included, and both Chrome + # programs, so a hung browser frees the shared runner. README.md + # "In CI" has the measured times. + timeout-minutes: 20 steps: # actions/checkout v4.2.2, 2026-02-22 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 @@ -42,6 +46,10 @@ jobs: e2e-firefox: runs-on: ubuntu-latest + # Bounds the image build, a cold cache included, and both Firefox + # programs, so a hung browser frees the shared runner. README.md + # "In CI" has the measured times. + timeout-minutes: 15 steps: # actions/checkout v4.2.2, 2026-02-22 - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 diff --git a/README.md b/README.md index c6f3ae9..ab3472f 100644 --- a/README.md +++ b/README.md @@ -643,12 +643,20 @@ Nothing in either job can pass vacuously. There is no `continue-on-error` and no build fails, and when the browser fails to start; the Chrome harness aborts the suite outright if its network interception is not in effect. -Measured on this repo's runner: `e2e-chrome` about 1m55s cold, almost all of it -the one-time pull of the pinned ~800MB Playwright layer, and well under a minute -once that layer is cached. `e2e-firefox` about 1m05s cold, and it caches its -Firefox and geckodriver downloads the same way. The `e2e-chrome` figures predate -the two cases that wait for a receipt to end in error, which add about two -minutes of real waiting. +Measured on this repo's runner in the green runs of early October 2026, from a +warm docker cache to a cold one: `check` 49s to 3m37s, `e2e-chrome` 1m44s to +4m48s, and `e2e-firefox` 31s to 4m07s. A cold cache adds three to four minutes +to each job, spent rebuilding its image: reinstalling dependencies and, for +`e2e-firefox`, installing Firefox, geckodriver and their system libraries. Those +`e2e-chrome` runs predate the cases that wait in real time for a receipt to end +in error. `make test-e2e` now takes 3m51s locally with its image cached, so a +cold `e2e-chrome` run comes to about seven minutes. + +Every job has a `timeout-minutes` cap, so a hung build or browser ends the job +instead of holding the shared runner: `check` 10 minutes, `e2e-firefox` 15 and +`e2e-chrome` 20, each over two and a half times the job's slowest cold run. A +job that reaches its cap has hung; read it as a hang, not as a slow run to +retry. ### Element id guard (part of `make check`) diff --git a/TODO.md b/TODO.md index 6feb978..acb7e14 100644 --- a/TODO.md +++ b/TODO.md @@ -45,6 +45,12 @@ but the review is broader than any of them. # Completed Steps +- 2026-10-05: Every CI job has a `timeout-minutes` cap + ([#294](https://git.eeqj.de/sneak/AutistMask/issues/294)): `check` 10 minutes, + `e2e-firefox` 15 and `e2e-chrome` 20, each over two and a half times the job's + slowest cold-cache run. A hung build or browser now ends its job instead of + holding the shared runner for hours. + - 2026-10-05: The popup's Content Security Policy no longer allows inline style ([#328](https://git.eeqj.de/sneak/AutistMask/issues/328)): `style-src` is `'self'` in both manifests, pinned in `tests/manifest.test.js`. The 42