Skip to content

ci: move actions off the deprecated Node 20 runtime - #138

Merged
caterryan merged 1 commit into
mainfrom
ci/node24-action-bumps
Aug 4, 2026
Merged

ci: move actions off the deprecated Node 20 runtime#138
caterryan merged 1 commit into
mainfrom
ci/node24-action-bumps

Conversation

@caterryan

Copy link
Copy Markdown
Collaborator

Summary

The 0.3.1 release run carried this annotation:

Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/upload-artifact@330a01c

Auditing every action in the repo turned up four on Node 20, not one. Each is bumped to the earliest version that declares runs.using: node24:

Action Before After SHA
actions/upload-artifact v5.0.0 v6.0.0 b7c566a
actions/download-artifact v6.0.0 v7.0.0 37930b1
actions/github-script v7 (unpinned) v8.0.0 ed59741
actions/checkout v4 (unpinned) v6.0.3 df4cb1c

Why the earliest Node 24 version, not the latest

These are runtime-only bumps with no API changes. The next majors carry real behaviour changes that aren't needed to clear the deprecation:

  • upload-artifact v7 — ESM migration; direct uploads where name is ignored.
  • download-artifact v8 — ESM; digest mismatches now fail instead of warning; unzip behaviour depends on Content-Type.
  • github-script v9require('@actions/github') stops working; getOctokit becomes an injected parameter.

The github-script v9 breaks don't actually affect the one script here, which only calls github.rest.repos.createCommitComment. It's held back for consistency with the others rather than out of necessity. Adopting the newer majors is a reasonable follow-up, just not mixed into a deprecation fix — especially with download-artifact v8 turning digest mismatches into hard failures.

Unreachable checkout SHA

Three actions/checkout uses pinned SHA 9f698171…, commented # v6.0.3. That commit is not reachable from any ref in actions/checkout:

GET /repos/actions/checkout/commits/9f698171…      -> 422 No commit found
GET /repos/actions/checkout/git/commits/9f698171…  -> 404 Not Found
raw.githubusercontent.com/.../9f698171…/action.yml -> 404
codeload.github.com/.../tar.gz/9f698171…           -> 200 OK

Only codeload resolves it, which is why the runner fetches it fine while every audit path fails. Practical consequences: Dependabot and Renovate can't track it, and it can't be reviewed upstream.

It is not malicious. Its dist/index.js is byte-identical to the real v6.0.3 (df4cb1c), verified by SHA-256 against v5.0.0, v5.0.1, v5.1.0, and v6.0.3. (The package.json inside reads 5.0.0, but so does real v6.0.3 — upstream doesn't bump it.) It was also already Node 24, so it was never part of the deprecation.

Repointed to df4cb1c so every checkout in the repo uses the same verified, reachable SHA.

Verification

Each resulting pin was checked to resolve to a reachable commit, to match the version in its trailing comment, and to declare node24:

actions/checkout          v6.0.3  node24  reachable=yes  tag-matches-sha=yes
actions/download-artifact v7.0.0  node24  reachable=yes  tag-matches-sha=yes
actions/github-script     v8.0.0  node24  reachable=yes  tag-matches-sha=yes
actions/setup-python      v6.3.0  node24  reachable=yes  tag-matches-sha=yes
actions/upload-artifact   v6.0.0  node24  reachable=yes  tag-matches-sha=yes

No unpinned actions remain. pypa/gh-action-pypi-publish is a Docker action with no Node runtime, so it is unaffected. All five workflow files parse.

The upload/download pairing matters for the release workflow, which uploads dists and notes in build and downloads them in two later jobs. upload-artifact v6 and download-artifact v7 are the matched Node 24 releases on the same v4 artifact backend.

Not verified here: these run for real only on the next tag push or registry publish. The changes are pure SHA swaps, so the risk is low, but nothing in this PR exercises the artifact round-trip end to end.

🤖 Generated with Claude Code

GitHub is forcing Node 20 actions onto Node 24 and will eventually drop the
shim, so the 0.3.1 release run carried a deprecation annotation. Bump each
action to the earliest version that declares runs.using: node24:

- actions/upload-artifact  v5.0.0 -> v6.0.0
- actions/download-artifact v6.0.0 -> v7.0.0
- actions/github-script    v7 (unpinned) -> v8.0.0
- actions/checkout         v4 (unpinned) -> v6.0.3

These are runtime-only bumps. The next majors (upload-artifact v7,
download-artifact v8, github-script v9) add real behaviour changes, including
ESM, direct uploads, and digest mismatches failing instead of warning. None of
that is needed to clear the deprecation, so it is left for a separate change.

Also repoint three actions/checkout uses off SHA 9f698171. That commit is not
reachable from any ref in actions/checkout: the REST and raw endpoints return
404, and only codeload resolves it, so Dependabot cannot track it and it
cannot be reviewed upstream. Its dist/index.js is byte-identical to v6.0.3, so
this is a hygiene fix rather than a behaviour change, and it makes every
checkout in the repo use the same verified SHA.

Every remaining pin was checked to resolve to a reachable commit, to match the
version in its trailing comment, and to declare node24. pypa/gh-action-pypi-publish
is a Docker action and has no Node runtime.
@caterryan
caterryan merged commit 66c52ba into main Aug 4, 2026
8 checks passed
@caterryan
caterryan deleted the ci/node24-action-bumps branch August 4, 2026 14:10
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.

2 participants