Skip to content

Take the nightly off GitHub's scheduler - #137

Merged
openipc-ai merged 1 commit into
masterfrom
ci/host-driven-release-trigger
Aug 29, 2026
Merged

Take the nightly off GitHub's scheduler#137
openipc-ai merged 1 commit into
masterfrom
ci/host-driven-release-trigger

Conversation

@openipc-ai

Copy link
Copy Markdown
Contributor

What

Removes the schedule: '0 3 * * *' trigger. No gate change was needed here — see below.

Last stage of a three-stage release train. Companion PRs: widgetii/majestic#496 and OpenIPC/firmware#2334. The ordering moves to the machine that runs majestic's self-hosted runners, which dispatches each stage and waits for it to succeed before starting the next.

Why

From 2026-08-26 GitHub delivered scheduled events hours late, independently per repo. This repository was the worst affected of the three — a 03:00 slot sits in the deepest part of the congestion band:

Date majestic (17:25) firmware (22:30) builder (03:00)
08-25 +25m +22m +42m
08-26 +1h57m +4h55m +49m
08-27 +8h07m +7h42m +10h38m
08-28 +7h35m +5h16m +11h49m

On the 08-28 cycle that made this stage run first, at 14:49 — ahead of both repositories it is supposed to follow. It went green, as it always would: nothing here checks that its inputs are newer than the ones it used last time.

Not ours and not fixable here: for every late run created_at == run_started_at to the second, so all the lost time is upstream of run creation, inside GitHub's dispatcher. Moving the cron off the top of the hour and pushing a commit to "resync" the schedule were both tried on the majestic side; neither did anything.

Why this one needs no gate change

majestic and firmware both skip when nothing has changed, and both keyed that skip on event_name == 'schedule' — which a dispatch would have silently made unreachable, turning every night into a full unconditional matrix. This repository deliberately always builds (should_build=true, because builder.sh re-clones OpenIPC/firmware at HEAD and the relevant inputs are mostly outside this repo), so there was no event-name condition to go stale. The preflight comment now records that, so the asymmetry with the other two repos is not mistaken for an oversight.

Not in this PR

firmware-drift.yml keeps its schedule: '0 5 * * *'. It is not part of the release train — it reads both trees and files an issue, publishes nothing, and late delivery only means a late issue. Flagging it rather than changing it silently.

Verification

  • .github/scripts/ci-matrix.py --self-test — 111 devices, 15 smoke, 39 cases, passes.
  • Workflow YAML parses.
  • Four comments that described behaviour as "on schedule" or "every cron run" are corrected to "nightly"; the behaviour they describe is unchanged.

This is the last stage of a three-stage release train — widgetii/majestic
publishes the majestic tarball, OpenIPC/firmware builds the images, this builds
from that tree. Each stage was its own GitHub cron sized against a guess at the
previous stage's runtime: 17:25, 22:30 and 03:00 UTC.

From 2026-08-26 GitHub began delivering scheduled events hours late and
independently per repo, and this repository was the worst affected of the three
— +10h38m and +11h49m on successive nights, a 03:00 slot sitting in the deepest
part of the congestion band. On the 08-28 cycle that made this stage run FIRST,
at 14:49, ahead of both the repositories it is supposed to follow. It went
green, as it always would: no stage checks that its inputs are newer than the
ones it used last time.

The delay is not ours and not fixable here: for every late run
`created_at == run_started_at` to the second, so all of it sits upstream of run
creation, inside GitHub's dispatcher. Moving the cron off the top of the hour
and pushing a commit to resync the schedule were both tried on the majestic
side; neither changed anything.

The ordering moves to the host that runs majestic's self-hosted runners, which
dispatches each stage in turn and waits for it to succeed before starting the
next.

Unlike majestic and firmware this needed no gate change, and the preflight
comment now says why: those two skip when nothing has changed and keyed that
skip on the event name, which a dispatch would have made unreachable. This one
deliberately always builds, so there was no event-name condition to go stale.

The clone guard rail keeps its logic and loses half its argument: an inherited
workflow can no longer run nightly and unattended on a stranger's Actions bill,
but it can still do so on every internal PR.
@qodo-free-for-open-source-projects

Copy link
Copy Markdown

PR Summary by Qodo

Remove GitHub Cron from Builder Nightly Workflow

⚙️ Configuration changes 📝 Documentation 🕐 Less than 10 minutes

Grey Divider

AI Description

• Removes the unreliable GitHub cron trigger from the nightly builder workflow.
• Leaves nightly sequencing to the host coordinating the three-repository release train.
• Documents why unconditional builds require no event-name gate changes.
Diagram

graph TD
  H{{"Host Coordinator"}} -->|dispatch| M["Majestic Release"] -->|success| F["Firmware Build"] -->|success| B["Builder Nightly"]
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Cross-repository workflow chaining
  • ➕ Keeps orchestration within GitHub Actions
  • ➕ Can encode upstream success dependencies explicitly
  • ➖ Requires cross-repository credentials and dispatch plumbing
  • ➖ Still depends on GitHub event delivery and repository-level coordination
2. Retain cron with freshness gates
  • ➕ Avoids reliance on an external coordinator
  • ➕ Allows each repository to remain independently scheduled
  • ➖ Cannot guarantee stage ordering during scheduler delays
  • ➖ Adds state and input-version checks to every stage

Recommendation: Use the host-driven coordinator as proposed because it establishes deterministic, success-based ordering across repositories and avoids GitHub's unreliable scheduled-event dispatcher. Cross-repository chaining is viable longer term, but adds credential and event-delivery complexity without improving this targeted change.

Files changed (1) +35 / -9

Other (1) +35 / -9
master.ymlRemove scheduled nightly trigger and document host-driven sequencing +35/-9

Remove scheduled nightly trigger and document host-driven sequencing

• Deletes the 03:00 GitHub Actions cron so nightly builds are initiated by the external release-train coordinator through the existing manual dispatch trigger. Updates workflow comments to explain the scheduler incident, retained unconditional build gate, mirror safeguards, and nightly cache behavior.

.github/workflows/master.yml

@qodo-free-for-open-source-projects

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0)

Grey Divider

Great, no issues found!

Qodo reviewed your code and found no material issues that require review

Grey Divider

Tip of the day
💡 Did you know, you can group findings by type and pick your Finding display, from Minimal to Full

More tips ↗ | Customize Qodo ↗ | Qodo docs ↗

Grey Divider

Qodo Logo

@openipc-ai
openipc-ai merged commit 96fc556 into master Aug 29, 2026
20 checks passed
@openipc-ai
openipc-ai deleted the ci/host-driven-release-trigger branch August 29, 2026 20:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant