Skip to content

fix(ci): key the arm64 smoke job on "published an image", not "is a PR" - #215

Merged
shockalotti merged 1 commit into
mainfrom
ci/arm64-dispatch-path
Nov 3, 2026
Merged

shockalotti merged 1 commit into
mainfrom
ci/arm64-dispatch-path

Conversation

@shockalotti

Copy link
Copy Markdown
Contributor

The release dry run added in #214 immediately failed arm64-smoke, and it was right to:

IMAGE_REF: ghcr.io/calnode/calnode@
##[error]build produced no digest, so there is nothing to verify

A dry-run dispatch builds without pushing (that is the point), so there is no digest. But the job's conditions were written as "pull, unless this is a pull request", and a dispatch is not a pull request, so it took the pull path with an empty digest. Before #214, "not a pull request" was a fair proxy for "published an image"; now it is not.

Change

Key on the thing that actually matters: only a push publishes an image.

step before after
Log in to GHCR event != pull_request event == push
Pull the published digest event != pull_request event == push
Build natively event == pull_request event != push
Resolve image ref event == pull_request ? local : digest event == push ? digest : local

So a pull request and a dry-run dispatch both build and verify locally; a branch push and a tag both pull the exact digest they published.

Note

This bug is worth pointing at: the dry run found an incorrect assumption in the release path before a tag could, which is exactly why it was added. download-artifact@v8 itself passed in that same run.

The dry run added in #214 failed arm64-smoke, and the failure was correct:

  IMAGE_REF: ghcr.io/calnode/calnode@
  ##[error]build produced no digest, so there is nothing to verify

A dry-run dispatch builds without pushing, so it has no digest to pull, but the
job's conditions were written as "pull unless this is a pull request". A
dispatch is not a pull request, so it took the pull path with an empty digest.

After #214 the only event that publishes an image is a push (branch or tag), so
gate on that instead: pull the published digest on a push, and build natively
for anything else (pull request or dry-run dispatch). The resolver that picks
the ref is switched the same way.

This is the dry run doing its job: it found a bug in the release path's
assumptions before a tag could.

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

  • arm64 smoke gating keyed on push — Log in to GHCR, the digest pull, and the image resolve now key off github.event_name == 'push', with the native local build on != 'push', so a PR and a dry-run dispatch both build locally and a branch/tag push verifies the exact published digest.

The new predicate is exactly aligned with the unchanged push: ${{ github.event_name == 'push' }} on docker/build-push-action, so it matches precisely when needs.build.outputs.digest is populated. I confirmed the reported failure against run 41550048890 (dispatch): build succeeded, arm64-smoke failed on the empty digest; and the PR run 41550561340 (pull_request) skips the pull and takes the local-build path. The workflow parses as valid YAML, and ns8-module.yml has no workflow_dispatch trigger, so this bug class does not recur there.

Pullfrog  | View workflow run | Using deepseek-v4.1-flash | 𝕏

@shockalotti
shockalotti merged commit d7a7f37 into main Nov 3, 2026
11 checks passed
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