VM Testing and Release Validation¶
Objective¶
Validate release artifacts across target OSes from a clean VM state.
Diagram source: vm-validation-pipeline.mmd
Components¶
- Host orchestrator:
scripts/run_automated_vm_tests.sh - Artifact downloader:
scripts/download_release_artifacts.sh - Linux in-VM runner:
scripts/vm_test_runner.sh - Windows in-VM runner:
scripts/vm_test_runner.ps1 - VM definitions:
Vagrantfile
Current VM matrix¶
ubuntu18ubuntu22ubuntu24debian12almalinuxopensusewindows
(Deprecated/removed: Debian 11 from Vagrant + orchestrator)
Execution¶
The orchestrator: 1. Downloads release assets to vms/artifacts 2. Runs VM tests with bounded concurrency (default: 3 at a time) 3. Logs per VM to vms/artifacts/logs/<vm>_run.log 4. Collects reports under vms/artifacts/reports/
Override concurrency when needed:
What each VM runner validates¶
Linux runner¶
- Detect OS family and distro/version
- Install DEB or fallback AppImage
- Verify
--version - Install selected tools (
lynis,ciscat, conditionalopenscap, conditionalusg) - Execute scans and export PDF outputs
- Validate server start/status/stop and print server logs if available
- Copy reports
- Cleanup
Windows runner¶
- Install windows artifact
- Verify
--version - Install
hardeningkitty,ciscat - Run scans and export PDFs
- Validate server start/status/stop
- Collect reports and cleanup
Practical debugging checklist¶
- Tail each log:
tail -n 100 vms/artifacts/logs/<vm>_run.log- For running jobs, follow specific VM log in real-time:
tail -f vms/artifacts/logs/ubuntu22_run.log- Validate artifacts downloaded:
ls -la vms/artifacts
Retagging workflow (when a release needs to be reissued)¶
- Commit required fixes.
- Delete/recreate tag on latest commit.
- Push branch + tag.
- Confirm new
Build and Releaserun is triggered for the tag.
Example sequence:
git tag -d v1.1.2
git push origin :refs/tags/v1.1.2
git tag v1.1.2
git push origin main
git push origin v1.1.2
Common non-code failures¶
- Interrupted/corrupt Vagrant box download (
ubuntu24) - Host resource pressure during concurrent provisioning
- Port conflicts on host for server checks