diff --git a/tests/proxmox/README.md b/tests/proxmox/README.md index b787f17..f128283 100644 --- a/tests/proxmox/README.md +++ b/tests/proxmox/README.md @@ -40,33 +40,63 @@ Without the target hardware (9950X3D / RTX 5090), we can still test: ### 1. Create the test VM (run on Proxmox host) ```bash -# Copy scripts to Proxmox host -scp tests/proxmox/create-vm.sh root@proxmox:/root/ -scp tests/proxmox/run-in-vm.sh root@proxmox:/root/ - -# Create the VM -ssh root@proxmox bash /root/create-vm.sh +# Copy the script to Proxmox and run it +scp tests/proxmox/create-vm.sh root@your-proxmox:/root/ +ssh root@your-proxmox bash /root/create-vm.sh ``` -### 2. Run the tests (automated via cloud-init or manual SSH) +This creates the VM and cloud-init installs all packages + clones the repo. Wait ~5 minutes for provisioning to complete. + +### 2. SSH in and run tests ```bash -# Option A: wait for cloud-init to finish (fully automated) -# The VM runs tests automatically on first boot. +# Get the VM IP from Proxmox +ssh root@your-proxmox "qm guest cmd 900 network-get-interfaces" | grep ip-address -# Option B: SSH in and run manually -ssh darkforge@ bash /home/darkforge/run-in-vm.sh +# SSH into the VM +ssh darkforge@ # password: darkforge ``` +Then start the tests. They run inside a **tmux session** so you can disconnect and reconnect without interrupting them: + +```bash +# Full test suite (~2-6 hours) — runs in tmux, safe to disconnect +darkforge-test + +# Fast mode (~30 min) — skips toolchain/kernel/ISO builds +darkforge-test --quick + +# Medium mode (~1 hour) — skips only toolchain bootstrap +darkforge-test --no-build +``` + +**tmux controls:** +- `Ctrl+B` then `D` — detach (tests keep running in background) +- `tmux attach -t darkforge` — reattach to see progress +- `tmux ls` — list running sessions + ### 3. Collect the report +Once tests finish (check with `tmux attach -t darkforge`): + ```bash -scp darkforge@:/home/darkforge/darkforge/tests/report.json ./ -scp darkforge@:/home/darkforge/darkforge/tests/report.txt ./ +# From your local machine +scp darkforge@:~/darkforge/tests/report.json ./ +scp darkforge@:~/darkforge/tests/report.txt ./ +``` + +The `report.txt` is a human-readable summary. The `report.json` is machine-readable and can be given to the development process for automated debugging. + +### 4. Re-run after code changes + +```bash +ssh darkforge@ +cd ~/darkforge +git pull --recurse-submodules +darkforge-test --quick # re-run tests ``` ## Files - `create-vm.sh` — runs on the Proxmox host, creates and configures the VM -- `run-in-vm.sh` — runs inside the VM, clones the project and runs all tests -- `cloud-init-user.yaml` — cloud-init user-data for automated first-boot testing +- `run-in-vm.sh` — runs inside the VM, executes all test suites, generates reports diff --git a/tests/proxmox/create-vm.sh b/tests/proxmox/create-vm.sh index fb4e9b5..a19b24a 100755 --- a/tests/proxmox/create-vm.sh +++ b/tests/proxmox/create-vm.sh @@ -144,6 +144,7 @@ packages: - bc - rsync - openssh + - tmux runcmd: # Grow the partition to fill the disk @@ -159,21 +160,26 @@ runcmd: echo "CLONE FAILED — manually clone the repo" ' - # Copy the test runner + # Create the darkforge-test convenience command - | - if [ -f /home/darkforge/darkforge/tests/proxmox/run-in-vm.sh ]; then - cp /home/darkforge/darkforge/tests/proxmox/run-in-vm.sh /home/darkforge/ - chown darkforge:darkforge /home/darkforge/run-in-vm.sh - chmod +x /home/darkforge/run-in-vm.sh + cat > /usr/local/bin/darkforge-test << 'DTEOF' + #!/bin/bash + SCRIPT="/home/darkforge/darkforge/tests/proxmox/run-in-vm.sh" + if [ ! -f "$SCRIPT" ]; then + echo "ERROR: Test script not found. Is the repo cloned?" + echo " git clone --recurse-submodules https://git.dannyhaslund.dk/danny8632/darkforge.git ~/darkforge" + exit 1 fi + ARGS="$*" + exec tmux new-session -d -s darkforge \ + "bash ${SCRIPT} --tmux ${ARGS}; echo ''; echo 'Tests finished. Press Enter to close.'; read" \; \ + attach-session -t darkforge + DTEOF + chmod +x /usr/local/bin/darkforge-test - # Run the test suite automatically - - | - su - darkforge -c ' - if [ -f /home/darkforge/run-in-vm.sh ]; then - bash /home/darkforge/run-in-vm.sh 2>&1 | tee /home/darkforge/test-output.log - fi - ' + # Signal that provisioning is done + - touch /home/darkforge/.provisioned + - chown darkforge:darkforge /home/darkforge/.provisioned CLOUDINIT qm set "${VMID}" --cicustom "user=local:snippets/darkforge-test-init.yaml" @@ -187,23 +193,22 @@ echo "" echo "═══════════════════════════════════════════════" echo " VM ${VMID} created and starting." echo "" -echo " The VM will:" -echo " 1. Boot Arch Linux" -echo " 2. Install required packages via cloud-init" -echo " 3. Clone the DarkForge repository" -echo " 4. Run the full test suite" +echo " Cloud-init will install packages and clone the repo." +echo " Wait ~5 min for provisioning, then SSH in to run tests." echo "" -echo " Monitor progress:" -echo " qm terminal ${VMID} (serial console)" +echo " Get the VM IP:" +echo " qm guest cmd ${VMID} network-get-interfaces | grep -oP '\"ip-address\":\\s*\"\\K[0-9.]+'" echo "" -echo " SSH access (after boot):" -echo " ssh darkforge@\$(qm guest cmd ${VMID} network-get-interfaces | grep -oP '\"ip-address\":\\s*\"\\K[0-9.]+')" -echo " Password: darkforge" +echo " SSH in:" +echo " ssh darkforge@ (password: darkforge)" echo "" -echo " Or get IP:" -echo " qm guest cmd ${VMID} network-get-interfaces" +echo " Run tests in a tmux session (detachable):" +echo " darkforge-test # starts tests in tmux" +echo " darkforge-test --quick # fast mode (30 min)" echo "" -echo " Collect report after tests finish:" -echo " VM_IP=\$(qm guest cmd ${VMID} network-get-interfaces | grep -oP '\"ip-address\":\\s*\"\\K[0-9.]+')" -echo " scp darkforge@\$VM_IP:/home/darkforge/darkforge/tests/report.* ./" +echo " Detach from tmux: Ctrl+B then D" +echo " Reattach later: tmux attach -t darkforge" +echo "" +echo " Collect report:" +echo " scp darkforge@:~/darkforge/tests/report.* ./" echo "═══════════════════════════════════════════════" diff --git a/tests/proxmox/run-in-vm.sh b/tests/proxmox/run-in-vm.sh index b865b38..ecb04f9 100755 --- a/tests/proxmox/run-in-vm.sh +++ b/tests/proxmox/run-in-vm.sh @@ -18,11 +18,33 @@ # 10. Generates a JSON + text report # # Usage: -# bash run-in-vm.sh # full run (2-6 hours depending on hardware) -# bash run-in-vm.sh --quick # skip toolchain/kernel/ISO (30 min) -# bash run-in-vm.sh --no-build # skip toolchain bootstrap (1 hour) +# darkforge-test # runs in tmux (detachable) +# darkforge-test --quick # fast mode in tmux +# bash run-in-vm.sh # direct run (2-6 hours) +# bash run-in-vm.sh --quick # direct, skip toolchain/kernel/ISO (30 min) +# bash run-in-vm.sh --no-build # direct, skip toolchain bootstrap (1 hour) +# +# tmux controls: +# Ctrl+B then D — detach (tests keep running) +# tmux attach -t darkforge — reattach # ============================================================================ +# --- If called as "darkforge-test", wrap in tmux ---------------------------- +TMUX_MODE=false +for arg in "$@"; do + [ "$arg" = "--tmux" ] && TMUX_MODE=true +done + +if [ "$TMUX_MODE" = false ] && [ "$(basename "$0")" = "darkforge-test" ]; then + # Re-exec ourselves inside a tmux session + ARGS="$*" + exec tmux new-session -d -s darkforge \ + "bash $(readlink -f "$0") --tmux ${ARGS}; echo ''; echo 'Tests finished. Press Enter to close.'; read" \; \ + attach-session -t darkforge +fi +# Strip --tmux from args for the actual test run +set -- $(echo "$@" | sed 's/--tmux//g') + set -uo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"