ci: build images with the production LongQT OpenCore + unified CPU recipe - #4
Merged
Conversation
…cipe The CI image pipeline still booted kholia/OSX-KVM's OpenCore.qcow2 + OSX-KVM OVMF (incl. OVMF_VARS-1920x1080.fd) + a bespoke -cpu line, while production (doctor.sh + the Go CLI) boots LongQT OpenCore + apt ovmf 4M + a single Skylake-Client-v4 CPU. That OSX-KVM OpenCore does not boot on AMD Zen5, so CI validated a stack the hosts never run. Extract the doctor bake into a shared scripts/lib-firmware.sh and point both scripts at it so CI boots the exact same firmware everywhere. Stock OVMF_VARS_4M.fd lacks the pre-baked 1920x1080 GOP the OCR click-through coordinates need, so the config.plist patch now also sets UEFI>Output>Resolution to reproduce that framebuffer geometry.
CMGS
added a commit
that referenced
this pull request
Jul 2, 2026
The LongQT switch (PR #4) forced UEFI>Output>Resolution=1920x1080, but qmp-input.py's absolute-pointer mapping still hardcoded 1280x800, so every OCR-driven installer click scaled ~1.5x off-target and the click-through hung at the Recovery chooser. Historically the OSX-KVM path actually rendered at 1280x800 (despite the OVMF_VARS-1920x1080.fd filename), coincidentally matching the mapping — which is why it worked before and PR #4's rationale was wrong. Make the resolution a single source (GOP_W/GOP_H in build-qemu-macos.sh): configure_opencore forces it and QMP_W/QMP_H are exported from it, so the plist patch and the click mapping can't drift. qmp-input.py defaults updated to match.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What changed
The CI image-build pipeline now boots the exact same firmware stack production uses (doctor.sh + the Go CLI): LongQT OpenCore, apt
ovmf4M firmware, and a singleSkylake-Client-v4,vendor=GenuineIntel,kvm=onCPU.scripts/lib-firmware.sh— extracts the validated ISO-download + qemu-nbd bake fromdoctor.shinto a self-containedbake_opencore_qcow2 OUT_QCOW2(downloads the LongQT ISO,LONGQT_VERdefaultv0.7, 384M qcow2, GPT+ESP via sgdisk,mkfs.fat -F32, copiesEFI_RELEASE/EFI, with the blockdev-size + partition readiness waits and its own subshell-scoped temp-dir/trap cleanup). Privileged steps go through$SUDOso it works whether the caller is root (doctor) or an unprivileged CI runner with passwordless sudo.scripts/doctor.sh— now sources the lib and callsbake_opencore_qcow2; observable behavior (log lines, idempotency check, exit codes, root/deps/nbd checks) is unchanged.scripts/build-qemu-macos.sh—$OSX_KVM_DIR/OpenCore/OpenCore.qcow2reference (boot/install/setup/slim/verify +configure_opencore) now points at the baked file. The qemu-nbdconfig.plistpatch stays, applied to the baked image./usr/share/OVMF/OVMF_CODE_4M.fd(read-only pflash) + a per-build writable copy ofOVMF_VARS_4M.fd. OSX-KVM OVMF copies dropped.-cpureplaced with exactlySkylake-Client-v4,vendor=GenuineIntel,kvm=on.fetch-macOS-v2.py(recovery download); header comment updated..github/workflows/build-macos-image.yml— addedovmf gdisk dosfstools partedto the apt install list (the bake now runs in CI and needs sgdisk/mkfs.fat/partprobe + the OVMF firmware).README.md— the "CI image pipeline" section now describes the LongQT + unified-CPU recipe and that CI boots the exact same firmware stack production uses.Why one stack matters
Production already runs LongQT OpenCore; the OSX-KVM OpenCore does not boot on AMD Zen5, so the old pipeline validated golden images against a loader the hosts never run. Baking the same LongQT firmware in CI means an image that passes CI boots identically on the Intel/AMD hosts the CLI targets.
Display-resolution preservation
OSX-KVM's
OVMF_VARS-1920x1080.fdpre-bakes a 1920x1080 GOP mode that the OCR click-through coordinates (fixed pixel positions) depend on; stockOVMF_VARS_4M.fdboots at the default resolution. To compensate,configure_opencore's plist patch now also setsUEFI>Output>Resolution="1920x1080". Verified against the LongQT v0.7 RELEASEconfig.plist: itsUEFI>Outputalready hasProvideConsoleGop=TrueandResolution="", so the patch touches onlyResolution(all other Output keys preserved) and will take effect. A WHY comment documents this at the patch site.Validation
bash -non all three scripts: pass.shellcheck -xonlib-firmware.sh+doctor.sh: clean.build-qemu-macos.shhas only pre-existing findings (SC2054/SC2034/SC2086/SC2015, identical set toorigin/master), none introduced here; the$SUDOidiom is deliberately unquoted.fetch-macOS-v2.pyclone + the recovery/disk workdir only)..gofiles changed, run as a sanity no-op):gofumpt -l .clean,go build(darwin+linux) OK,golangci-lint(darwin+linux) 0 issues,go test -raceOK.workflow_dispatchrun is the follow-up validation and is still pending — no workflow was triggered as part of this PR.🤖 Generated with Claude Code