GitHub Actions workflows often run unnoticed for months or even years. A pipeline may build an application, execute tests, publish packages, or deploy software without requiring regular changes. However, changes to runner architecture support can affect these workflows even when the application code remains exactly the same.
One such change concerns ARM32 execution in GitHub Actions. GitHub has announced that hosted runners will end support for ARM32 job execution on Windows and Linux. The retirement is connected to the transition from Node.js 20 to Node.js 24 because Node.js 24 does not officially support ARM32.
For teams maintaining multiple repositories, the challenge is identifying which workflows actually depend on ARM32. Searching for a particular runner label is not always enough. Architecture can be selected through self-hosted runner labels, build matrices, container images, shell scripts, or external actions.
This article explains how to identify potentially affected workflows, inspect their architecture dependencies, and prepare a migration plan without unnecessarily changing ARM64 or x64 pipelines.
Understanding the ARM32 Runner Change
ARM is a processor architecture family used in embedded devices, single-board computers, mobile devices, and other hardware platforms.
ARM32 and ARM64 are different instruction-set architectures:
ARM32, also known as AArch32, uses a 32-bit execution environment.
ARM64, also known as AArch64, uses a 64-bit execution environment.
x64 is the 64-bit architecture commonly used by Intel and AMD desktop and server processors.
The distinction matters because a workflow that builds software for ARM32 is not necessarily running on an ARM32 runner.
For example, an x64 GitHub-hosted runner can cross-compile an application for a 32-bit ARM device. That workflow may continue working because its execution environment is x64, even though its output targets ARM32.
The announced retirement concerns native ARM32 user-space execution on hosted Linux and Windows runners. It should not be interpreted as the removal of ARM64 support or as a general restriction on producing ARM32 binaries.
Why Node.js 24 matters
GitHub Actions uses JavaScript runtimes to execute JavaScript-based actions. Many commonly used actions are implemented using Node.js.
The transition to Node.js 24 introduces an architecture compatibility issue because Node.js 24 does not officially support ARM32. Consequently, actions that move to Node.js 24 cannot be assumed to work in an ARM32 execution environment.
This is particularly relevant when a workflow uses several third-party actions. A workflow might not explicitly mention Node.js, but its actions may depend on it internally.
GitHub announced that hosted runners will end ARM32 job execution support on Windows and Linux by December 8, 2026.
The practical implication is that teams should identify ARM32 dependencies before the retirement rather than waiting for workflows to fail.
Which GitHub Actions Workflows Should You Review?
Not every workflow that mentions ARM is affected. The important question is whether the workflow depends on ARM32 execution.
Start by reviewing the following categories.
Workflows using ARM32 self-hosted runners
A workflow can select a self-hosted runner through labels.
For example:
name: ARM32 Build
on:
push:
branches:
- main
jobs:
build:
runs-on: [self-hosted, linux, ARM32]
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Build application
run: ./build.shThe ARM32 label is a strong indication that the workflow expects a runner with that architecture.
However, labels are user-defined. A label named ARM32 does not automatically prove the underlying machine is ARM32. An administrator could have assigned that label to a different architecture.
Verify the actual runner hardware and operating system before deciding whether the workflow is affected.
You should also inspect organization-level and repository-level runner groups. A workflow may use a generic label such as embedded-linux or hardware-builder instead of explicitly mentioning ARM32.
Workflows using architecture-specific build matrices
A build matrix can define multiple target architectures.
For example:
name: Multi-Architecture Build
on:
push:
branches:
- main
jobs:
build:
strategy:
matrix:
architecture:
- x64
- arm32
- arm64
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Display target architecture
run: echo "Building for ${{ matrix.architecture }}"This workflow runs on an Ubuntu x64 hosted runner. Its matrix includes ARM32, but that does not mean the job itself executes on ARM32 hardware.
The distinction is important:
Runner architecture determines where the workflow commands execute.
Target architecture determines the architecture for which the application is built.
A cross-compilation workflow may continue to build ARM32 software using an x64 or ARM64 runner, provided its compiler, dependencies, and build environment support that target.
Do not remove ARM32 matrix entries automatically. First establish whether the workflow uses native execution or cross-compilation.
Workflows using ARM32 container images
Container images can introduce architecture dependencies even when the runner itself is not ARM32.
Consider this example:
jobs:
test:
runs-on: ubuntu-latest
container:
image: arm32v7/python:3.11
steps:
- name: Run tests
run: python -m pytestThe workflow explicitly requests an ARM32 container image.
Whether this works depends on the runner architecture, container runtime, image compatibility, and any emulation configured in the environment.
An ARM32 container reference is therefore worth investigating, but it does not prove that the workflow requires an ARM32 hosted runner.
Review Dockerfiles, image manifests, build scripts, and container execution settings to understand the actual dependency.
Workflows using third-party actions
A workflow may not contain any architecture-specific configuration but can still depend on actions that are incompatible with its execution environment.
For example:
jobs:
build:
runs-on: [self-hosted, linux, ARM32]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 24
- run: npm install
- run: npm testThe workflow uses a JavaScript-based action and requests Node.js 24. On an ARM32 execution environment, this creates a compatibility concern.
Review the runtime requirements of actions used in affected jobs. Check their release notes and action metadata rather than assuming that every version of an action supports every runner architecture.
Also remember that actions can depend on other actions or bundled binaries. Inspect the complete dependency chain when an action has architecture-specific requirements.
How to Find Potentially Affected Workflows
The first step is to create an inventory of workflow files across your repositories.
GitHub workflow definitions are generally stored in the .github/workflows directory.
For a repository checked out locally, use the following commands to search for architecture-related references:
grep -RniE \
'arm32|armv7|armv7l|aarch32|armhf|linux/arm/v7' \
.github/workflowsThis search can identify common ARM32 references in workflow files.
You can also search for self-hosted runner labels:
grep -RniE \
'self-hosted|runs-on|arm32|armv7|armhf' \
.github/workflowsThese commands are useful for an initial investigation, but they are not a complete architecture audit.
A workflow may inherit runner information through reusable workflows, use expressions to construct labels, or define architecture settings in another file.
Search across multiple repositories
For organizations with many repositories, checking each repository manually is inefficient.
GitHub CLI can help you list repositories:
gh repo list ORGANIZATION_NAME \
--limit 200 \
--json nameWithOwner \
--jq '.[].nameWithOwner'After obtaining the repository list, you can clone or inspect repositories and search their workflow definitions.
For example:
gh repo clone ORGANIZATION_NAME/REPOSITORY_NAME
cd REPOSITORY_NAME
grep -RniE \
'arm32|armv7|armv7l|aarch32|armhf' \
.github/workflowsFor a large organization, consider automating this process and storing the results in a central inventory.
The inventory should include the repository name, workflow file, job name, runner labels, architecture references, container images, and review status.
Automating ARM32 Reference Detection
A small Python script can scan workflow files and report common ARM32 references.
The following example searches YAML files under .github/workflows:
from pathlib import Path
import re
workflow_directory = Path(".github/workflows")
patterns = {
"ARM32": r"\barm32\b",
"ARMv7": r"\barmv7l?\b",
"AArch32": r"\baarch32\b",
"ARMHF": r"\barmhf\b",
"ARM32 Docker": r"linux/arm/v7",
}
if not workflow_directory.exists():
print("Workflow directory not found.")
raise SystemExit(1)
for file_path in workflow_directory.rglob("*.yml"):
content = file_path.read_text(
encoding="utf-8",
errors="ignore"
)
for architecture, pattern in patterns.items():
matches = list(
re.finditer(pattern, content, re.IGNORECASE)
)
for match in matches:
line_number = content[:match.start()].count("\n") + 1
print(
f"{file_path}:{line_number} "
f"Potential {architecture} reference"
)
for file_path in workflow_directory.rglob("*.yaml"):
content = file_path.read_text(
encoding="utf-8",
errors="ignore"
)
for architecture, pattern in patterns.items():
matches = list(
re.finditer(pattern, content, re.IGNORECASE)
)
for match in matches:
line_number = content[:match.start()].count("\n") + 1
print(
f"{file_path}:{line_number} "
f"Potential {architecture} reference"
)
Join the conversation! Your thoughts help the community grow.