End-to-end install verification of Windows MSI on a real Win10 host #21

Open
opened 2026-05-17 21:04:16 +00:00 by claude-noether · 0 comments
Collaborator

Follow-up to #18 (windows MSI sync) and the v1.1.0 release.

The cross-build path from issue #18 produced a functional MSI (verified statically via msiinfo — 17 expected files bundled, ProductVersion=1.1.0, file table intact). End-to-end install verification on a real Windows host was deferred at v1.1.0 because the home fleet's general-purpose Win10 VM (VM113 win10home) has no remote-exec channel:

  • qemu-guest-agent on it is the stripped variant (only ping/sync/time/freeze/shutdown/get-vcpus/set-user-password — no guest-exec, no guest-file-write)
  • Listening ports: 135/139/445 only. No SSH, no RDP, no WinRM.
  • Spice console works but requires interactive driving.

Goal

A repeatable headless install-test loop: push MSI → install silently → start lmcp → curl the MCP endpoint → uninstall → repeat for every future release.

Two options

  1. Bake OpenSSH-server into the existing test VM (or a fresh clone of VM106 dedicated to MSI testing, e.g. lmcp-winbuild):

    • One-time Spice-console session: enable the Windows 10 "OpenSSH Server" optional feature
    • Set up authorized_keys for the build hosts
    • Once SSH is live, all future installs are scp + ssh msiexec /i ... /quiet
    • Snapshot afterwards so it survives future template re-cuts
  2. Upgrade qemu-guest-agent to a current version with full exec/file-write support:

    • virtio-win-0.1.215.iso is already mounted on D: in the template — newer qga binaries are in there
    • Install via Spice console one time, then qm guest exec becomes the headless channel
    • No need for SSH stack on the guest

Option 1 is more flexible (we can also scp arbitrary files and run interactive smoke tests). Option 2 is closer to "no extra services on Windows."

Verification recipe (once a channel exists)

# from a Linux builder
ssh win10test "powershell -Command 'Start-Process msiexec -Wait -ArgumentList \"/i C:\\Users\\Public\\lmcp-1.1.0.msi /quiet /norestart /log C:\\install.log\"'"
ssh win10test 'type C:\install.log | findstr /i error'  # should be empty
ssh win10test '"C:\Program Files\lmcp\lua\lua.exe" "C:\Program Files\lmcp\server.lua" 18090 &'
# from the builder
curl -sS http://win10test:18090/mcp \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' \
  | python3 -c 'import sys,json; d=json.load(sys.stdin); print(len(d["result"]["tools"]), "tools")'
# expected: 9
ssh win10test 'msiexec /x C:\Users\Public\lmcp-1.1.0.msi /quiet'

Priority

Low — the MSI structurally verified by msiinfo, source code is byte-identical to the verified Linux build. Failure modes specific to Windows install (e.g. service registration, file ACLs, lua.exe missing a runtime DLL) are not covered by static checks. Worth fixing before the v2.0 release; not urgent before then.

Done at v1.1.0 — not blocking this issue

  • MSI structurally valid (msiinfo Export File / Property / Component all clean)
  • Linux build via wixl + mingw-w64 reproducible via windows/build-msi.sh
  • Artifact at hertz:/opt/herding/artifacts/lmcp-1.1.0.msi
**Follow-up to #18 (windows MSI sync) and the v1.1.0 release.** The cross-build path from issue #18 produced a functional MSI (verified statically via `msiinfo` — 17 expected files bundled, ProductVersion=1.1.0, file table intact). End-to-end *install* verification on a real Windows host was deferred at v1.1.0 because the home fleet's general-purpose Win10 VM (VM113 `win10home`) has no remote-exec channel: - qemu-guest-agent on it is the stripped variant (only `ping`/`sync`/`time`/`freeze`/`shutdown`/`get-vcpus`/`set-user-password` — no `guest-exec`, no `guest-file-write`) - Listening ports: 135/139/445 only. No SSH, no RDP, no WinRM. - Spice console works but requires interactive driving. ## Goal A repeatable headless install-test loop: push MSI → install silently → start lmcp → curl the MCP endpoint → uninstall → repeat for every future release. ## Two options 1. **Bake OpenSSH-server into the existing test VM** (or a fresh clone of VM106 dedicated to MSI testing, e.g. `lmcp-winbuild`): - One-time Spice-console session: enable the Windows 10 "OpenSSH Server" optional feature - Set up authorized_keys for the build hosts - Once SSH is live, all future installs are `scp + ssh msiexec /i ... /quiet` - Snapshot afterwards so it survives future template re-cuts 2. **Upgrade qemu-guest-agent to a current version** with full exec/file-write support: - virtio-win-0.1.215.iso is already mounted on D: in the template — newer qga binaries are in there - Install via Spice console one time, then `qm guest exec` becomes the headless channel - No need for SSH stack on the guest Option 1 is more flexible (we can also `scp` arbitrary files and run interactive smoke tests). Option 2 is closer to "no extra services on Windows." ## Verification recipe (once a channel exists) ```sh # from a Linux builder ssh win10test "powershell -Command 'Start-Process msiexec -Wait -ArgumentList \"/i C:\\Users\\Public\\lmcp-1.1.0.msi /quiet /norestart /log C:\\install.log\"'" ssh win10test 'type C:\install.log | findstr /i error' # should be empty ssh win10test '"C:\Program Files\lmcp\lua\lua.exe" "C:\Program Files\lmcp\server.lua" 18090 &' # from the builder curl -sS http://win10test:18090/mcp \ -H 'Content-Type: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' \ | python3 -c 'import sys,json; d=json.load(sys.stdin); print(len(d["result"]["tools"]), "tools")' # expected: 9 ssh win10test 'msiexec /x C:\Users\Public\lmcp-1.1.0.msi /quiet' ``` ## Priority **Low** — the MSI structurally verified by `msiinfo`, source code is byte-identical to the verified Linux build. Failure modes specific to Windows install (e.g. service registration, file ACLs, lua.exe missing a runtime DLL) are not covered by static checks. Worth fixing before the v2.0 release; not urgent before then. ## Done at v1.1.0 — not blocking this issue - MSI structurally valid (msiinfo Export File / Property / Component all clean) - Linux build via `wixl + mingw-w64` reproducible via `windows/build-msi.sh` - Artifact at `hertz:/opt/herding/artifacts/lmcp-1.1.0.msi`
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: marfrit/lmcp#21