name: ARM64 Build # Smoke-test workflow for main-branch ARM64 builds. Triggers on push to main # (so we catch breakages early) and on manual dispatch. # # Tag pushes are intentionally NOT a trigger — release.yaml handles tags and # also produces the disk image. Triggering both on the same tag wastes an # hour of Odroid time on a duplicate kernel build. # # `paths-ignore` keeps workflow-file and docs-only commits from kicking off # a 60-minute Odroid rebuild. If you change a kernel fragment, init script, # or build/script, this WILL fire — that's by design. on: push: branches: [main] paths-ignore: - '.gitea/workflows/**' - '.github/workflows/**' - 'docs/**' - '*.md' - 'CHANGELOG.md' - 'README.md' - '.gitignore' workflow_dispatch: jobs: build-arm64-generic: name: Build generic ARM64 disk image # Routes to the Odroid self-hosted runner via the arm64-linux label. # See docs/ci-runners.md for runner setup. runs-on: arm64-linux steps: - uses: actions/checkout@v4 - name: Show host info run: | uname -a nproc free -h df -h /home /tmp || df -h / - name: Verify build prerequisites run: | # The Odroid runner ships these via apt; this is a sanity check. which gcc make bc bison flex cpio gzip xz wget curl mkfs.ext4 mkfs.vfat \ sfdisk losetup kpartx grub-mkimage qemu-system-aarch64 git busybox ls -la /bin/busybox file /bin/busybox | grep -q 'statically linked' || { echo "ERROR: /bin/busybox is not statically linked — install busybox-static" exit 1 } - name: Build mainline ARM64 kernel # Cached in build/cache/kernel-arm64-generic between runs (persistent # working dir on the host runner). First run takes 30-60 min; reruns # exit immediately once the .config + Image match. run: | time make kernel-arm64 - name: Build cross-arch Go binaries run: make build-cross - name: Prepare generic ARM64 rootfs run: sudo make rootfs-arm64 - name: Build ARM64 UEFI disk image run: sudo make disk-image-arm64 - name: Show output artifact run: | ls -lh output/ file output/*.arm64.img - name: Boot smoke test (best-effort) # KubeSolo's image import deadline can fire under QEMU TCG on the # Odroid; the boot itself succeeds through stage 90 every time, but # the final "KubeSolo started" health check is timing-sensitive. # We mark this continue-on-error until we have KVM or real hardware. continue-on-error: true run: sudo make test-boot-arm64-disk - name: Upload disk image if: startsWith(github.ref, 'refs/tags/v') uses: actions/upload-artifact@v4 with: name: kubesolo-os-arm64-${{ github.ref_name }} path: output/kubesolo-os-*.arm64.img retention-days: 90