Skip to content

ci: bump pinned GitHub Actions to their Node 24 majors - #97

Merged
EtienneLescot merged 1 commit into
mainfrom
claude/bump-actions-node24
Aug 8, 2026
Merged

ci: bump pinned GitHub Actions to their Node 24 majors#97
EtienneLescot merged 1 commit into
mainfrom
claude/bump-actions-node24

Conversation

@EtienneLescot

@EtienneLescotEtienneLescot commented Jul 16, 2026

Copy link
Copy Markdown
Collaborator

Problem

Every workflow run logs:

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-node@v4 ...

GitHub is dropping the Node 20 shim. These actions still declare using: node20 at the pinned majors in this repo, so runners are already silently forcing them onto Node 24 — a warning today, a hard break later.

Fix

Bump each action to the major that declares using: node24 natively (verified directly against each repo's action.yml at the release tag, not against changelog claims):

ActionBeforeAfter
actions/checkoutv4v7
actions/setup-nodev4v7
actions/setup-pythonv5v6
actions/cachev4v6
actions/upload-artifactv4v7
actions/download-artifactv4v8
amannn/action-semantic-pull-requestv5v6
actions/github-scriptv7v8

Applied across all 15 workflow/composite-action files that pin them by version tag — 47 call sites. Rebased onto current main, so it also covers announce-release.yml, build-whisper-stt.yml and nix-check.yml, which landed after this branch was first cut.

Also verified empirically rather than by inspection alone: ci.yml on main emits the deprecation warning on every job, and the same run on this branch emits none.

Breaking changes checked

Read the release notes for every intermediate major and checked each against how this repo actually calls these actions:

  • download-artifact v5 — changed the output path for single downloads by artifact-id. All four call sites here download by name:, so unaffected.
  • download-artifact v8 — now defaults digest-mismatch to error instead of logging a warning. Kept as-is: a corrupt installer should fail the release job rather than be published silently.
  • setup-node v5 — auto-enables npm caching when package.json declares packageManager, and this repo declares npm@10.9.4. The composite action already sets cache: npm explicitly; the three directsetup-node steps in ci.yml gain caching they did not have before. package-lock.json is at the repo root, so detection resolves rather than erroring.
  • checkout v5+ / github-script v8 — both require runner >= v2.327.1. Every job here runs on a GitHub-hosted runner, so that is satisfied automatically; there are no self-hosted runners in this repo.
  • checkout v7 — refuses to check out fork PR code under pull_request_target / workflow_run. The guard only runs when the step overrides repository: or ref: (src/input-helper.ts exempts the default self-checkout). The three pull_request_target workflows here do a bare default checkout, and the two workflows that do override a ref (update-homebrew-cask, bump-nix-package) run on release / workflow_dispatch, where the guard early-returns. No call site trips it.
  • amannn v6 — the only breaking change is the Node 24 + ESM migration itself. This repo passes types and requireScope, both unchanged.
  • github-script v8 — a pure runtime bump (v7.1.0...v8.0.0 is the Node 24 change plus a README). Stopped at v8 rather than v9 deliberately: v9 injects getOctokit as a script parameter and drops require('@actions/github'). The 252-line script in merged-pr-bookkeeping.yml uses neither, so v9 would also work, but v8 leaves the script context byte-for-byte identical.
  • Everything else across these ranges is the Node 24 runtime bump, an ESM migration transparent to callers, or new opt-in inputs (e.g. upload-artifact's archive: false) that nothing here uses.

Deliberately not in this PR

  • ilammy/msvc-dev-cmd@v1 is still node20 and upstream has published no newer major, so one deprecation line survives until it does.
  • .github/workflows/docs.yml is SHA-pinned rather than tag-pinned, and its four actions are node20 too. It is left alone because upload-pages-artifact v4 stopped including dotfiles, which would drop the .nojekyll Docusaurus emits into website/build. Fixing it means v5 plus include-hidden-files: true, and it touches the production Pages deploy — the deploy job only runs on push to main, so a PR run cannot validate it. Worth its own PR.

🤖 Generated with Claude Code

@coderabbitai

coderabbitaiBot commented Jul 16, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Updates GitHub Actions versions across the composite setup action and CI, build, release, diagnostic, notification, and maintenance workflows. Existing commands, artifact handling, and publishing logic remain unchanged.

Changes

GitHub Actions upgrades

Layer / File(s)Summary
Setup and CI action upgrades
.github/actions/setup/action.yml, .github/workflows/ci.yml
The shared Node setup uses actions/setup-node@v7. CI checkout steps use actions/checkout@v7. Semantic PR validation uses @v6.
Build and release action upgrades
.github/workflows/build.yml, .github/workflows/build-whisper-stt.yml
Build and release jobs upgrade checkout, cache, Python setup, artifact upload, and artifact download actions. Artifact names and paths remain unchanged.
Automation and diagnostic workflow upgrades
.github/workflows/diagnostic-artifact.yml, .github/workflows/bump-nix-package.yml, .github/workflows/discord-*.yml, .github/workflows/nix-check.yml, .github/workflows/prerelease.yml, .github/workflows/promote.yml, .github/workflows/update-homebrew-cask.yml
Maintenance, notification, release, and diagnostic workflows upgrade checkout and artifact upload actions without changing workflow logic.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

Suggested reviewers:siddharthvaddem

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Description check⚠️ WarningThe description explains the problem, fix, compatibility checks, and exclusions, but it does not follow the required template sections or checkboxes.Rewrite the description using the repository template, including Summary, Related issue, Type of change, Release impact, Desktop impact, Screenshots/video, and Testing.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Title check✅ PassedThe title clearly summarizes the primary change: updating pinned GitHub Actions to Node 24-compatible major versions.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/bump-actions-node24

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@EtienneLescotEtienneLescot left a comment

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

Review — LGTM

Mechanical, well-scoped bump of six first-party actions/* dependencies to the major that declares using: node24 in their manifest. CI is fully green across all three runner platforms (ubuntu / windows / macos), which validates every bumped action in this repo on real runners before merge.

Verified each pinned tag (v7/v6/v7/v6/v7/v8 across checkout, setup-node, setup-python, cache, upload-artifact, download-artifact) declares using: node24 in its action.yml, and audited the breaking-change surface against actual call sites — no impact (no artifact-ids:, setup-nodepackage-manager-cache is overridden by the composite's explicit cache: npm, upload-artifact v4→v7 overwrite default flip is safe because artifact names are unique per job/matrix).

Doc drift (non-blocking, please track)

  • docs/github-actions-workflows.md:243 still shows actions/setup-node@v4 in the documented composite-action snippet — should be @v7.
  • docs/secrets.md:58 references "the default actions/checkout@v4 auth" — should be @v7.

These are stale by a few PRs already; happy to send a tiny follow-up PR to fix them once this lands.

Follow-up considerations (not blocking this PR)

  • actions/github-script@v7 in merged-pr-bookkeeping.yml:19 is already Node 24 native; latest is v9.0.0. Could ride along in a follow-up.
  • amannn/action-semantic-pull-request@v5 in ci.yml:49 runs the Validate PR title (semantic) check that AGENTS.md flags as required for merge; it was on Node 20 last I checked. Worth a follow-up.
  • Consider adding .github/dependabot.yml for github-actions — would have caught this bump automatically and would catch the next node-26 cycle as a one-click PR.

using: composite
steps:
- uses: actions/setup-node@v4
- uses: actions/setup-node@v7

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

✓ Correct bump. setup-node@v7 declares using: node24 at this tag. Note that node-version: 22 on line 8 is intentional — the app's package.json#engines pins Node 22.22.1, and the composite action installs Node 22 for npm ci. The Node 24 only affects the runner side (the action's dist/setup/index.js), not the version installed for the app. No drift between runner-side (24) and app-side (22); the two are independent.

Recommend a one-line comment in this file (or in docs/github-actions-workflows.md) explaining the distinction so future maintainers don't "fix" the node-version: 22 to node-version: 24.

@@ -33,13 +33,13 @@ jobs:
runs-on: windows-latest

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

✓ Bump to actions/checkout@v7 is correct (uses node24 at this tag). The fetch-depth / repository / token inputs are all still supported. Verified that none of this repo's checkout calls use removed v4 inputs.

Comment thread.github/workflows/ci.yml Outdated
@@ -11,23 +11,23 @@ jobs:
name: Lint

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

✓ All four bumps here are actions/checkout@v4 → @v7. These run on ubuntu-latest only. Worth noting: the Lint / Type Check / Test / Build / Validate PR title (semantic) jobs all reference this checkout — bumping to v7 transitively bumps the runner to Node 24 for the entire ci.yml pipeline. Good preventive maintenance before GitHub forces the migration.

@@ -15,7 +15,7 @@ jobs:
name: Windows x64 diagnostic bundle

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

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

actions/upload-artifact@v7 and actions/checkout@v7 are the right targets. The diagnostic bundle jobs run on windows-latest, macos-latest, macos-15-intel — bumping these also brings Node 24 to all three platforms' runners. The if-no-files-found, retention-days, and name inputs are still supported.

@coderabbitai

Copy link
Copy Markdown

Note

GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer.

@coderabbitaicoderabbitaiBot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick comments (2)
.github/workflows/ci.yml (1)

61-64: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Disable automatic npm caching unless these jobs require it.

actions/setup-node@v7 can enable npm caching when package.json declares npm as the package manager, even when cache is omitted. The docs job explicitly avoids dependency installation, so this cache is unnecessary there. In low-trust workflows, automatic cache restore and save can create cache-poisoning risk.

Verify package.json and the workflow triggers. Set package-manager-cache: false for these steps unless the cache is intentional. GitHub documents this automatic behavior and recommends disabling it when caching is not required for secure operation. (github.com)

Proposed configuration change
 - uses: actions/setup-node@v7
with:
node-version: 22
+ package-manager-cache: false

Apply the same input to the .nvmrc-based setup steps.

Also applies to: 172-174, 213-215

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.github/workflows/ci.yml around lines 61 - 64, Disable automatic npm caching
on every actions/setup-node@v7 step in the workflow, including the .nvmrc-based
setup steps referenced by the comment, by explicitly setting
package-manager-cache to false. Preserve the existing Node version and setup
behavior.

Source: Linters/SAST tools

.github/workflows/nix-check.yml (1)

45-45: 🔒 Security & Privacy | 🔵 Trivial | ⚡ Quick win

Disable persisted checkout credentials.

actions/checkout@v7 stores the checkout token by default, but this job only runs nix run and prints values. Set persist-credentials: false unless a later step needs authenticated Git access.

Proposed fix
- - uses: actions/checkout@v7+ - uses: actions/checkout@v7+ with:+ persist-credentials: false
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In @.github/workflows/nix-check.yml at line 45, Update the actions/checkout step
to set persist-credentials to false, preserving the existing workflow since no
later step requires authenticated Git access.

Sources: MCP tools, Linters/SAST tools

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In @.github/workflows/ci.yml:
- Around line 61-64: Disable automatic npm caching on every
actions/setup-node@v7 step in the workflow, including the .nvmrc-based setup
steps referenced by the comment, by explicitly setting package-manager-cache to
false. Preserve the existing Node version and setup behavior.
In @.github/workflows/nix-check.yml:
- Line 45: Update the actions/checkout step to set persist-credentials to false,
preserving the existing workflow since no later step requires authenticated Git
access.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: daef0565-e840-4264-b1ff-27247fc71be1

📥 Commits

Reviewing files that changed from the base of the PR and between 446d2e0 and 890064d.

📒 Files selected for processing (13)
  • .github/actions/setup/action.yml
  • .github/workflows/build-whisper-stt.yml
  • .github/workflows/build.yml
  • .github/workflows/bump-nix-package.yml
  • .github/workflows/ci.yml
  • .github/workflows/diagnostic-artifact.yml
  • .github/workflows/discord-pr-notify.yml
  • .github/workflows/discord-roadmap-sync.yml
  • .github/workflows/discord-weekly-leaderboard.yml
  • .github/workflows/nix-check.yml
  • .github/workflows/prerelease.yml
  • .github/workflows/promote.yml
  • .github/workflows/update-homebrew-cask.yml
🚧 Files skipped from review as they are similar to previous changes (5)
  • .github/workflows/update-homebrew-cask.yml
  • .github/workflows/bump-nix-package.yml
  • .github/actions/setup/action.yml
  • .github/workflows/prerelease.yml
  • .github/workflows/promote.yml

Every workflow run was logging:
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-node@v4 ...
GitHub Actions is dropping the Node 20 shim; these actions still declared
`using: node20` at the pinned majors, so runners were silently forcing them
onto Node 24 anyway. Bump to the majors that declare `using: node24` natively
(verified against each repo's action.yml at the release tag, not the
changelog):
actions/checkout v4 -> v7
actions/setup-node v4 -> v7
actions/setup-python v5 -> v6
actions/cache v4 -> v6
actions/upload-artifact v4 -> v7
actions/download-artifact v4 -> v8
actions/github-script v7 -> v8
amannn/action-semantic-pull-request v5 -> v6
Checked every intermediate major's release notes against how this repo
actually calls these actions:
- download-artifact v5 changed the output path for single downloads by
artifact-id; all four call sites here download by `name:`, so unaffected.
- download-artifact v8 now defaults `digest-mismatch` to `error` rather than
a warning. Kept: a corrupt installer should fail the release job rather
than be published silently.
- setup-node v5 auto-enables npm caching when package.json declares
`packageManager` (it does: npm@10.9.4). The composite action already set
`cache: npm`; the three direct call sites in ci.yml gain caching they did
not have. package-lock.json is at the repo root, so detection resolves
rather than erroring.
- checkout v7 refuses to check out fork PR code under pull_request_target /
workflow_run. The guard only runs when the step overrides `repository:` or
`ref:` — the three pull_request_target workflows here do a bare default
checkout, and the two that do override a ref run on `release` /
`workflow_dispatch`. No call site trips it.
- github-script v8 is a pure runtime bump. Stopped there rather than v9,
which injects `getOctokit` as a script parameter and drops
`require('@actions/github')`; merged-pr-bookkeeping.yml uses neither, so
v9 would work too, but v8 leaves the script context identical.
- checkout v5+ and github-script v8 need runner >= v2.327.1. Every job here
runs on a GitHub-hosted runner, so that is satisfied.
- Everything else across these ranges is the Node 24 runtime bump, an ESM
migration transparent to callers, or new opt-in inputs nothing here uses.
Verified empirically rather than by inspection alone: ci.yml on main emits
the deprecation warning on every job, and the same run on this branch emits
none.
Two node20 references are deliberately left:
- ilammy/msvc-dev-cmd@v1 has no newer major published upstream.
- docs.yml is SHA-pinned rather than tag-pinned, and bumping it means
upload-pages-artifact v4+, which stopped including dotfiles and would drop
the `.nojekyll` Docusaurus writes into website/build. That needs
`include-hidden-files: true` and its own verification against the Pages
deploy, which a PR run cannot exercise — the deploy job only runs on push
to main.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@EtienneLescot
EtienneLescotforce-pushed the claude/bump-actions-node24 branch from 3084809 to 66f0cf2CompareAugust 8, 2026 21:32
@EtienneLescot
EtienneLescot merged commit 851da5e into mainAug 8, 2026
21 checks passed
@EtienneLescot
EtienneLescot deleted the claude/bump-actions-node24 branch August 8, 2026 21:48
EtienneLescot added a commit that referenced this pull request Aug 8, 2026
The tag-pinned actions moved to their node24 majors in #97, but docs.yml
pins by SHA and was left out of that sweep, so it still logs:
Node.js 20 is deprecated. The following actions target Node.js 20 but
are being forced to run on Node.js 24 ...
Bump all four, keeping the SHA pinning this file deliberately uses:
actions/checkout v4.1.1 -> v7.0.1
actions/setup-node v4.0.3 -> v7.0.0
actions/upload-pages-artifact v3.0.1 -> v5.0.0
actions/deploy-pages v4.0.5 -> v5.0.0
upload-pages-artifact is a composite; what matters for the warning is the
actions/upload-artifact@v7.0.0 it now calls internally, which is node24.
The one real behavior change is upload-pages-artifact v4, which stopped
bundling dotfiles. Docusaurus writes a `.nojekyll` into website/build, so
that would have silently dropped it. The artifact-based Pages deploy never
runs Jekyll and would most likely not care, but that is not worth verifying
on the live site: `include-hidden-files: true` (added in v5) restores
exactly what v3 uploaded. `.git` and `.github` stay excluded regardless.
Changing this file matches the workflow's own `paths` filter, so the build
and upload steps are exercised by this PR. The deploy job only runs on push
to main and stays unvalidated until merge — it is a pure runtime bump, with
no input or output changes between v4.0.5 and v5.0.0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Sign up for freeto 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

@EtienneLescot