Skip to content

Commit 3d12564

Browse files
authored
chore(ci): cap the unit shards at 30 min and stop restoring stale ESLint caches (#11963)
- quality.yml fast-unit: timeout-minutes: 30. A shard finishes in ~10 min; without a ceiling a hung test process holds the PR for GitHub's 6 h default. On 2026-08-28 shard 1/4 sat 64 min without a line of output — twice at the same spot, a timing race that vanished on the third run — while the other three shards were long green. A fast red plus a re-run beats a silent multi-hour hold. - quality.yml lint-guard + the earlier ESLint cache block: drop the `restore-keys: eslint-<os>-` fallback (#11600, P-II.1 of the v3.8.50 postmortem). The key already hashes the lint config, the suppressions file and the lockfile; the fallback restored a cache built under a DIFFERENT configuration and its stale per-file verdicts are how 215 pre-existing errors stayed invisible for a cycle. Exact key or a cold full lint — never a partial cache from another configuration. check:workflows --ratchet unchanged (194/194); check-workflows suite 32/32.
1 parent d0f69e4 commit 3d12564

2 files changed

Lines changed: 17 additions & 4 deletions

File tree

.github/workflows/quality.yml

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,11 @@ jobs:
189189
.eslintcache
190190
.eslintcache-complexity
191191
key: eslint-${{ runner.os }}-${{ hashFiles('eslint.config.mjs', 'eslint.complexity-ratchets.config.mjs', 'config/quality/eslint-suppressions.json', 'package-lock.json') }}
192-
restore-keys: |
193-
eslint-${{ runner.os }}-
192+
# No restore-keys fallback on purpose (#11600, P-II.1 of the v3.8.50 postmortem): a
193+
# cache built under a different suppressions file / lint config / lockfile reports
194+
# stale per-file verdicts, which is exactly how 215 pre-existing errors stayed
195+
# invisible for a whole cycle. Exact key or a cold full lint (~13 min) — never a
196+
# partial cache from another configuration.
194197
# Security scanners — same hardened install as ci.yml quality-extended
195198
# (gh release download = authenticated, 5000 req/hr; curl to api.github.com
196199
# is rate-limited to 60/hr and silently no-ops when throttled). The blocking
@@ -460,6 +463,12 @@ jobs:
460463
# cache restore saturating the link), while the tests themselves tied, 2m54 vs 2m31. So
461464
# self-hosted is strictly worse here and there is nothing to configure.
462465
runs-on: ubuntu-latest
466+
# A shard finishes in ~10 min. Without a ceiling a hung test process holds the PR for
467+
# GitHub's 6 h default: on 2026-08-28 shard 1/4 sat 64 min without a line of output
468+
# (twice, same spot — a timing race, gone on the third run) while the other three
469+
# shards were long green. 30 min = 3x the normal wall-clock; a shard that needs more
470+
# is a hang, not a slow run, and a fast red with a re-run beats a silent 6 h hold.
471+
timeout-minutes: 30
463472
strategy:
464473
fail-fast: false
465474
matrix:
@@ -524,8 +533,11 @@ jobs:
524533
.eslintcache
525534
.eslintcache-complexity
526535
key: eslint-${{ runner.os }}-${{ hashFiles('eslint.config.mjs', 'eslint.complexity-ratchets.config.mjs', 'config/quality/eslint-suppressions.json', 'package-lock.json') }}
527-
restore-keys: |
528-
eslint-${{ runner.os }}-
536+
# No restore-keys fallback on purpose (#11600, P-II.1 of the v3.8.50 postmortem): a
537+
# cache built under a different suppressions file / lint config / lockfile reports
538+
# stale per-file verdicts, which is exactly how 215 pre-existing errors stayed
539+
# invisible for a whole cycle. Exact key or a cold full lint (~13 min) — never a
540+
# partial cache from another configuration.
529541
- name: ESLint (baseline congelado — warning novo = vermelho)
530542
# lint:json writes the report; --max-warnings 0 keeps no-new-warnings policy.
531543
run: npm run lint:json -- --max-warnings 0
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- CI hardening on the PR rail: the four `Unit Tests fast-path` shards get `timeout-minutes: 30` (a hung shard held a PR for 64 min instead of GitHub's 6 h default) and both ESLint file caches lose their `restore-keys` fallback, so a cache built under another suppressions file or lint config can no longer report stale verdicts (Refs #11600, #11924)

0 commit comments

Comments
 (0)