CI and your laptop run the byte-identical commands — every workflow
calls the same make targets you do. If it is green locally, it is green
in CI.
make lint # shellcheck over the whole repo
sudo make test-static IMG=out.img.xz # Tier 1 (~2 min)
sudo make test-chroot IMG=out.img.xz VARIANT=lite # Tier 2 (~10 min)
sudo make test-boot IMG=out.img.xz # Tier 3 (~20-40 min)
All three accept .img or .img.xz. See CI tiers for
what each tier checks and how to extend it.
Tier 1’s assertion engine can run against any unpacked rootfs directory — useful for testing new assertions without a 40-minute build:
RASPOVOS_CI_ROOTFS=/path/to/rootfs ./scripts/ci/assert_image.sh -
Any new check must be proven to fail on an injected defect before it counts as done (rename a unit, break a config, point at a missing model — then show the red run). A check that has never failed proves nothing.
Tier 3 boots the virt qemu machine, not real Pi hardware: firmware,
device-tree, HATs, actual audio and Wi-Fi are not exercised. Those
live in the release checklist, executed by a
human on real hardware before a stable release.