Files
kubesolo-os/.gitea/workflows/build-arm64.yaml
Adolfo Delorenzo e1b8a69294
All checks were successful
CI / Go Tests (push) Successful in 1m52s
CI / Shellcheck (push) Successful in 1m2s
CI / Build Go Binaries (amd64, linux, linux-amd64) (push) Successful in 1m31s
CI / Build Go Binaries (arm64, linux, linux-arm64) (push) Successful in 1m32s
ci(arm64): skip kernel rebuild on workflow/docs-only changes
`build-arm64.yaml` reruns the 60-minute mainline kernel build on every push
to main. That's the right behavior when kernel fragments / init scripts /
build scripts change — it's pure burn when only workflows or docs do.

Add `paths-ignore` for `.gitea/workflows/**`, `.github/workflows/**`,
`docs/**`, top-level `*.md`, `CHANGELOG.md`, `README.md`, `.gitignore`.

Any change that affects what we build (kernel fragment, module list, init,
build/) still triggers a fresh run.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-15 19:41:54 -06:00

89 lines
3.0 KiB
YAML

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