From d87f26003b8b3da5627a3f7df6a66ffe037ea8c1 Mon Sep 17 00:00:00 2001 From: Disco DeDisco Date: Thu, 28 May 2026 14:32:04 -0400 Subject: [PATCH] CI: wrap test-two-browser-FTs commands in _retry_failed.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pipeline #351 hit a NoSuchWindowException / browsing-context-discarded flake on the LAST channels FT (test_first_done_polarity_sees_other_group_settling_message) — typical cumulative-Firefox-memory-pressure failure on a multi-browser test run as the 22nd in its bucket. Test passes locally and in isolation; no code regression. The other two FT stages (test-FTs-room, test-FTs-non-room) already route through `_retry_failed.sh`, which parses Django's FAIL:/ERROR: lines from stdout and re-runs only the failed labels. Wrapping the three two-browser-FTs commands (two-browser / sequential / channels tags) in the same script gives the channels suite the same flake recovery without slowing the happy path (first-run-green short-circuits to exit 0). Code architected by Disco DeDisco Git commit message Co-Authored-By: Claude Opus 4.7 --- .woodpecker/main.yaml | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/.woodpecker/main.yaml b/.woodpecker/main.yaml index b53b166..c6a9b19 100644 --- a/.woodpecker/main.yaml +++ b/.woodpecker/main.yaml @@ -54,9 +54,18 @@ steps: # Also collectstatic'd here; output sits in the shared workspace so # the downstream FT steps don't have to repeat it. - python manage.py collectstatic --noinput - - python manage.py test functional_tests --tag=two-browser - - python manage.py test functional_tests --tag=sequential - - python manage.py test functional_tests --tag=channels + # All three tag-stages run through `_retry_failed.sh` so a single + # browsing-context-discarded / NoSuchWindow flake on a multi-browser + # channels FT (typically the LAST test in the suite, when Firefox + # has accumulated memory pressure from 21 prior browser launches) + # costs ~30s on retry instead of failing the whole step. Matches + # the retry posture of test-FTs-room + test-FTs-non-room. First- + # run-green still exits 0 immediately — no overhead in the happy + # path. First-run-crash w. no parseable labels propagates the + # original exit (genuine infra problems aren't masked). + - bash ../.woodpecker/_retry_failed.sh functional_tests --tag=two-browser + - bash ../.woodpecker/_retry_failed.sh functional_tests --tag=sequential + - bash ../.woodpecker/_retry_failed.sh functional_tests --tag=channels when: - event: push path: