Skip to content

Commit 241dc76

Browse files
committed
the hibernate job runs nightly and on dispatch, never on a push
The job is the slowest gate in the file and the only one whose fixture has repeatedly gone red on a product that works: the plain cycle's resume-then-reset, the Secure Boot half's poweroff that dies 180ms in, and now 2026-08-31's suspend-then-hibernate cycle, which suspended, woke on the alarm 16 seconds in, and then never hibernated while the guest stayed up. A push gate that does that is one rerun away from being ignored, and it was taxing every push with a 30 minute wait that only mattered at release time. So it moves to the daily heartbeat, which it already kept for base-drift coverage, plus workflow_dispatch. The release flow gains one explicit step, recorded in CONTRIBUTING: dispatch ci.yml on the exact commit before tagging, because this job is the only automated check that a hibernated machine comes back, and the nightly run alone cannot pin that promise to a release. What the job asserts is unchanged: boot_id across the cycle, the tmpfs marker, uptime continuity, and doctor's honesty under Secure Boot lockdown. What changes is when it is asked to prove it.
1 parent 65b88d7 commit 241dc76

2 files changed

Lines changed: 27 additions & 5 deletions

File tree

‎.github/workflows/ci.yml‎

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ jobs:
4545
# string. Changing the time in the `schedule:` block above would have
4646
# left all four matching nothing: both crons would run only the cheap
4747
# jobs, the daily boot heartbeat would stop, and the workflow would
48-
# stay green, because a skipped job is a green job.
48+
# stay green, because a skipped job is a green job. The hibernate job
49+
# consumes this output too and deliberately gates differently, daily or
50+
# dispatch and never a push; the reasons are in its own comment.
4951
#
5052
# A job rather than an `env:` value, because `env` is not available in
5153
# a job-level `if:` and actionlint says so. The cost is one runner
@@ -320,13 +322,25 @@ jobs:
320322
# this, kuma could tell exactly those machines that hibernate is ready
321323
# while logind refuses to do it. Asking both questions in one job is
322324
# cheap, because the expensive half is the install either way.
325+
#
326+
# It runs on the daily heartbeat and on a manual dispatch, and no longer
327+
# on ordinary pushes. The fixture has accumulated documented QEMU
328+
# artifact classes (a resume that resets instead of powering off, a
329+
# second-firmware poweroff that dies 180ms in, and 2026-08-31's cycle
330+
# that suspended, woke on the alarm, and then never hibernated with the
331+
# guest alive), and a push gate that goes red for a fixture reason is
332+
# one rerun away from being ignored. The nightly run keeps the coverage
333+
# a moving Fedora demands, because resume is exactly what a base update
334+
# breaks silently; the release flow dispatches this job on the exact
335+
# commit before a tag, which CONTRIBUTING records. What it loses per
336+
# push it keeps where the promise lives: this is the only automated
337+
# check that a hibernated machine comes back.
323338
hibernate:
324339
runs-on: ubuntu-latest
325340
needs: when
326341
if: >-
327-
github.event_name != 'pull_request' &&
328-
!startsWith(github.ref, 'refs/tags/') &&
329-
(github.event_name != 'schedule' || needs.when.outputs.daily == 'true')
342+
github.event_name == 'workflow_dispatch' ||
343+
(github.event_name == 'schedule' && needs.when.outputs.daily == 'true')
330344
# Longer than the install job it is built from, because it pays for
331345
# two boots and a hibernation on top of the same install.
332346
timeout-minutes: 120

‎CONTRIBUTING.md‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,15 @@ previous release.
8383
The image stage is the one part that does not repeat on a tag. Cutting a
8484
release means tagging a commit that already went green on main, so the tag
8585
names a tree those images were already built from, and building them again
86-
only delays the release. Everything else in `ci.yml` still runs on the tag.
86+
only delays the release. Everything else in `ci.yml` still runs on the tag,
87+
with one exception: the hibernate job runs on the daily heartbeat and on a
88+
manual dispatch, never on a push. It is the slowest gate in the file, its
89+
fixture has accumulated documented QEMU artifact classes, and a push gate
90+
that goes red for a fixture reason is one rerun away from being ignored.
91+
So before tagging, dispatch `ci.yml` on the exact commit you intend to tag
92+
and wait for the hibernate job: it is the only automated check that a
93+
hibernated machine comes back, and a release is the thing claiming that
94+
promise.
8795

8896
Two limits in that list worth knowing before you trust it. shellcheck reads
8997
`scripts/smoke.sh` and nothing else, so the shell that images actually run

0 commit comments

Comments
 (0)