tftsr-devops_investigation/ticket-fix-yaml-heredoc-indent.md
Shaun Arman 81442be1bd docs: update CI pipeline wiki and add ticket summary for arm64 fix
Documents the Ubuntu 22.04 + ports.ubuntu.com approach for arm64
cross-compilation and adds a Known Issues entry explaining the Debian
single-mirror multiarch root cause that was replaced.

Co-Authored-By: fix/yaml-heredoc-indent <noreply@local>
2026-04-05 12:51:30 -05:00

3.2 KiB

Fix: build-linux-arm64 — Switch to Ubuntu 22.04 with ports mirror

Description

The build-linux-arm64 CI job failed repeatedly with E: Unable to correct problems, you have held broken packages during the Install dependencies step. Root cause: rust:1.88-slim (Debian Bookworm) uses a single mirror for all architectures. When both [arch=amd64] and [arch=arm64] entries point at the same Debian repo, apt's dependency resolver hits unavoidable conflicts — the binary-all package index is duplicated and certain -dev package pairs cannot be co-installed because they lack Multi-Arch: same. This is a structural Debian single-mirror multiarch limitation that cannot be fixed by tweaking sources.list.

Ubuntu 22.04 solves this by routing arm64 through a separate mirror: ports.ubuntu.com/ubuntu-ports. amd64 and arm64 packages come from entirely different repos, eliminating all cross-arch index overlaps and resolution conflicts.

Acceptance Criteria

  • build-linux-arm64 Install dependencies step completes without apt errors
  • ubuntu:22.04 is the container image for the arm64 job
  • Ubuntu's ports.ubuntu.com/ubuntu-ports is used for arm64 packages
  • libayatana-appindicator3-dev:arm64 is removed (no tray icon in this app)
  • Rust is installed via rustup (not pre-installed in Ubuntu base)
  • All 51 frontend tests pass
  • YAML is syntactically valid

Work Implemented

.gitea/workflows/auto-tag.yml

  • Container: rust:1.88-slimubuntu:22.04 for build-linux-arm64 job
  • Install dependencies step: Full replacement
    • Step 1: Host tools + aarch64 cross-compiler (amd64 packages, installed before multiarch registration)
    • Step 2: Register arm64 architecture; sed existing sources.list entries to [arch=amd64]; add arm64-ports.list pointing at ports.ubuntu.com/ubuntu-ports jammy
    • Step 3: ARM64 dev libs (libwebkit2gtk-4.1-dev, libssl-dev, libgtk-3-dev, librsvg2-dev) — libayatana-appindicator3-dev:arm64 removed
    • Step 4: Node.js via NodeSource
    • Step 5: Rust 1.88.0 via rustup --no-modify-path; $HOME/.cargo/bin appended to $GITHUB_PATH
  • Build step: Added source "$HOME/.cargo/env" as first line (belt-and-suspenders for Rust PATH)

tests/unit/releaseWorkflowCrossPlatformArtifacts.test.ts

  • Added new test: "uses Ubuntu 22.04 with ports mirror for arm64 cross-compile" — asserts workflow contains ubuntu:22.04, ports.ubuntu.com/ubuntu-ports, and jammy
  • All previously passing assertions continue to pass (build step env vars and upload paths unchanged)

docs/wiki/CICD-Pipeline.md

  • build-linux-arm64 job entry now mentions Ubuntu 22.04 + ports mirror
  • New Known Issue entry: Debian Multiarch Breaks arm64 Cross-Compile — documents the root cause and the Ubuntu 22.04 fix for future reference

Testing Needed

  • YAML validation: python3 -c "import yaml; yaml.safe_load(open('.gitea/workflows/auto-tag.yml'))" && echo OKPASSED
  • Frontend tests: npm run test:run51/51 PASSED (50 existing + 1 new)
  • CI integration: Push branch → merge PR → observe build-linux-arm64 Install dependencies step completes without held broken packages error
  • Verify arm64 .deb, .rpm, .AppImage artifacts are uploaded to the Gitea release