ref:main

CI: Linux build + headless QEMU integration job on Anvil #9

open Opened by cole.christensen@gmail.com

CI: Linux build + headless QEMU integration job on Anvil

Parent: #1. Start once the #2 E2E harness exists; can land alongside #3.

Context

  • Upstream Sunshine CI is GitHub Actions (.github/workflows/ci-linux.yml etc.), which doesn’t run on Anvil. Leave those files untouched so upstream diffs stay clean. Add Anvil CI config separately; check the Anvil docs or anvil ci --help for the pipeline file format and location.
  • Online Anvil runners seen 2026-09-12: DESKTOP-12GQBKK (linux x86_64) and carl (linux aarch64). Check with anvil runner list --org fangorn. Confirm whether the runner has /dev/kvm and /dev/dri; the job must adapt to what’s there.

Tasks

  • Job build: configure with -DSUNSHINE_ENABLE_QEMU=ON -DBUILD_TESTS=ON -DBUILD_DOCS=OFF, build, run tests/test_sunshine. Also a build with SUNSHINE_ENABLE_QEMU=OFF (REQ-CMP-001).
  • Job lint: clang-format check on changed files and a doxygen build, matching upstream’s rules.
  • Job e2e-shm: install or build QEMU with dbus-display, then run tests/e2e/qemu/e2e_stream.sh with software encoding and the shm path. Use KVM when present, TCG otherwise (longer timeouts). Cache the guest image.
  • Job e2e-dmabuf: only on runners with /dev/dri; clearly reported as skipped elsewhere, never silently passed.
  • Upload test logs, Sunshine logs, QEMU stderr, and the last decoded frame PNG as artifacts on failure.
  • After tests, run anvil requirement status --repo fangorn/sunshine-qemu; the job fails if it fails.
  • Put the test and traceability commands in a script (scripts/ci/anvil-test.sh) so a local run matches CI.

Done when

A PR to main runs build, lint and e2e-shm, all green, and a deliberately broken capture makes e2e-shm fail (verified once, noted in the PR). PR Closes #9.