Skip to content

ci/image: downstream of build via workflow_run; manifest-driven URLs#2118

Merged
widgetii merged 1 commit into
masterfrom
ci/image-downstream-of-build
May 21, 2026
Merged

ci/image: downstream of build via workflow_run; manifest-driven URLs#2118
widgetii merged 1 commit into
masterfrom
ci/image-downstream-of-build

Conversation

@widgetii
Copy link
Copy Markdown
Member

Summary

PR-F (final) of six in the nightly-build redesign. image.yml flips from a standalone cron at 23:30 UTC to triggering on build.yml's workflow_run completion, and resolves firmware URLs via the gh-pages manifest instead of hardcoding releases/download/latest.

Changes

  • Trigger: drop the independent 23:30 UTC cron; trigger via workflow_run on build.yml + workflow_dispatch as before.
  • Partial-failure tolerance (matches ci/manifest: publish on partial failure; fix built_at=; extend retry budget #2115): run on success OR failure, only skip cancelled. Missing firmware tgzs for a particular platform become silent skips inside create().
  • New optional input build_id (default: channels.nightly from the gh-pages manifest). Lets workflow_dispatch assemble flash images for any historic dated nightly without code changes — useful for recovering an older known-good image after a bisect identifies a regression.
  • Manifest-driven URL resolution for firmware tgzs via jq against manifest.json. Returns empty for missing platforms; the existing create() skip-on-empty path handles that cleanly (matches pre-PR behaviour for boards the build matrix doesn't cover, e.g. ssc325_ultimate, t10_ultimate).
  • U-Boot binaries unchanged — still come from releases/download/latest/u-boot-<board>-nor.bin because uboot.yml uploads to the latest tag and U-Boot has its own (manual) build cadence, not coupled to the nightly firmware cycle.

Verified locally

jq resolution against the live manifest:

  ssc335_lite: openipc.ssc335-nor-lite.tgz
  ssc335_ultimate: openipc.ssc335-nor-ultimate.tgz
  ssc325_ultimate: <not in manifest — skip>
  t31_lite: openipc.t31-nor-lite.tgz
  t31_ultimate: openipc.t31-nor-ultimate.tgz
  v851s_lite: openipc.v851s-nor-lite.tgz
  t10_ultimate: <not in manifest — skip>

Test plan

  • CI passes on this PR.
  • After merge, dispatch image.yml manually with no inputs — assembles images for the current channels.nightly.
  • Dispatch with build_id=nightly-20260520-887328c — assembles for that specific historic build.
  • Tonight's cron: build.yml completes → manifest.yml and image.yml both fire via workflow_run and both produce fresh artifacts.

What this completes

With this merge the original plan in .claude/plans/let-s-think-about-how-fizzy-bubble.md is fully implemented. The full PR chain across the redesign:

🤖 Generated with Claude Code

image.yml flips from a standalone cron at 23:30 UTC to triggering on
build.yml's workflow_run completion. It no longer fires for nothing
when build.yml's SHA-gate skips (PR #2111) and no longer runs against
a stale `latest` tag when build.yml has been updated but the cron
hasn't ticked yet.

Changes:
- Drop the independent 23:30 UTC cron; trigger via workflow_run on
  build.yml + workflow_dispatch as before.
- Same partial-failure tolerance as manifest.yml (PR #2115): run on
  success OR failure, only skip cancelled. Missing firmware tgzs for a
  particular platform become silent skips inside create() rather than
  workflow-level abort.
- New optional input: build_id (default: channels.nightly from the
  gh-pages manifest). Lets workflow_dispatch assemble flash images for
  any historic dated nightly without code changes — useful for
  recovering an older known-good image after a bisect identifies a
  regression.
- Replace the hardcoded `releases/download/latest/openipc.<soc>...tgz`
  with jq lookup against manifest.json (`.builds[] | select(.id==$b) |
  .platforms[$p].nor.url`). Returns empty for missing platforms; the
  existing create() skip-on-empty path handles that cleanly — matches
  pre-PR behaviour for boards that build.yml's matrix doesn't cover
  (e.g. ssc325_ultimate, t10_ultimate).
- U-boot binaries continue to come from `releases/download/latest/
  u-boot-<board>-nor.bin` because uboot.yml uploads to the latest tag
  and u-boot has its own (manual) build cadence — not coupled to the
  nightly firmware cycle.

Verified locally: jq resolution against the live manifest gives the
expected URLs for ssc335_{lite,ultimate}, t31_{lite,ultimate},
v851s_lite, and correctly returns empty for ssc325_ultimate /
t10_ultimate (which the build matrix doesn't cover).

PR-F (final) of six. With this merged the original plan from
.claude/plans/let-s-think-about-how-fizzy-bubble.md is fully
implemented.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@widgetii widgetii merged commit 2587ff8 into master May 21, 2026
93 checks passed
@widgetii widgetii deleted the ci/image-downstream-of-build branch May 21, 2026 08:52
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