ci/image: downstream of build via workflow_run; manifest-driven URLs#2118
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
PR-F (final) of six in the nightly-build redesign.
image.ymlflips from a standalone cron at 23:30 UTC to triggering onbuild.yml'sworkflow_runcompletion, and resolves firmware URLs via the gh-pages manifest instead of hardcodingreleases/download/latest.Changes
workflow_runonbuild.yml+workflow_dispatchas before.successORfailure, only skipcancelled. Missing firmware tgzs for a particular platform become silent skips insidecreate().build_id(default:channels.nightlyfrom the gh-pages manifest). Letsworkflow_dispatchassemble flash images for any historic dated nightly without code changes — useful for recovering an older known-good image after a bisect identifies a regression.jqagainstmanifest.json. Returns empty for missing platforms; the existingcreate()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).releases/download/latest/u-boot-<board>-nor.binbecauseuboot.ymluploads to thelatesttag and U-Boot has its own (manual) build cadence, not coupled to the nightly firmware cycle.Verified locally
jqresolution against the live manifest:Test plan
image.ymlmanually with no inputs — assembles images for the currentchannels.nightly.build_id=nightly-20260520-887328c— assembles for that specific historic build.build.ymlcompletes →manifest.ymlandimage.ymlboth fire viaworkflow_runand both produce fresh artifacts.What this completes
With this merge the original plan in
.claude/plans/let-s-think-about-how-fizzy-bubble.mdis fully implemented. The full PR chain across the redesign:nightly-YYYYMMDD-<short>releases, BUILD_ID in os-release--repoflag (hotfix)--channel/--build/--list-builds(1.0.50)built_at=fix; retry budgetbuild-one.ymlaccepts arbitrary commit inputcontrib/openipc-bisect🤖 Generated with Claude Code