mirror of
https://github.com/jhd3197/ServerKit.git
synced 2026-11-09 05:24:49 +09:00
Hardening plan §7. Catches distro-specific regressions before release. - scripts/test/vm-update.sh: install → forced local update (full blue/green deploy/migrate/switch/health) → re-run to confirm the "Already up to date" version-gate. Same VM harness contract as vm-install.sh (log + status file). - scripts/test/vm-uninstall.sh: install + seed data → default uninstall asserts data preserved (DB snapshot in backups, /var/lib survives) → reinstall → --purge asserts data removed. End-to-end proof of the unified uninstaller. - scripts-ci.yml: now runs all three serverless suites (update+install+lib), lints the new lib/ + test/ files (error severity) and keeps scripts/lib/* warning-clean, and expands the cross-distro unit matrix to Ubuntu 22.04/24.04, Debian 12, Rocky 9, AlmaLinux 9, Fedora 40, and openSUSE Leap 15.5. - test_install.sh: +choose_pkg_manager graceful-failure case (7.4); a no-op docker stub so the uninstall-matrix cases run where docker isn't installed. - test_lib.sh: neutralize the ambient container=oci env var (RPM/SUSE images) and force an empty PATH for the "no package manager" case — both bugs the new matrix surfaced (the tests, not the code). - README: fixed the stale Fedora box, documented the new VM scripts + suites. Validated by running the exact CI container logic locally across all seven images: test_update 13/13, test_install 15-16/0, test_lib 13/13 everywhere. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
189 lines
6.8 KiB
Markdown
189 lines
6.8 KiB
Markdown
# ServerKit E2E Test Harness
|
|
|
|
One-click full-stack test that spins up fresh Linux VMs on your Windows box,
|
|
installs ServerKit from your **local working tree** (uncommitted changes
|
|
included), and runs an API harness against the live panel. Aggregates
|
|
everything into a single HTML report.
|
|
|
|
Designed for the "I'm about to merge a huge PR and want to be sure the
|
|
installer actually works on multiple distros" use case.
|
|
|
|
## Prerequisites (one-time)
|
|
|
|
1. **Multipass** — Ubuntu 22.04 + 24.04 VMs
|
|
```powershell
|
|
winget install Canonical.Multipass
|
|
```
|
|
2. **Vagrant** — Debian 12, Fedora, Rocky 9 VMs (uses Hyper-V provider, no VirtualBox)
|
|
```powershell
|
|
winget install Hashicorp.Vagrant
|
|
```
|
|
**Note:** Vagrant + Hyper-V requires running the script from an
|
|
**elevated** PowerShell (right-click → Run as Administrator). If you
|
|
run as a normal user, the script will tell you and exit cleanly.
|
|
Multipass-only runs (Ubuntu) don't need admin.
|
|
3. **Python 3** on PATH (for the HTML report generator; tests run inside the VMs).
|
|
4. **Hyper-V** enabled (both Multipass and Vagrant use it on Windows).
|
|
|
|
You can install only Multipass if Ubuntu coverage is enough — the harness
|
|
auto-detects which backends are available and skips distros it can't run.
|
|
|
|
## Usage
|
|
|
|
From the repo root, in PowerShell:
|
|
|
|
```powershell
|
|
.\scripts\test\full-stack-test.ps1
|
|
```
|
|
|
|
That's it. Goes and makes coffee. ~1-2 hours on first run (cloud images
|
|
download), 15-30 min after that. When it finishes, your browser opens to the
|
|
HTML report.
|
|
|
|
### Options
|
|
|
|
```powershell
|
|
# Full default suite: ubuntu22, ubuntu24, debian12, fedora, rocky9
|
|
.\scripts\test\full-stack-test.ps1
|
|
|
|
# Subset
|
|
.\scripts\test\full-stack-test.ps1 -Only "ubuntu24,debian12"
|
|
|
|
# Keep VMs running so you can shell in and poke around
|
|
.\scripts\test\full-stack-test.ps1 -Keep
|
|
|
|
# Bigger VMs (default 2 CPU / 4 GB RAM / 15 GB disk)
|
|
.\scripts\test\full-stack-test.ps1 -Cpus 4 -MemoryGB 8
|
|
|
|
# Re-run harness against an already-installed Multipass VM (fast iteration)
|
|
.\scripts\test\full-stack-test.ps1 -ReuseVm sk-test-ubuntu24-<id>
|
|
```
|
|
|
|
### Distro coverage
|
|
|
|
| Distro | Backend | Box / Image |
|
|
|---|---|---|
|
|
| Ubuntu 22.04 | Multipass | `22.04` |
|
|
| Ubuntu 24.04 | Multipass | `24.04` |
|
|
| Debian 12 | Vagrant | `generic/debian12` |
|
|
| Fedora 40 | Vagrant | `generic/fedora40` |
|
|
| Rocky 9 | Vagrant | `generic/rocky9` |
|
|
|
|
### Agent pairing test (optional)
|
|
|
|
After running with `-Keep`:
|
|
|
|
```powershell
|
|
.\scripts\test\agent-test.ps1
|
|
```
|
|
|
|
Exercises the agent <-> panel pairing API end-to-end (enroll → claim).
|
|
|
|
## What it does
|
|
|
|
1. Tar your local repo (excluding `.git`, `node_modules`, venvs, `dist/`).
|
|
2. `multipass launch` three VMs in parallel: Ubuntu 22.04, Ubuntu 24.04, Debian 12.
|
|
3. On each VM, in parallel:
|
|
- Upload the tarball + `vm-install.sh`.
|
|
- Run `install.sh` (real public installer — clones from GitHub, installs
|
|
Python, Node, Docker, nginx, builds frontend, starts systemd unit).
|
|
- Overlay your local working tree on top of `/opt/serverkit`, rebuild
|
|
frontend, restart `serverkit` systemd unit. This is what makes us test
|
|
**your code**, not what's on `main`.
|
|
- Wait for `/api/v1/system/health` to return 200.
|
|
- Push the pytest harness and run it against the live panel.
|
|
- Capture install log + journalctl regardless of outcome.
|
|
4. Generate one self-contained `report.html` with green/red per VM, per test,
|
|
plus full logs inline.
|
|
5. Tear down VMs (unless `-Keep`).
|
|
|
|
## Output
|
|
|
|
```
|
|
scripts/test/output/<run-id>/
|
|
report.html <- open this
|
|
serverkit-src.tar.gz
|
|
sk-test-ubuntu22-<id>/
|
|
install.log
|
|
vm-install.log
|
|
journalctl.log
|
|
install-status ("OK" or "FAIL")
|
|
pytest.log
|
|
pytest-report.json
|
|
sk-test-ubuntu24-<id>/ ...
|
|
sk-test-debian12-<id>/ ...
|
|
```
|
|
|
|
## Update & uninstall coverage
|
|
|
|
Alongside `vm-install.sh`, two more "run inside the VM" scripts exercise the
|
|
other lifecycle stages end-to-end (same contract: log to
|
|
`/var/log/serverkit-test-*.log`, write `OK`/`FAIL` to `/tmp/serverkit-*-status`):
|
|
|
|
- **`vm-update.sh`** — installs ServerKit, runs the local `scripts/update.sh`
|
|
with `--force` (full blue/green deploy → migrate → switch → health), then
|
|
re-runs without `--force` to confirm the "Already up to date" version-gate.
|
|
- **`vm-uninstall.sh`** — installs + seeds sample data, runs the default
|
|
uninstall and asserts user data is preserved (DB snapshot in
|
|
`/var/backups/serverkit`, `/var/lib/serverkit` survives), then reinstalls and
|
|
asserts `--purge` removes the data dirs.
|
|
|
|
Run them by uploading to a `-Keep` VM and `sudo bash /tmp/vm-update.sh`, or wire
|
|
them into the orchestrator the same way `vm-install.sh` is invoked.
|
|
|
|
## Fast, serverless unit tests
|
|
|
|
Most regressions are caught long before a VM is needed. The source-able
|
|
`scripts/test/test_{update,install,lib}.sh` suites exercise the updater,
|
|
installer, and the `scripts/lib/*` abstractions against fixtures and PATH stubs
|
|
— no server, seconds to run, and gated in CI (`.github/workflows/scripts-ci.yml`)
|
|
across Ubuntu 22.04/24.04, Debian 12, Rocky 9, AlmaLinux 9, Fedora 40, and
|
|
openSUSE Leap 15.5 containers.
|
|
|
|
```bash
|
|
bash scripts/test/test_update.sh
|
|
bash scripts/test/test_install.sh
|
|
bash scripts/test/test_lib.sh
|
|
```
|
|
|
|
## Extending the harness
|
|
|
|
Add new tests under `harness/test_*.py` — they're plain pytest using a
|
|
session-scoped `admin_token` fixture and a `base_url` fixture. The orchestrator
|
|
auto-copies every file in `harness/` to each VM, so just dropping in a new
|
|
`test_05_whatever.py` is enough.
|
|
|
|
Currently covered:
|
|
- `test_01_health.py` — backend health, frontend reachable
|
|
- `test_02_auth.py` — setup-status, register, login, JWT-authed request
|
|
- `test_03_plugins.py` — list plugins (install-from-URL test is `@skipif`'d
|
|
until a stable test plugin repo exists; flip when ready)
|
|
- `test_04_smoke.py` — sample of authed endpoints must not return 5xx
|
|
|
|
## Limitations
|
|
|
|
- Doesn't test bare-metal-only stuff (hardware drivers, real partitioning).
|
|
- Agent ARM64 MSI installer isn't exercised (no ARM hardware).
|
|
- UI smoke (Playwright) is not wired up yet — easy to add as a follow-up if
|
|
the API surface stops catching everything.
|
|
- Fedora/Rocky not in the default distro list because Multipass focuses on
|
|
Ubuntu; add via Vagrant + libvirt if you need those.
|
|
|
|
## Troubleshooting
|
|
|
|
**"multipass: command not found"** — install Multipass and restart PowerShell.
|
|
|
|
**Launch fails with timeout** — first launch downloads ~600 MB per distro
|
|
image; let it run. If it times out repeatedly, increase Multipass timeout:
|
|
`multipass set local.driver=hyperv`.
|
|
|
|
**Health check never passes** — open `report.html`, expand "Install log" and
|
|
"journalctl" for that VM. Most common: missing system package on a distro the
|
|
installer doesn't handle, or `frontend build` OOM (bump `-MemoryGB`).
|
|
|
|
**Want to debug a failing VM** — re-run with `-Keep`, then:
|
|
```powershell
|
|
multipass shell sk-test-ubuntu24-<id>
|
|
sudo journalctl -u serverkit -f
|
|
```
|