From ca70c9df7f843409cb9d8f599f4b54b81e98d063 Mon Sep 17 00:00:00 2001 From: Steffen Maechtel Date: Fri, 11 Sep 2026 21:57:32 +0200 Subject: [PATCH] ci: run all test workflows weekly on master (issue #78) --- .github/workflows/test-e2e-ddev.yml | 21 +++++++++++++++++---- .github/workflows/test-e2e.yml | 16 ++++++++++++++-- .github/workflows/test-unit.yml | 14 ++++++++++++-- CONTRIBUTING.md | 6 ++++++ docs/design/ddev-e2e-test.md | 7 ++++++- 5 files changed, 55 insertions(+), 9 deletions(-) diff --git a/.github/workflows/test-e2e-ddev.yml b/.github/workflows/test-e2e-ddev.yml index 7a39dd6..109d1c8 100644 --- a/.github/workflows/test-e2e-ddev.yml +++ b/.github/workflows/test-e2e-ddev.yml @@ -6,9 +6,14 @@ name: test-e2e-ddev # ddev project lifecycle — too heavy per PR, but master is the staging # area for the 'stable' release mirror and must be fully green before a # release is cut (scripts/release.sh includes these runs in its CI gate). -# Push runs use the defaults (no camino site tier, latest ddev); the -# inputs only apply to manual dispatch. CI rebuilds the golden image warm -# every run (the cache is a local-workspace concept, design doc §6 R6). +# A weekly schedule (Mon 03:27 UTC, issue #78) re-runs the suite on +# master even when nothing was pushed — the design doc's planned +# burn-in (§8/R6): the suite installs the LATEST ddev and rebuilds the +# golden image warm from scratch, catching ddev/opencode release drift +# between pushes. Push and scheduled runs use the defaults (no camino +# site tier, latest ddev); the inputs only apply to manual dispatch. +# CI rebuilds the golden image warm every run (the cache is a +# local-workspace concept, design doc §6 R6). on: push: branches: @@ -25,12 +30,20 @@ on: required: false default: '' type: string + schedule: + - cron: '27 3 * * 1' # Mondays 03:27 UTC (after test-e2e's verdict) permissions: contents: read +# Cancel a superseded run when a new commit lands on the same ref; also +# dedupes if two events somehow fire for the same push. Scheduled runs +# get their own group: a weekly run must never cancel an in-flight +# push run of the same ref (a cancelled run on a master sha reads as +# red to scripts/release.sh's CI gate) — and conversely stays alive to +# deliver its drift verdict even when master moves under it. concurrency: - group: e2e-ddev-${{ github.ref }} + group: e2e-ddev-${{ github.event_name == 'schedule' && 'weekly' || github.ref }} cancel-in-progress: true jobs: diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index bb58c86..bd14a83 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -7,6 +7,12 @@ name: test-e2e # staging area for the 'stable' release mirror — it must be green before # a release is cut (scripts/release.sh checks exactly this run). A # branch push with an open PR fires only `pull_request` — no double-run. +# A weekly schedule (Mon 03:17 UTC, issue #78) re-runs both suites on +# master even when nothing was pushed: the suites resolve the LATEST +# opencode release at runtime, so a new opencode version can break a +# "green" master between pushes — the cron catches that drift before a +# release is cut. Scheduled runs use the defaults (E2E_STRICT=0, like +# push runs; the strict input only applies to manual dispatch). on: workflow_dispatch: inputs: @@ -21,6 +27,8 @@ on: push: branches: - master + schedule: + - cron: '17 3 * * 1' # Mondays 03:17 UTC (after test-unit's verdict) # Least-privilege token (CodeQL actions/missing-workflow-permissions): # read-only access is enough (checkout + cache only — no artifacts, @@ -29,9 +37,13 @@ permissions: contents: read # Cancel a superseded run when a new commit lands on the same ref; also -# dedupes if two events somehow fire for the same push. +# dedupes if two events somehow fire for the same push. Scheduled runs +# get their own group: a weekly run must never cancel an in-flight +# push/PR run of the same ref (a cancelled run on a master sha reads as +# red to scripts/release.sh's CI gate) — and conversely stays alive to +# deliver its drift verdict even when master moves under it. concurrency: - group: e2e-${{ github.ref }} + group: e2e-${{ github.event_name == 'schedule' && 'weekly' || github.ref }} cancel-in-progress: true jobs: diff --git a/.github/workflows/test-unit.yml b/.github/workflows/test-unit.yml index e7eac9e..6f8fbbf 100644 --- a/.github/workflows/test-unit.yml +++ b/.github/workflows/test-unit.yml @@ -7,6 +7,10 @@ name: test-unit # 'stable' release mirror — it must be green before a release is cut # (scripts/release.sh checks exactly this run). A branch push with an # open PR fires only `pull_request`, avoiding the classic double-run. +# A weekly schedule (Mon 03:07 UTC, issue #78) re-runs the suite on +# master even when nothing was pushed — runner image updates +# (ubuntu-latest) and environment drift can break a "green" master +# between releases. Scheduled runs always target the default branch. on: pull_request: branches: @@ -15,6 +19,8 @@ on: branches: - master workflow_dispatch: + schedule: + - cron: '7 3 * * 1' # Mondays 03:07 UTC (off-peak, off the hour) # Least-privilege token (CodeQL actions/missing-workflow-permissions): # read-only access to the repository is all this workflow needs. @@ -22,9 +28,13 @@ permissions: contents: read # Cancel a superseded run when a new commit lands on the same ref; also -# dedupes if two events somehow fire for the same push. +# dedupes if two events somehow fire for the same push. Scheduled runs +# get their own group: a weekly run must never cancel an in-flight +# push/PR run of the same ref (a cancelled run on a master sha reads as +# red to scripts/release.sh's CI gate) — and conversely stays alive to +# deliver its drift verdict even when master moves under it. concurrency: - group: tests-${{ github.ref }} + group: tests-${{ github.event_name == 'schedule' && 'weekly' || github.ref }} cancel-in-progress: true jobs: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e88b369..50e6031 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -41,6 +41,12 @@ make e2e-rootless # docker-rootless daemon suite (needs systemd-in-containe - When adding a new executable under `files/` or a new test script under `tests/`, add it to the `chmod +x` list in **both** `.github/workflows/test-unit.yml` and `.github/workflows/test-e2e.yml`. +- Besides PRs and `master` pushes, CI runs a **weekly scheduled** burn-in + on `master` (Mondays ~03:00 UTC, issue #78): the e2e suites install the + *latest* opencode/ddev releases at runtime, so the schedule catches + environment drift on a "green" master even when nothing was pushed. + Scheduled runs use their own concurrency group — they never cancel + push/PR runs, and a red weekly run blocks the next release by design. ## Testing a branch on a real machine diff --git a/docs/design/ddev-e2e-test.md b/docs/design/ddev-e2e-test.md index c5fd310..80c230c 100644 --- a/docs/design/ddev-e2e-test.md +++ b/docs/design/ddev-e2e-test.md @@ -15,6 +15,8 @@ > **master push** (plus `workflow_dispatch` on demand) — master is the > staging area for the `stable` mirror and must be fully green before a > release is cut; PRs stay excluded (test-e2e.yml keeps the PR gate). +> The planned weekly `schedule` itself landed 2026-09-11 (issue #78) +> on all three workflows, including this one. > > Original framing, kept for context: a third e2e suite answering the > recurring burn-in problem — most ddev issues (#18, #20, #21, #25, the @@ -423,7 +425,10 @@ bare-origin flow (DD12). **First green GitHub run (full camino tier): 2026-08-23** — after two plain-Linux fixes the workspace could not catch (R9 hosts seeding, R10 fixture group baseline). Both prior failing runs are pinned in the - issue tracker. Weekly `schedule` is now unblocked. + issue tracker. Weekly `schedule` shipped 2026-09-11 (issue #78): + Mondays 03:27 UTC, defaults only (no camino tier, latest ddev), in a + dedicated concurrency group so a scheduled run can never cancel an + in-flight push run (release.sh reads a cancelled run as red). - **Docs:** this record + a MANUAL.md "troubleshooting with e2e-ddev" note + README testing mention in the same PR as the runner (repo rule: docs move with code).