From 466a7a8221d4e45a60f28c682545f4658fbd59d4 Mon Sep 17 00:00:00 2001 From: Emir Beganovic Date: Fri, 9 Oct 2026 19:06:48 +0200 Subject: [PATCH] Integration harness: an edge ISO installs the -dev packages builder/build-iso.sh puts omarchy-dev and omarchy-settings-dev on an edge ISO, as it does on a dev or local one. The harness picked its package names from the ISO's file name and knew dev, local and pr, so for an edge ISO it asked the installer for the release packages. --- test/integration.d/base-test.sh | 5 +- test/vm-image/vm-install | 90 --------------------------------- 2 files changed, 3 insertions(+), 92 deletions(-) delete mode 100755 test/vm-image/vm-install diff --git a/test/integration.d/base-test.sh b/test/integration.d/base-test.sh index b9d4ab3..9b20e6b 100644 --- a/test/integration.d/base-test.sh +++ b/test/integration.d/base-test.sh @@ -503,11 +503,12 @@ EOF mcopy -i "$CIDATA_IMG" "$dir"/* ::/ } -# The dev/local ISO installs the -dev packages; a stable ISO the plain ones. +# The edge/dev/local ISO installs the -dev packages, as builder/build-iso.sh +# picks them; a stable ISO the plain ones. detect_packages() { RUNTIME_PACKAGE=omarchy-dev SETTINGS_PACKAGE=omarchy-settings-dev - if [[ $(basename "$ISO") != *dev* && $(basename "$ISO") != *local* && $(basename "$ISO") != *pr* ]]; then + if [[ $(basename "$ISO") != *edge* && $(basename "$ISO") != *dev* && $(basename "$ISO") != *local* && $(basename "$ISO") != *pr* ]]; then RUNTIME_PACKAGE=omarchy SETTINGS_PACKAGE=omarchy-settings fi diff --git a/test/vm-image/vm-install b/test/vm-image/vm-install deleted file mode 100755 index ef63cd9..0000000 --- a/test/vm-image/vm-install +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash -# Unattended install of an Omarchy ISO into a qcow2, through a cidata drive. -# -# vm-install -# -# out_dir gets base.qcow2 (the installed disk, powered off), OVMF_VARS.4m.fd -# and the key that can log in to it. vm-seal turns that into a reusable image. -# Same answer files and VM shape as omarchy-iso's test/integration.d/base-test.sh. -set -uo pipefail -[[ $# -eq 2 ]] || { echo "Usage: vm-install " >&2; exit 2; } -ISO=$(realpath "$1"); OUT=$(realpath -m "$2"); W=$OUT/work -# Arch and Ubuntu keep the firmware in different places. -for fw in /usr/share/edk2/x64/OVMF_CODE.4m.fd:/usr/share/edk2/x64/OVMF_VARS.4m.fd /usr/share/OVMF/OVMF_CODE_4M.fd:/usr/share/OVMF/OVMF_VARS_4M.fd; do - [[ -f ${fw%%:*} && -f ${fw##*:} ]] && { FW_CODE=${fw%%:*}; FW_VARS=${fw##*:}; break; } -done -: "${FW_CODE:?no OVMF firmware found}" -[[ -r /dev/kvm && -w /dev/kvm ]] || { echo "vm-install: /dev/kvm is not usable" >&2; exit 1; } -GUEST_USER=omarchy; GUEST_PASSWORD=omarchy; GUEST_HOSTNAME=omarchy-vm; SSH_PORT=2422 -rm -rf "$W"; mkdir -p "$W/cidata" "$W/shots"; t0=$(date +%s); el() { echo $(( $(date +%s) - t0 )); } -ssh-keygen -q -t ed25519 -N '' -C omarchy-vm-build -f "$W/id_ed25519" -hash=$(openssl passwd -6 "$GUEST_PASSWORD") -disk_bytes=$((40*1024**3)); mib=$((1024**2)); boot_start=$mib; boot_size=$((2*1024**3)); main_start=$((boot_size+boot_start)); main_size=$((disk_bytes-main_start-mib)) -jq -n --arg h "$hash" --arg u "$GUEST_USER" '{root_enc_password:$h, users:[{enc_password:$h, groups:[], sudo:true, username:$u}]}' > "$W/cidata/user_credentials.json" -cat > "$W/cidata/user_configuration.json" </dev/null || { echo "bad json"; exit 1; } -echo "Omarchy Test" > "$W/cidata/user_full_name.txt"; echo "test@omarchy.org" > "$W/cidata/user_email_address.txt"; echo false > "$W/cidata/user_encrypt_installation.txt" -cp "$W/id_ed25519.pub" "$W/cidata/authorized_keys" -truncate -s 4M "$W/cidata.img"; mkfs.vfat -n CIDATA "$W/cidata.img" >/dev/null; mcopy -i "$W/cidata.img" "$W"/cidata/* ::/ -qemu-img create -f qcow2 "$W/disk.qcow2" 40G >/dev/null; cp "$FW_VARS" "$W/OVMF_VARS.4m.fd" -qemu-system-x86_64 -cpu host -enable-kvm -machine q35,accel=kvm -smp 8 -m 8G \ - -drive if=pflash,format=raw,readonly=on,file="$FW_CODE" -drive if=pflash,format=raw,file="$W/OVMF_VARS.4m.fd" \ - -drive file="$W/disk.qcow2",format=qcow2,if=none,id=drive0 -device virtio-blk-pci,drive=drive0,bootindex=1 \ - -device virtio-vga -display none -usb -device usb-tablet \ - -netdev user,id=net0,hostfwd=tcp:127.0.0.1:$SSH_PORT-:22 -device virtio-net-pci,netdev=net0 \ - -qmp "unix:$W/qmp.sock,server,nowait" -serial "file:$W/serial.log" -pidfile "$W/qemu.pid" -daemonize \ - -drive "file=$ISO,media=cdrom,if=none,format=raw,id=cdrom0,readonly=on" -device ide-cd,drive=cdrom0,bootindex=2 \ - -drive "file=$W/cidata.img,format=raw,if=none,id=cidata" -device usb-storage,drive=cidata || exit 1 -qmp() { printf '{"execute":"qmp_capabilities"}\n%s\n' "$1" | socat - "unix-connect:$W/qmp.sock" >/dev/null 2>&1; } -shot() { qmp "{\"execute\":\"screendump\",\"arguments\":{\"filename\":\"$W/shots/$1.png\",\"format\":\"png\"}}"; } -sshg() { ssh -i "$W/id_ed25519" -p $SSH_PORT -o BatchMode=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ConnectTimeout=3 -o LogLevel=ERROR $GUEST_USER@127.0.0.1 "$@"; } -echo "install started"; n=0 -while :; do - sshg true 2>/dev/null && { echo "ssh_up $(el)s"; break; } - kill -0 "$(cat "$W/qemu.pid")" 2>/dev/null || { echo "qemu exited at $(el)s"; exit 1; } - (( $(el) > 2400 )) && { shot timeout; echo "timeout"; exit 1; } - n=$((n+1)); (( n % 6 == 0 )) && { shot "$(printf 'p-%04d' "$(el)")"; sleep 1 - txt=$(tesseract "$W/shots/$(printf 'p-%04d' "$(el)")".png - 2>/dev/null || true) - grep -qi "Reboot Now" <<<"$txt" && { echo "reboot prompt $(el)s"; qmp '{"execute":"send-key","arguments":{"keys":[{"type":"qcode","data":"ret"}]}}'; } - grep -qi "installation stopped" <<<"$txt" && { echo "install stopped $(el)s"; exit 1; } - echo "... $(el)s"; } - sleep 10 -done -sshg 'timeout 180 systemctl is-system-running --wait; systemd-analyze; cat /etc/os-release | head -3; pacman -Q omarchy linux-omarchy 2>&1; cat ~/.local/share/omarchy/version 2>/dev/null' > "$W/first-boot.txt" 2>&1 -sshg 'sudo -n cat /var/log/omarchy-install-timing.json' > "$W/install-timing.json" 2>/dev/null -shot first-boot; echo "first_boot_checked $(el)s"; cat "$W/first-boot.txt" -# Power off cleanly, so the disk is consistent, and leave the three files vm-seal reads. -printf '%s\n' "$GUEST_PASSWORD" | sshg "sudo -S -p '' systemctl poweroff" 2>/dev/null || true -pid=$(cat "$W/qemu.pid"); for i in $(seq 1 120); do kill -0 "$pid" 2>/dev/null || break; sleep 1; done -kill -0 "$pid" 2>/dev/null && { echo "vm-install: the VM did not power off" >&2; exit 1; } -mv "$W/disk.qcow2" "$OUT/base.qcow2"; cp "$W/OVMF_VARS.4m.fd" "$W/id_ed25519" "$W/id_ed25519.pub" "$OUT/" -echo "installed: $OUT/base.qcow2 ($(du -sh "$OUT/base.qcow2" | cut -f1)) in $(el)s"