Check-in — 2026-08-21 on-demand Hyper-V runners
TL;DR
CAPTAINKANGAPOO no longer keeps five GitHub Actions guests committed 24/7.
Scheduled task HomelabHyperVRunnerScaler starts Hyper-V VMs from queued jobs
and ACPI-stops them after 15 minutes idle. API fleet cron runs on
homelab-lan-01. Wake was proven 2026-08-21: gha-mgmt Off → Running for
qualify run 32547732271.
Phase status
| Item |
Status |
| Hyper-V scaler in git |
Merged #302 |
Host scaler + AutomaticStartAction=Nothing |
Live on CAPTAINKANGAPOO |
| API control plane on LAN |
RUNNER_FLEET_API_RUNS_ON set |
| Wake proof |
gha-mgmt started for qualify; run succeeded |
| Dedicated build machine |
Out of scope |
What shipped
- Placement map
infra/github-runners/hyperv-scaler/placements.yml
plus python -m scripts.hyperv_scaler and
Invoke-HyperVRunnerScaler.ps1.
- Observe / watchdog / dispatcher validate on
RUNNER_FLEET_API_RUNS_ON (fallback DEPLOY_RUNS_ON).
- Prometheus and scheduled fleet-alert issue logic treat sleeping Hyper-V
runners as expected; 10-minute queue/capacity alerts still fire if the
scaler fails.
Known gaps / drift
- First job after sleep waits about 1–3 minutes (qualify wake was ~1 minute
to
Starting).
- Each scaler tick polls every fleet repo (tens of seconds); the 15s sleep
is in addition to that.
- Guests with no matching work stop after 15 minutes idle. Host reboot does
not auto-start them.
What remains
| Who |
Work |
Priority |
| (done) |
Host install and wake proof |
Done |
| Later |
Dedicated build host |
P3 |
flowchart LR
queued[Queued_job] --> scaler[Windows_scaler]
scaler --> startVm[Start_VM]
startVm --> listeners[systemd_listeners]
cron[Observe_watchdog] --> lan[homelab_lan_01]
apply[Maintain_apply] --> mgmt[gha_mgmt]