Drop arm64 / Raspberry Pi support: publish linux/amd64 only #79

Closed
opened 2026-08-31 02:04:37 +00:00 by claude-bot · 2 comments
Contributor

Decision

Iris ships linux/amd64 only. The arm64 half of the build is removed from CI, the release workflow, the spec, and the docs.

Why

Spec §13.4 (docs/iris-spec.md:717) declared arm64 "a hard requirement — a meaningful fraction of self-hosters run Iris on a Raspberry Pi." That was written at spec v0.4, Status: Pre-implementation, and never revisited. It aimed at a third-party self-hoster audience that does not exist: the repo and registry are both private, and there is no public distribution channel.

Meanwhile:

  • arm64 has never been run anywhere. The only thing that would have validated it is #6 (clean install on a Pi 4), which has not happened. Publishing an untested arm64 image under a "hard requirement" banner is worse than not publishing one.
  • It is the single largest CI cost in the repo. On push to main, ci.yml builds the image twice: a throwaway multi-arch validation build (arm64 under QEMU, ~15 min, push: false, immediately discarded) plus the loadable amd64 build the E2E actually uses. Main-branch runs currently take 20–38 minutes.
  • The shared runner fleet is saturated (6 job slots across every repo on the instance — see #78 and Rhoving/iac-repo#371). A 15-minute emulated build is directly other repos' queue wait.
  • Iris has no affinity to the lighting hardware. WLED runs on an ESP32, which cannot run Docker at all; Iris is an HTTP client to it and can live on any always-on host on the LAN. The Pi assumption was about host class, not proximity.
  • It is trivially reversible — one word in platforms: in two workflow files.

Scope

Files:

  • .forgejo/workflows/ci.yml — drop setup-qemu-action and the multi-arch validation build; the loadable amd64 build already covers it. Push and PR runs become identical.
  • .forgejo/workflows/release.yml — drop QEMU, platforms: linux/amd64, rename the job
  • docs/iris-spec.md §13.4 — replace the multi-arch paragraph, recording the rationale so it is not re-litigated
  • README.md — correct the published-arch claim
  • docs/release.md — correct the multi-arch publishing step
  • CHANGELOG.md — correct two claims under [1.0.0] (still unreleased, so these would ship false)

Issues:

  • #6 — close as won't-do (obsolete; removes a priority/high v1.0.0 blocker that needed physical hardware)
  • #3 — rescope from "multi-arch" to single-arch publishing
  • #2 — acceptance criterion "Docker multi-arch build (amd64 + arm64)" no longer applies
  • #4 — "Build multi-arch images" → single-arch
  • #64 — resolves the open question "decide whether :main should also carry arm64"
  • #34 — Renovate dashboard will drop docker/setup-qemu-action on its next run; no manual action (buildx is still used)

Acceptance

  • git grep -niE "multi-?arch|arm64|aarch64|raspberr|qemu" returns no hits outside lockfiles
  • CI green on main with a single build pass
  • Net effect: v1.0.0 goes from 13 open issues to 12
## Decision Iris ships **`linux/amd64` only**. The arm64 half of the build is removed from CI, the release workflow, the spec, and the docs. ## Why Spec §13.4 ([docs/iris-spec.md:717](docs/iris-spec.md)) declared arm64 "a hard requirement — a meaningful fraction of self-hosters run Iris on a Raspberry Pi." That was written at spec v0.4, *Status: Pre-implementation*, and never revisited. It aimed at a third-party self-hoster audience that does not exist: the repo and registry are both private, and there is no public distribution channel. Meanwhile: - **arm64 has never been run anywhere.** The only thing that would have validated it is #6 (clean install on a Pi 4), which has not happened. Publishing an untested arm64 image under a "hard requirement" banner is worse than not publishing one. - **It is the single largest CI cost in the repo.** On push to `main`, `ci.yml` builds the image *twice*: a throwaway multi-arch validation build (arm64 under QEMU, ~15 min, `push: false`, immediately discarded) plus the loadable amd64 build the E2E actually uses. Main-branch runs currently take 20–38 minutes. - **The shared runner fleet is saturated** (6 job slots across every repo on the instance — see #78 and Rhoving/iac-repo#371). A 15-minute emulated build is directly other repos' queue wait. - **Iris has no affinity to the lighting hardware.** WLED runs on an ESP32, which cannot run Docker at all; Iris is an HTTP client to it and can live on any always-on host on the LAN. The Pi assumption was about host class, not proximity. - **It is trivially reversible** — one word in `platforms:` in two workflow files. ## Scope Files: - [ ] `.forgejo/workflows/ci.yml` — drop `setup-qemu-action` and the multi-arch validation build; the loadable amd64 build already covers it. Push and PR runs become identical. - [ ] `.forgejo/workflows/release.yml` — drop QEMU, `platforms: linux/amd64`, rename the job - [ ] `docs/iris-spec.md` §13.4 — replace the multi-arch paragraph, recording the rationale so it is not re-litigated - [ ] `README.md` — correct the published-arch claim - [ ] `docs/release.md` — correct the multi-arch publishing step - [ ] `CHANGELOG.md` — correct two claims under `[1.0.0]` (still unreleased, so these would ship false) Issues: - [ ] #6 — close as won't-do (obsolete; removes a `priority/high` v1.0.0 blocker that needed physical hardware) - [ ] #3 — rescope from "multi-arch" to single-arch publishing - [ ] #2 — acceptance criterion "Docker multi-arch build (amd64 + arm64)" no longer applies - [ ] #4 — "Build multi-arch images" → single-arch - [ ] #64 — resolves the open question "decide whether `:main` should also carry arm64" - [ ] #34 — Renovate dashboard will drop `docker/setup-qemu-action` on its next run; no manual action (buildx is still used) ## Acceptance - [ ] `git grep -niE "multi-?arch|arm64|aarch64|raspberr|qemu"` returns no hits outside lockfiles - [ ] CI green on `main` with a single build pass - [ ] Net effect: v1.0.0 goes from 13 open issues to 12
claude-bot added this to the v1.0.0 milestone 2026-08-31 02:07:26 +00:00
Author
Contributor

Done — working tree, not yet committed

Files (6, all edited):

  • .forgejo/workflows/ci.yml — removed setup-qemu-action and the throwaway multi-arch validation build. The docker-e2e job now runs one docker/build-push-action step (platforms: linux/amd64, load: true), which serves the health smoke test and the E2E. The if: github.event_name == 'push' gating is gone, so push and PR runs are now identical.
  • .forgejo/workflows/release.yml — dropped QEMU, platforms: linux/amd64, job renamed to "Publish image & release".
  • docs/iris-spec.md §13.4 — the "Multi-arch … hard requirement … Raspberry Pi" paragraph is replaced with a Platform paragraph stating amd64-only plus the rationale, so this isn't re-litigated.
  • README.md, docs/release.md — arch claims corrected.
  • CHANGELOG.md — three fixes: the CI-description line, the "Authoritative images" line, and the Deferred section, which listed "final hardware/end-to-end/year-rollover QA" — the "hardware" there was #6, now closed.

Issues: #6 closed as obsolete; #3 retitled and rescoped; #2 and #4 amended; #64's arm64 decision checkbox resolved. #34 needs no action — Renovate will drop docker/setup-qemu-action from the dashboard on its next run (buildx is still in use).

Verification: git grep -niE "multi-?arch|arm64|aarch64|raspberr|rpi|qemu|cross-compil" returns no hits outside uv.lock / package-lock.json (wheel filenames only). Both workflows parse as valid YAML, and each now has exactly one build step, both linux/amd64.

Judgment call left in place: the v1.0.0 milestone description still reads "QA validated on real hardware". That now refers to the WLED controller via #7 rather than a Pi, which still holds — flagging rather than silently rewording.

Remaining: commit + push, then confirm CI is green on main with a single build pass. Not closing until that's verified.

## Done — working tree, not yet committed **Files (6, all edited):** - `.forgejo/workflows/ci.yml` — removed `setup-qemu-action` and the throwaway multi-arch validation build. The `docker-e2e` job now runs **one** `docker/build-push-action` step (`platforms: linux/amd64`, `load: true`), which serves the health smoke test and the E2E. The `if: github.event_name == 'push'` gating is gone, so push and PR runs are now identical. - `.forgejo/workflows/release.yml` — dropped QEMU, `platforms: linux/amd64`, job renamed to "Publish image & release". - `docs/iris-spec.md` §13.4 — the "Multi-arch … hard requirement … Raspberry Pi" paragraph is replaced with a **Platform** paragraph stating amd64-only plus the rationale, so this isn't re-litigated. - `README.md`, `docs/release.md` — arch claims corrected. - `CHANGELOG.md` — three fixes: the CI-description line, the "Authoritative images" line, and the **Deferred** section, which listed "final hardware/end-to-end/year-rollover QA" — the "hardware" there was #6, now closed. **Issues:** #6 closed as obsolete; #3 retitled and rescoped; #2 and #4 amended; #64's arm64 decision checkbox resolved. #34 needs no action — Renovate will drop `docker/setup-qemu-action` from the dashboard on its next run (buildx is still in use). **Verification:** `git grep -niE "multi-?arch|arm64|aarch64|raspberr|rpi|qemu|cross-compil"` returns **no hits** outside `uv.lock` / `package-lock.json` (wheel filenames only). Both workflows parse as valid YAML, and each now has exactly one build step, both `linux/amd64`. **Judgment call left in place:** the v1.0.0 milestone description still reads "QA validated on real hardware". That now refers to the WLED controller via #7 rather than a Pi, which still holds — flagging rather than silently rewording. **Remaining:** commit + push, then confirm CI is green on `main` with a single build pass. Not closing until that's verified.
Author
Contributor

Done — shipped in 5720ae5

All scope items complete. ci.yml and release.yml publish linux/amd64 only, QEMU is gone, and the spec, README, release doc and CHANGELOG no longer claim arm64. Issues #6 (closed), #3 (rescoped), #2, #4 and #64 all amended; #34 needed no action.

Verified: git grep -niE "multi-?arch|arm64|aarch64|raspberr|rpi|qemu|cross-compil" returns no hits outside uv.lock / package-lock.json (wheel filenames) and CHANGELOG.md — the latter being the record of the removal itself, which is what a changelog is for. CI green on main with a single build pass (#7642, docker-e2e success).

Measured impact: docker-e2e now runs 3m16s and a full main run about 6m30s, against 20m13s and 38m11s before. The saving is larger than just dropping the emulated leg — pushes to main were building the image twice, and now build it once.

Two notes on the acceptance criteria as I wrote them:

  • The grep criterion is met only if CHANGELOG.md is excluded, for the reason above.
  • "v1.0.0 goes from 13 open issues to 12" did not happen: #6 closed but this issue and #81 were opened into the same milestone. The substance held — a priority/high blocker that needed physical hardware became a five-minute CI edit — but the count went up, not down.
## Done — shipped in `5720ae5` All scope items complete. `ci.yml` and `release.yml` publish `linux/amd64` only, QEMU is gone, and the spec, README, release doc and CHANGELOG no longer claim arm64. Issues #6 (closed), #3 (rescoped), #2, #4 and #64 all amended; #34 needed no action. **Verified:** `git grep -niE "multi-?arch|arm64|aarch64|raspberr|rpi|qemu|cross-compil"` returns no hits outside `uv.lock` / `package-lock.json` (wheel filenames) and `CHANGELOG.md` — the latter being the record of the removal itself, which is what a changelog is for. CI green on `main` with a single build pass ([#7642](https://git.rhoving.com/rbrooks/Iris-WLED/actions/runs/152), `docker-e2e` success). **Measured impact:** `docker-e2e` now runs 3m16s and a full `main` run about 6m30s, against 20m13s and 38m11s before. The saving is larger than just dropping the emulated leg — pushes to `main` were building the image *twice*, and now build it once. Two notes on the acceptance criteria as I wrote them: - The grep criterion is met only if `CHANGELOG.md` is excluded, for the reason above. - "v1.0.0 goes from 13 open issues to 12" did not happen: #6 closed but this issue and #81 were opened into the same milestone. The substance held — a `priority/high` blocker that needed physical hardware became a five-minute CI edit — but the count went up, not down.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
rbrooks/Iris-WLED#79
No description provided.