Repository navigation
ci: pin every action to a Node 24 major, by commit SHA - #169
Conversation
Every job logs "Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24". GitHub's changelog (2025-09-19, editor's note 2026-08-25): Node 24 is the default since 2026-06-16, and the Node 20 opt-out stops working when Node 20 is removed from the runners on 2026-09-23. Whether a node20-declared action then errors is not stated; today they run on the forced Node 24 and pass. This moves 69 uses: references in 15 workflow files to majors that declare node24, so nothing here depends on a fallback GitHub calls temporary. Pinned by commit SHA with the release tag in a comment (OpenSSF Pinned-Dependencies), each SHA resolved from the exact release tag and confirmed identical to what the floating major tag points at: actions/checkout -> 3d3c42e # v7.0.1 (runs.using: node24) actions/configure-pages -> 45bfe01 # v6.0.0 (runs.using: node24) actions/deploy-pages -> 368f825 # v5.0.1 (runs.using: node24) actions/download-artifact -> 3e5f45b # v8.0.1 (runs.using: node24) actions/github-script -> 3a2844b # v9.0.0 (runs.using: node24) actions/setup-python -> 5fda3b9 # v7.0.0 (runs.using: node24) actions/upload-artifact -> 043fb46 # v7.0.1 (runs.using: node24) actions/upload-pages-artifact -> fc324d3 # v5.0.0 (runs.using: composite) github/codeql-action -> b96794f # v4.38.0 (runs.using: composite) softprops/action-gh-release -> efb3536 # v3.0.3 (runs.using: node24) Breaking-change audit against this repository's usages, from each action's release notes: download-artifact is used by name or by pattern with merge-multiple (v5's single-ID path change: "no action needed"; v8's digest-mismatch=error default is wanted); github-script scripts use only the injected github/context objects, never require(); codecov uses files/flags, both still accepted; codeql-action v4's bundle minimum is met on hosted runners and init's languages/config-file inputs are unchanged; configure-pages v5's break is Next.js-only; checkout/setup-python/ upload-artifact/cache/deploy-pages/gh-release majors are runtime-only (runner >= 2.327.1, met by every hosted image used here; no self-hosted runner exists in this org). Only workflow files that no open pull request modifies are touched, so this cannot conflict with the review queue; the rest are listed in the PR and follow once those PRs land. Verified: every file parsed before and after, with the parsed structure asserted equal apart from uses: values -- triggers, job names, job-level keys, step count and every non-uses step key unchanged, line endings unchanged. pytest 47 passed. Closes embeddedos-org#168
|
Run evidence for this head ( Exercised by this PR's own
The remaining 7 bumped files ( No warning of the form "actions target Node.js 20" appears on any job of this run; the base's runs carry it on every job. |
srpatcha
left a comment
There was a problem hiding this comment.
All 12 new SHA pins match their tags (checked with gh api). But the PR claims to pin every action, and 34 floating refs remain, including 10 in ci.yml (e.g. ci.yml:31 actions/checkout@v4, :172 upload-artifact@v4), the very Node-20 actions this PR targets. Others are in eos-simulation.yml (13), claude-code-review.yml (4), release.yml (3), upstream-drift.yml (3) and scorecard.yml (1). Please finish the pinning, or retitle and split.
|
Daily-loop code review (the loop does review; not a merge). Spot-verified the SHA pins: One scoping note: this PR pins eos's workflows to the new majors, which overlaps the org-wide Node-20 action-majors sweep that is currently awaiting Aswin's direction. If the sweep goes ahead org-wide, this PR's pins should be reconciled with whatever the sweep lands (same SHAs, ideally) rather than drifting. No action needed from the author — leaving the merge decision to the maintainers. |
Review on this PR found 34 refs still floating; after merging master
(claude-code-review.yml is gone) 30 remained in ci.yml, eos-simulation.yml,
release.yml, upstream-drift.yml and scorecard.yml. All are now pinned, using
the same versions this PR already pins elsewhere:
actions/checkout v7.0.1 3d3c42e5
actions/upload-artifact v7.0.1 043fb46d
actions/download-artifact v8.0.1 3e5f45b2
actions/setup-python v7.0.0 5fda3b95
softprops/action-gh-release v3.0.3 efb35369
anchore/sbom-action v0.24.3 66cbf4bc (newest v0)
sigstore/cosign-installer v3.10.1 7e8b541e (newest v3; composite, no
Node; v4 changes cosign's default)
ossf/scorecard-action v2.4.4 2d114668 (newest v2)
Each SHA was resolved from its tag with gh api (annotated tags
dereferenced). grep finds 0 non-SHA `uses:` refs under .github/;
actionlint 1.7.12 passes.
|
Pushed cfe8f23 (master merged in, claude-code-review.yml now gone): the remaining 30 floating refs are pinned by SHA, using the versions this PR already pins (checkout v7.0.1, upload v7.0.1, download v8.0.1, setup-python v7.0.0, gh-release v3.0.3), plus sbom-action v0.24.3, cosign-installer v3.10.1 (kept on v3; it is composite) and scorecard v2.4.4. SHAs were resolved with gh api. grep finds 0 non-SHA |
Closes #168
Why now, precisely
Every job in this repository logs, on every run: "Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@v4, actions/setup-python@v5, …" — 21 such warnings on a single ebuild run (35207728484).
GitHub's changelog (2025-09-19, editor's note of 2026-08-25), quoted: "Beginning on June 16th, 2026, runners will begin using Node24 by default"; the opt-out
ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true"will only work until we upgrade the runner and remove Node20 on September 23rd, 2026." What the changelog does not say is whether anode20-declared action errors after the 23rd — today ours run on the forced Node 24 and pass. This PR does not claim they will break; it removes the dependence on a fallback GitHub calls temporary, six days before it ends.What changed
69
uses:references in 15 files, each moved from a major whoseaction.ymldeclaresnode20to the current major that declaresnode24— pinned by commit SHA with the release tag in a comment (OpenSSF Pinned-Dependencies, the same formscorecard.ymlalready uses). Each SHA was resolved from the exact release tag through the GitHub API and confirmed identical to what the floating major tag points at:runs.usingactions/checkout3d3c42enode24actions/configure-pages45bfe01node24actions/deploy-pages368f825node24actions/download-artifact3e5f45bnode24actions/github-script3a2844bnode24actions/setup-python5fda3b9node24actions/upload-artifact043fb46node24actions/upload-pages-artifactfc324d3compositegithub/codeql-actionb96794fcompositesoftprops/action-gh-releaseefb3536node24(
upload-pages-artifactandcodeql-action/codecovare composites; the first now wraps a SHA-pinned Node-24upload-artifact, the others run Node-24 tooling.)Breaking-change audit, per action, against this repository's actual usages
Read from each action's release notes at every major boundary crossed, then checked against every
with:block here:download-artifactv4→v8 — v5 changed the extracted path for single artifacts downloaded by ID; every use here is byname:or bypattern:+merge-multiple: true, the cases the notes mark "no action needed". v8 defaultsdigest-mismatchtoerror(a corrupted download now fails instead of warning) — wanted.github-scriptv7→v9 — v9 breaksrequire('@actions/github'); the only script here uses the injectedgithub/contextobjects and norequire.codecov-actionv4→v7 — v5 replaced the uploader with the CLI wrapper and deprecatedfile→files; usage here isfiles:+flags:, both still accepted.codeql-actionv3→v4 — minimum bundle 2.19.4, met on hosted runners;init'slanguages/config-fileinputs unchanged. The check name comes from this workflow'sname:keys, not the action, so the required-check registry is unaffected — confirmed on this PR's run.configure-pagesv4→v6 — v5's breaking changes concern Next.js static-export configuration; usage here passes no inputs.checkoutv4→v7,setup-pythonv5→v7,upload-artifactv4→v7,cachev4→v6,deploy-pagesv4→v5,action-gh-releasev2→v3 — runtime-only majors; require runner ≥ 2.327.1, which every hosted image here (*-latest,ubuntu-22.04) meets. Noself-hostedrunner exists in this org (grepped all three repos).Verification
Every file parsed before and after; the parsed structure asserted equal apart from
uses:values —on:triggers, job names, job-level keys, step count and every non-usesstep key identical; action names unchanged; line endings unchanged. Notyaml.safe_loadsucceeding — the assertion.pytest47 passed.Which files this PR's own run exercises, and which it cannot:
uses:bumpedauto-assign.ymlbook-build.ymlbuild.ymlcodeql.ymldeploy-pages.ymlpull_requesttrigger; first exercised by its own next push run after mergeeosim-sanity.ymlnightly.ymlpull_requesttrigger; first exercised by its own next schedule run after mergepython-tests.ymlrelease.ymlpull_requesttrigger; first exercised by its own next push run after mergescorecard.ymlpull_requesttrigger; first exercised by its own next schedule/push run after mergesimulation-test.ymlsync-release-branch.ymlpull_requesttrigger; first exercised by its own next push run after mergethird-party.ymlvideo-build.ymlpull_requesttrigger; first exercised by its own next push/release run after mergeweekly.ymlpull_requesttrigger; first exercised by its own next schedule run after mergeThe NOT RUN rows are stated rather than implied: their first execution with these pins is their next scheduled/release/dispatch run after merge, and a failure there would be attributable to this change.
Deliberately not touched — 3 files, to keep the queue mergeable
These also carry Node-20 pins but are modified by open pull requests; bumping them here would put every one of those PRs into CONFLICTING. They follow in one commit once the PRs below land:
ci.ymleos-simulation.ymlupstream-drift.yml