fix(ci): wire missing UTILITIES_DIGEST into promote, add real nightly-status reporting - #1666
Merged
djdomi merged 5 commits intoAug 24, 2026
Conversation
What: merge-manifests already computes utilities_digest per-service, but never re-exposed it as a job output; promote never read it either. Why: every promote run hard-failed on "Missing or malformed candidate digest for utilities" since #1556 added it, blocking ALL 8 services' channel promotion (confirmed live: nightly frozen at a 2026-08-15 commit). From: Issue #1095 | Issue #1556
… the dispatch What: new nightly-status composite action + report-nightly-status job in build-push.yml, files/updates/closes a standing issue on the real build/merge-manifests/full-setup-validate/promote outcome. Why: nightly-refresh.yml only reports its own dispatch call succeeding, never the dispatched run's real result -- masked 9 days of frozen nightly images. Adapted from wiki-mod/distcc-ng's proven pattern. From: Issue #1095
What: report-nightly-status referenced nightly-status via a wiki-mod/lancache-ng/...@current_dev remote pin, but that action is new in this same PR and does not exist on current_dev yet; the job also had no actions/checkout step before it. Why: check-action-node-versions.sh correctly failed the pin resolution, which cascaded through G7 admission into build/staging-image timeouts. From: Issue #1095 | Issue #1556
djdomi
marked this pull request as ready for review
August 24, 2026 17:46
djdomi
deleted the
fix/1095-promote-utilities-digest-and-nightly-status
branch
August 24, 2026 17:46
djdomi
added a commit
that referenced
this pull request
Aug 24, 2026
…rrent_dev What: the merge from current_dev (PR #1666's new job) reintroduced a non-aliased actions/checkout ref build-push.yml's own de-dup guard now catches; buildx-setup-retry/action.yml still pinned an older docker/setup-buildx-action digest than every other file's alias, never reached by the dependabot bump; a comment mentioned #1095 outside its own From: pointer. Why: this repo's own check-action-node-versions.sh (this PR's subject) correctly flagged all three; fixed the drift/duplication rather than the check. From: PR #1665
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.
CLD-1787880000
Summary
Fixes two real, live bugs found while investigating why PR #1659 (a pure GitHub Actions dependency bump touching zero product code) still failed CI:
promotehas hard-failed on every run sinceutilitieswas added to the service matrix (missing digest wiring), andnightly-refresh.ymlhas been reporting false daily "success" for at least 9 days while the actual nightly images sat frozen.Linked Issues
Refs #1095 | Refs #1556
What This Actually Changes
Bug 1 (the actual blocker):
merge-manifestsalready computesutilities_digestper-service internally (its loop reads the sharedCI_BUILD_SERVICESlist, which includesutilities), but never re-exposed it in the job's ownoutputs:block, andpromotenever read it either. Everypromoterun has hard-failed withMissing or malformed candidate digest for utilities: ''since utilities (#1556) was added -- blocking channel promotion for all 8 services at once (promote's own gate is all-or-nothing), not just utilities. Live-confirmed:watchdog:nightly'sorg.opencontainers.image.revisionlabel was frozen at a 2026-08-15 commit, 9 days stale, and its compose-expected compiled binary didn't even exist in that old image (a real, separate incompatibility this staleness caused).Bug 2 (why nobody noticed):
nightly-refresh.yml's only job dispatchesbuild-push.yml -f channel=nightlyvia the GitHub API and reports its own success -- which only means the dispatch request was accepted, never that the dispatched run itself succeeded. It has reported green every single day for weeks while today's actual dispatched run (and, per Bug 1, likely most others) failed atpromote.What This PR Fixes / Adds
build-push.yml: wiresUTILITIES_DIGESTintomerge-manifests'soutputs:andpromote's env/candidate_digestsmap, matching the existing 9-service pattern exactly..github/actions/nightly-statuscomposite action +report.sh: files, updates, or closes one standingnightly-brokenissue based on a nightly dispatch's real result. Adapted fromwiki-mod/distcc-ng's already-provennightly-statusaction (same design: one reused standing issue across consecutive failures, closed automatically on the next success,DRY_RUNsupport,Bugissue-type assignment, explicit project-board add viaPROJECT_AUTOMATION_PATsinceGITHUB_TOKEN-authored issues suppress theissues:openedwebhookadd-to-project.ymlrelies on).report-nightly-statusjob inbuild-push.yml, gated toworkflow_dispatch+channel == 'nightly'only (never fires on push/PR),needs: [build, build-arm64, merge-manifests, full-setup-validate, promote]withif: always()so it fires even when an earlier stage fails, computing the real outcome from those jobs' actual results.What Changed In Code
.github/workflows/build-push.yml: 3-line digest fix (Bug 1) + newreport-nightly-statusjob (~45 lines, appended at file end)..github/actions/nightly-status/action.yml+report.sh: new composite action, ported from distcc-ng.Why This Matters For Users / Operators
No operator-visible runtime change -- this is CI-internal. It does fix a real, currently-live gap: operators/maintainers evaluating
nightlywere getting a 9-day-stale, now-incompatible image, with the daily automation actively reporting "all fine" throughout. This also unblocks every future nightly/manual-dispatch promote attempt, not just today's.Scope Boundaries
Deliberately does not: apply the same real-outcome-reporting fix to the daily
latest-channelschedule:cron (a separate trigger, not investigated here) or to any push-triggered promote failure (those already have PR/commit-status visibility; the standing-issue mechanism specifically targets off-hours/unattended scheduled runs where nobody is watching in real time, matching distcc-ng's own scope). Does not touchpromote's all-or-nothing gate itself (tracked separately as G16 on #1095) -- this PR only unblocks the one concrete cause that gate is currently tripping on.Risk / Rollback / Follow-up
latest-channel daily cron; G16 (promote's all-or-nothing gate).Local Scope Evidence
Validation
All run for real inside the pinned
build-toolscontainer (AG-VAL-016) on a self-hosted runner (lancache-229), except thegh-dependent parts ofreport.sh(that CLI is not installed in the build-tools image -- these composite-action steps run natively on the runner, same as every othergh-calling composite action in this repo, e.g.pr-tracking-metadata-fetch-and-validate):bash scripts/tracked/check-file-headers.sh,check-review-chronology-comments.sh(AG-CODE-012 duplicate-reference guard),check-workflow-line-limit.sh-- all exit 0.actionlint .github/workflows/build-push.yml-- exit 0, resolves the newreport-nightly-statusjob and itsnightly-statusaction reference cleanly.shellcheck --severity=warning .github/actions/nightly-status/report.sh-- exit 0.report.shrun for real (not just syntax-checked) against the live repo withDRY_RUN=trueand a realGH_TOKEN: both the "failure, no existing standing issue" path (correctly previewsgh label create+gh issue createwith the right body/title) and the "success, no existing standing issue" path (correctly no-ops) verified against realgh issue listAPI reads.merge-manifests'screate-trusted-manifests/create-pr-staging-manifestssteps both already emitutilities_digestvia their generic per-serviceGITHUB_OUTPUTloop (confirmed by reading the actualprintfline); only the job-leveloutputs:re-export andpromote's own env/map were missing.Type of change
Changelog
Fixes
promotehard-failing on every run sinceutilitieswas added to the service matrix (missingUTILITIES_DIGESTwiring), which had frozen thenightlychannel 9 days stale. Adds a distcc-ng-style standing-issue mechanism so a future nightly-dispatch failure is actually visible, instead ofnightly-refresh.ymlreporting a false daily "success". No operator-visible runtime change.