TL;DR
A developer reports a frustrating CI experience after a cross-platform build failed on GitHub Actions when an ARM runner couldn’t find an installed binary. They resolved the issue by moving generation out of build.rs into a Makefile and committing generated files, but say the platform’s isolation and slow feedback loop cost time and patience.
What happened
The author was adding a Rust build.rs to their tmplr project that invoked the CUE binary to generate README.md, CHANGELOG.md and a version/help file. After pushing the change, the repository’s GitHub Actions matrix build failed for one platform: Linux ARM returned a “command can’t be found” error while Linux and macOS x86_64 and macOS ARM runs succeeded. The author determined that GitHub Actions had hidden an x86_64 binary from the arm64 runner, preventing it from running the tool. Attempts to iterate — edit CI, push, wait for the matrix run, inspect the ARM job — produced a slow feedback loop of around 2–3 minutes per iteration. After roughly 30 minutes the author removed build.rs, moved generation into a GNU Makefile, committed the generated files, reverted CI changes and stopped the cycle.
Why it matters
- CI runner isolation can prevent expected binaries from being available across different architecture tasks, causing platform-specific failures.
- Slow iteration on remote CI runs increases developer time spent debugging configuration rather than building features.
- Embedding build logic inside platform-specific build hooks can make cross-platform CI fragile; keeping scripts under direct project control can reduce surprises.
- Even widely used hosted CI services can present trade-offs: convenience for certain platforms (like macOS) versus challenging edge cases on other architectures.
Key facts
- Project: tmplr, a file/project scaffold tool with human-readable template files.
- build.rs used CUE to generate documentation and a version/help file.
- The build.rs implementation took approximately 1.5 hours and an article was written about it.
- CI configured a matrix for four targets: Linux ARM, macOS ARM, Linux x86_64, macOS x86_64.
- Linux ARM job failed with a “command can’t be found” error while the other three targets succeeded.
- Author concluded GitHub Actions hid an x86_64 binary from the arm64 runner, preventing execution.
- The edit/push/wait/inspect loop for CI iterations took about 2–3 minutes per try and lasted roughly 30 minutes in total.
- Fix applied: deleted build.rs, moved generation into a GNU Makefile, committed generated files and reverted CI changes.
- Author notes macOS builds remain a benefit of GitHub Actions.
What to watch next
- Whether GitHub Actions will change how cross-architecture binaries are exposed to runners: not confirmed in the source
- If GitHub or third parties introduce faster local runner workflows or a 'scratch commit' testing mode: not confirmed in the source
- Whether the author or others adopt different CI patterns or tools to avoid similar isolation issues: not confirmed in the source
Quick glossary
- GitHub Actions: A hosted continuous integration and delivery service that runs workflows defined in YAML and can execute jobs on different runner environments.
- CI matrix: A configuration that runs the same build or test job across multiple combinations of operating systems, architectures, or language/runtime versions.
- CUE: A configuration and data validation language and tool often used to generate or validate structured files; here used to produce documentation files.
- build.rs: In Rust projects, a build script named build.rs can run custom code at compile time to generate files or perform checks.
- Makefile: A file used by build automation tool make (or GNU Make) to define targets and commands for building and generating project artifacts.
Reader FAQ
Why did the build fail on Linux ARM?
The Linux ARM job reported a missing command; the author concluded the arm64 runner could not access an x86_64 binary that had been installed on a different runner.
How was the issue resolved?
The author removed build.rs, moved generation steps into a GNU Makefile, committed the generated files, and reverted CI changes.
Was this a problem specific to CUE?
not confirmed in the source
Are there alternative CI services that avoid this behavior?
not confirmed in the source
2026-01-14 I Hate Github Actions with Passion I can’t overstate how much I hate GitHub Actions. I don’t even remember hating any other piece of technology I used. Sure, I…
Sources
- I Hate GitHub Actions with Passion
- The Pain That Is GitHub Actions
- Randomly failed GitHub Actions CI builds caused by not …
- Github actions runner environment doesn't build for arm …
Related posts
- Servo 2025 community and project metrics: contributions, WPT, and growth
- Lago, the open-source billing platform, is hiring globally across teams and geos
- How GitHub’s dual ID systems work — and how to extract database IDs