1051 words
5 minutes

GitHub Actions Node24 Error on Self-Hosted Runners: Upgrade the Runner First

2026-08-11
DevOps
GitHub Actions
/
CI/CD
/
DevOps
/
Troubleshooting

If a self-hosted GitHub Actions job fails with a Node24 error, upgrade the runner before changing the workflow. An action that declares using: node24 needs a runner that understands that runtime; changing runs-on does not update a runner you manage.

The fix has three separate parts: the runner binary must support the action runtime, the runner must meet GitHub’s registration and update policy, and the host operating system must be compatible with Node24.

Identify which Node24 boundary failed#

The error wording usually tells you which layer to inspect first:

SymptomLikely boundaryFirst check
Parameter 'using: node24' is not supportedThe runner cannot launch the action runtimeRunner version and the action release
A runner cannot register or re-registerGitHub’s minimum registration policyRunner release and the product enforcement date
The job stays queued on an old machineThe runner is not receiving updatesAuto-update settings and outbound access
A new runner still fails on macOS or ARM hardwareThe host is outside Node24 supportOperating system version and architecture

Do not treat every Node24 failure as a YAML syntax error. The action and the runner are two versioned components, and they can be upgraded independently.

Check the action and runner versions#

Some current JavaScript actions have already moved to Node24. For example, the actions/checkout README documents Node24 for checkout@v5 and requires runner v2.327.1 or newer. The actions/cache README documents the same runner floor for cache@v5.

That minimum is an action-runtime requirement. It is not the same as GitHub’s separate runner registration enforcement.

If you can query the repository’s self-hosted runners, inspect their reported versions without exposing runner credentials:

Terminal window
gh api --paginate repos/OWNER/REPO/actions/runners \
--jq '.runners[] | [.name, .version, .os, .status, .busy] | @tsv'

The REST response is repository-scoped, so use the organization or enterprise endpoint when that is where the runner is registered. The self-hosted runner API requires the permissions appropriate to the endpoint; a failed query does not prove that the runner is outdated.

Also inspect the action versions in the failing job:

steps:
- uses: actions/checkout@v5
- uses: actions/cache@v5

Read the action’s release notes before assuming that a tag change is safe. A temporary pin to an older action can unblock an incident, but it leaves the runner upgrade undone and should not become the permanent fix.

Upgrade the self-hosted runner#

Use the runner package and service instructions from the repository, organization, or enterprise runner settings. A safe upgrade sequence is:

  1. Stop new jobs from selecting the runner, or take it offline through the runner settings.
  2. Record the installed runner version, operating system, architecture, labels, and service definition.
  3. Install the current runner package for that host and reconnect it using the supported setup flow.
  4. Keep the same labels and working-directory policy, then run a small workflow that uses the failing action.
  5. Return the runner to service only after the action completes and the runner reports the expected version.

Self-hosted runners update automatically by default. If you disabled that behavior, GitHub’s self-hosted runner documentation says to update the runner regularly and within 30 days. A runner that cannot reach the update service can become a queueing or enforcement problem even after you fix the immediate Node24 error.

Separate runtime support from registration enforcement#

GitHub’s minimum-version enforcement timeline describes a second floor: runner v2.329.0 or newer is required to register or re-register in the affected GitHub-hosted product cohorts. Job execution also requires runners to stay within the update window. That policy is separate from the v2.327.1 runtime floor documented by particular Node24 actions.

For GitHub Enterprise Cloud, the same timeline announces brownouts beginning August 24, 2026 and full enforcement on September 25, 2026. If your self-hosted fleet serves that product, treat those dates as an upgrade deadline rather than waiting for a workflow to fail. GitHub Enterprise Server is not covered by that timeline, but its runner compatibility still depends on the GHES release and runner version you operate.

Check the host operating system#

If the runner binary is new enough but the action still cannot start Node24, check the host platform. GitHub’s Node runtime migration notice calls out macOS 13.4 and lower as incompatible with Node24, and it notes that official ARM32 support ends with the Node20 deprecation path.

That makes these labels worth checking before changing the workflow:

os=macos, version=13.4 or lower
architecture=arm32

Move the job to a supported host, or provision a new self-hosted runner with an architecture and operating system that the action runtime supports. Do not hide the incompatibility by adding a broad fallback to every job.

Use the old-runtime fallback only as a bridge#

GitHub’s migration notice documents ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true as a temporary way to allow an older JavaScript action runtime during migration. If you must use it to recover a release, scope it to the affected runner or job, record the expiry, and remove it after the runner is upgraded.

The fallback reduces the urgency signal; it does not add Node24 support, fix a registration policy failure, or make an unsupported operating system safe. Keep the normal workflow on the new runtime path once the runner fleet is ready.

Verify the fix at the same boundary#

Run the failing workflow on the upgraded runner and confirm all of these facts:

  1. The runner API reports the new version and the expected labels.
  2. The job is actually scheduled on that runner, not on another old machine with the same label.
  3. The Node24 action starts without the using: node24 error.
  4. The runner service can receive its next automatic update.
  5. The host OS and architecture match the action’s support notes.

If the job then fails because a secret is empty, that is a different workflow boundary. GitHub Actions reusable workflow secrets covers the caller-to-called-workflow handoff; do not mix that diagnosis with a runner-runtime upgrade.

FAQ#

Q: Does changing runs-on: ubuntu-latest update my self-hosted runner?#

A: No. A self-hosted label selects a machine you manage. Install the supported runner package on that machine, or remove the self-hosted label and let GitHub-hosted infrastructure run the job.

Q: Is runner v2.329.0 the only version I need for Node24 actions?#

A: Not necessarily. The action’s own runtime requirement may be different; for example, checkout v5 and cache v5 document runner v2.327.1 or newer. You also need to satisfy the registration and ongoing-update policy that applies to your GitHub product.

Q: Should I permanently pin actions to Node20?#

A: No. A temporary older action can reduce incident impact, but it postpones the runner and host upgrade. Plan the migration and remove the fallback or old pin once the fleet is compatible.

References:

GitHub Changelog: Deprecation of Node 20 on GitHub Actions runners

GitHub Changelog: Minimum version enforcement timeline for self-hosted runners

actions/checkout

actions/cache

GitHub Docs: Self-hosted runners

GitHub REST API: Self-hosted runners

GitHub Actions Node24 Error on Self-Hosted Runners: Upgrade the Runner First
https://laplusda.com/en/posts/github-actions-node24-self-hosted-runner/
Author
Zero
Published at
2026-08-11
License
CC BY-NC-SA 4.0
Was this article useful?

Report a typo or broken link, or suggest a related topic.