Files
bfe-core1106-sdk/docs/ci-cd.md
T
BFE EngineeringandClaude Fable 5 13b7d063a2 qemu: display + touch scenario, ADR-0006, docs
Phase 4+5 of the device sim:

- Display + touch verified end-to-end: virtio-gpu at 720x720 (fbdev
  emulation) renders the real WardenOS dashboard from the static LVGL
  fbdev+evdev UI build (flare-edge qemu-vm-support tools/build-ui-vm.sh);
  QMP input-send-event taps the Metrics tab and qemu/tests/ui-shot.sh
  asserts the repaint from screendumps. Two load-bearing QEMU flags found
  and documented: -global virtio-mmio.force-legacy=false (gpu/input are
  VERSION_1-only) and the 200ms press hold (an instantaneous press+release
  lands inside one LVGL indev poll and never clicks).
- qemu/tests/qmp.py: minimal QMP client (screendump, tap, quit).
- stage-2 init starts warden-ui when present and fb0 exists.
- docs/decisions/0006-qemu-device-sim.md: virt-not-custom-board, the
  enters-at-kernel boundary, fragment policy, naming, consequences.
- docs/architecture.md: new section 7 (device emulation), order-of-work
  item 7; modbus cross-reference to the bridge.
- qemu/README.md: emulated-vs-not table, scenarios, gotchas, host/runner
  requirements. docs/ci-cd.md: runner needs one-time qemu-system-arm
  install (fail-closed smoke until then, [maintainer]-gated). Repo README updated.

Final sweep on this commit: shellcheck clean, bridge 7/7 tests, boot smoke
PASS, portal scenario PASS (check-in + fw pull + signed .wfw download),
ui-shot PASS (touch navigates to Metrics) — all under the final flags.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018HUayid7W5w7jBdb9Rrj1K
2026-08-29 20:16:36 -06:00

3.6 KiB
Raw Blame History

CI/CD

.github/workflows/ci.yml — everything portable runs on GitHub-hosted ubuntu-latest; only the heavy kernel build uses the self-hosted runner.

Jobs

Job Runner What it does
test ubuntu-latest cargo test (sim + config-lint) + cargo-llvm-cov line coverage on sim; outputs passed/coverage.
mcdc ubuntu-latest 100% MC/DC enforced on every drivers/*/test (gcc-14 -fcondition-coverage).
bench ubuntu-latest Smoke-runs the sim micro-benchmarks; emits ns/op trend JSON.
patches-apply ubuntu-latest Fetches pristine linux-6.18.46 (cached, sha256-verified) and applies patches/* in order.
kernel-build [self-hosted, warden-sdk] build/build-kernel.shzImage + rv1106-warden.dtb, uploaded as an artifact. Dispatch-gated until the runner is fully provisioned (below).
badges ubuntu-latest Renders loc/tests/coverage shields on push to main ([skip ci] + paths-ignore loop guard).

The self-hosted runner (bfe-mpc-0640)

A third repo-scoped runner instance on bfe-mpc-0640 (alongside flare and flare-edge), registered with the label warden-sdk as bfe-mpc-0640-warden-sdk, in ~/actions-runner-warden-sdk.

INSTALLED + ONLINE (2026-08-25). The runner is a running systemd service (actions.runner.bfe-noah-warden-sdk.bfe-mpc-0640-warden-sdk.service, enabled, cgroup-capped CPUQuota=400%/MemoryMax=6G) and kernel-build has been verified end-to-end (RV1106 6.18.46 → zImage 8.25 MB + rv1106-warden.dtb). Steps 12 below are the record of that install (they needed user's sudo on 0640); steps 34 are handled inside the workflow, so the host needs no manual toolchain/python.

  1. Install as a service (persistence): cd ~/actions-runner-warden-sdk && sudo ./svc.sh install user && sudo ./svc.sh start. Until then the runner is offline and kernel-build only runs when dispatched against an online runner.
  2. Resource cap (protect the shared host): a drop-in at /etc/systemd/system/actions.runner.bfe-noah-warden-sdk.*.service.d/*.conf with CPUQuota=400% + MemoryMax=6G, then sudo systemctl daemon-reload. The build inherits that cgroup. (The workflow also passes JOBS=4 as a belt-and-braces bound.)
  3. Kernel cross toolchain — done in the workflow: the kernel-build job sets CROSS_COMPILE=arm-linux-gnueabihf- (Debian gcc-arm-linux-gnueabihf, already on the runner) and build-kernel.sh honors it. The kernel is freestanding, so the generic arm cross compiler links it — no Luckfox SDK toolchain path needed. (To use the SDK uclibc toolchain instead, set SDK_TC to its bin/ and drop the override.)
  4. python (not python3) — done in the workflow: the kernel-build job symlinks pythonpython3 into $RUNNER_TEMP/bin and prepends it to $GITHUB_PATH. No host-side venv/shim needed.

Host build deps: dtc bc flex bison libssl-dev — already present on 0640.

  1. qemu-system-arm (for the boot-smoke step inside kernel-build, added with the qemu/ device sim — ADR-0006): one-time sudo apt-get install qemu-system-arm cpio on 0640. The step is fail-closed — a missing qemu binary fails the job with a message pointing here; it never silently skips. NOT YET PROVISIONED (2026-08-29): the first dispatched kernel-build after this lands will fail its smoke step until the install is done ([maintainer]-gated sudo on 0640).

Badges

Static shields SVGs are committed by the badges job (private repo can't use dynamic shields). The GitHub-native ci.yml status badge works live regardless.