CI: Windows smoke job on the existing windows runner — install the built NSIS bundle and drive the app with tauri-driver #19

Open
opened 2026-09-18 21:41:08 -04:00 by jared · 4 comments
Owner

release.yml already builds on runs-on: windows. Add a job after build-windows that installs the fresh NSIS bundle silently, starts tauri-driver (+ msedgedriver matching the runner's WebView2), and runs a WebdriverIO/Playwright-over-CDP smoke against the running app:

  • boots to the login page, logs into a CI Synapse (see cinny's CI e2e issue) or a stubbed session, opens a room, sends a message (web layer inside the shell);
  • matrix: deep link while running → navigates (#8); while minimised to tray → reveals + navigates;
  • set_global_hotkeys round-trip: invoke the command, synthesise a key with SendInput via PowerShell, assert the lotus-global-hotkey DOM event (#2);
  • tray state commands (set_tray_unread, DND) return without error; set_badge_count/thumbbar commands don't panic (#4, #7);
  • update-ready path (#6) with a mocked updater endpoint.

Toast appearance and Focus Assist cannot be asserted headlessly — keep #13/#18 as manual. Budget: about a day; most of it is the driver/WebView2 plumbing on the runner.

`release.yml` already builds on `runs-on: windows`. Add a job after `build-windows` that installs the fresh NSIS bundle silently, starts `tauri-driver` (+ `msedgedriver` matching the runner's WebView2), and runs a WebdriverIO/Playwright-over-CDP smoke against the running app: - boots to the login page, logs into a CI Synapse (see cinny's CI e2e issue) or a stubbed session, opens a room, sends a message (web layer inside the shell); - `matrix:` deep link while running → navigates (#8); while minimised to tray → reveals + navigates; - `set_global_hotkeys` round-trip: invoke the command, synthesise a key with `SendInput` via PowerShell, assert the `lotus-global-hotkey` DOM event (#2); - tray state commands (`set_tray_unread`, DND) return without error; `set_badge_count`/thumbbar commands don't panic (#4, #7); - update-ready path (#6) with a mocked updater endpoint. Toast *appearance* and Focus Assist cannot be asserted headlessly — keep #13/#18 as manual. Budget: about a day; most of it is the driver/WebView2 plumbing on the runner.
jared added this to the Desktop 2026-Q4 milestone 2026-09-18 21:41:08 -04:00
jared added the priority: mediumarea: nativeqa labels 2026-09-18 21:41:08 -04:00
Author
Owner

Progress (2026-10-21): the Windows smoke workflow passes on the windows runner (runs 2796 and 2797). It now covers:

  • install;
  • boot to the login screen;
  • the local server;
  • microphone permission for the app and not for a foreign page;
  • the call page on its own origin and isolated;
  • the keychain round trip;
  • an update over the running app (PR #42).

Still to add from the plan above:

  • the matrix: deep link while running and while minimised to tray (#8);
  • the set_global_hotkeys round trip with SendInput (#2);
  • tray, badge and thumbbar commands (#4, #7);
  • the update-ready path with a mocked feed (#6).
**Progress** (2026-10-21): the Windows smoke workflow passes on the `windows` runner (runs 2796 and 2797). It now covers: - install; - boot to the login screen; - the local server; - microphone permission for the app and not for a foreign page; - the call page on its own origin and isolated; - the keychain round trip; - **an update over the running app** (PR #42). Still to add from the plan above: - the `matrix:` deep link while running and while minimised to tray (#8); - the `set_global_hotkeys` round trip with `SendInput` (#2); - tray, badge and thumbbar commands (#4, #7); - the update-ready path with a mocked feed (#6).
Author
Owner

Progress (PR #43, run 2812, 11/11):

  • deep links while hidden and while minimised (#8, delivery and un-minimise);
  • the global hotkey round trip (#2);
  • an interactive-desktop check.

The windows runner has no interactive desktop (likely act_runner as a service, in session 0), so window visibility and hotkey injection are reported n/a there.

Still to add: tray, badge and thumbbar commands (#4, #7), and the update-ready path with a mocked feed (#6).

**Progress** (PR #43, run 2812, 11/11): - deep links while hidden and while minimised (#8, delivery and un-minimise); - the global hotkey round trip (#2); - an interactive-desktop check. The `windows` runner has **no interactive desktop** (likely act_runner as a service, in session 0), so window visibility and hotkey injection are reported n/a there. Still to add: tray, badge and thumbbar commands (#4, #7), and the update-ready path with a mocked feed (#6).
Author
Owner

Progress (PR #44, run 2816: 12/12):

  • the tray, badge, taskbar, thumbbar and media-control commands are exercised and reset;
  • the 10 shell-only ones are n/a on the desktop-less runner, and the app survives them.

What's left:

  • the update-ready path with a mocked feed (#6) needs a way to point the installed app at a test update feed;
  • the visibility, hotkey and tray checks only get checked properly once the windows runner runs inside a logged-in desktop session.
**Progress** (PR #44, run 2816: 12/12): - the tray, badge, taskbar, thumbbar and media-control commands are exercised and reset; - the 10 shell-only ones are n/a on the desktop-less runner, and the app survives them. **What's left:** - the update-ready path with a mocked feed (#6) needs a way to point the installed app at a test update feed; - the visibility, hotkey and tray checks only get checked properly once the `windows` runner runs inside a logged-in desktop session.
Author
Owner

Giving the windows runner an interactive desktop: needs about 10 minutes at the VM 148 console.

The owner approved this on 2026-10-25. I couldn't do it remotely:

  • VM 148 (windows-vm on large1) has no QEMU guest agent;
  • it has no address visible from the host;
  • auto-logon needs the Windows account's password stored inside Windows.

The steps assume act_runner runs as a Windows service, which puts it in session 0. That's why the visibility, hotkey and tray checks say "n/a".

0. Optional: enable the guest agent first, so these changes can be made from Proxmox next time.

  • On large1: qm set 148 --agent enabled=1.
  • In the VM: install the virtio guest tools (they include qemu-ga), then reboot the VM.

1. Find the service and its command line (PowerShell as admin):

Get-CimInstance Win32_Service | Where-Object { $_.PathName -match 'act_runner' } | Select-Object Name, StartName, PathName

2. Auto-logon for the account the runner should use. Sysinternals Autologon stores the password encrypted in LSA, not in plain text in the registry:

.\Autologon64.exe <user> <computer-or-domain> <password> /accepteula

3. Keep the session usable. A locked desktop blocks injected keys and window activation:

powercfg /change standby-timeout-ac 0
powercfg /change monitor-timeout-ac 0
reg add "HKCU\Control Panel\Desktop" /v ScreenSaveActive /t REG_SZ /d 0 /f
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\Personalization" /v NoLockScreen /t REG_DWORD /d 1 /f

4. Move the runner from the service to a logon task. Use the service's command line from step 1:

Stop-Service <name>; Set-Service <name> -StartupType Disabled
Set-Content C:\act_runner\start.cmd "cd /d C:\act_runner`r`nact_runner.exe daemon --config config.yaml"
schtasks /Create /TN "act_runner (desktop session)" /SC ONLOGON /RU <user> /RL HIGHEST /TR "C:\act_runner\start.cmd"

5. Check:

  • Reboot. The VM should log itself in, and the runner should show online in Gitea (Site Administration → Runners).
  • Rerun the Windows smoke workflow. The "interactive desktop" line should pass, and the global-hotkey, visibility and tray checks should run for real instead of saying n/a.
  • That would close the automated part of #2 and #19.

Rollback: Set-Service <name> -StartupType Automatic; Start-Service <name>, delete the scheduled task, and run Autologon64.exe again to turn auto-logon off.

🤖 Generated with Claude Code

**Giving the `windows` runner an interactive desktop: needs about 10 minutes at the VM 148 console.** The owner approved this on 2026-10-25. I couldn't do it remotely: - VM 148 (`windows-vm` on large1) has no QEMU guest agent; - it has no address visible from the host; - auto-logon needs the Windows account's password stored inside Windows. The steps assume act_runner runs as a Windows **service**, which puts it in session 0. That's why the visibility, hotkey and tray checks say "n/a". **0. Optional: enable the guest agent first,** so these changes can be made from Proxmox next time. - On large1: `qm set 148 --agent enabled=1`. - In the VM: install the virtio guest tools (they include `qemu-ga`), then reboot the VM. **1. Find the service and its command line** (PowerShell as admin): ```powershell Get-CimInstance Win32_Service | Where-Object { $_.PathName -match 'act_runner' } | Select-Object Name, StartName, PathName ``` **2. Auto-logon** for the account the runner should use. Sysinternals Autologon stores the password encrypted in LSA, not in plain text in the registry: ```powershell .\Autologon64.exe <user> <computer-or-domain> <password> /accepteula ``` **3. Keep the session usable.** A locked desktop blocks injected keys and window activation: ```powershell powercfg /change standby-timeout-ac 0 powercfg /change monitor-timeout-ac 0 reg add "HKCU\Control Panel\Desktop" /v ScreenSaveActive /t REG_SZ /d 0 /f reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\Personalization" /v NoLockScreen /t REG_DWORD /d 1 /f ``` **4. Move the runner from the service to a logon task.** Use the service's command line from step 1: ```powershell Stop-Service <name>; Set-Service <name> -StartupType Disabled Set-Content C:\act_runner\start.cmd "cd /d C:\act_runner`r`nact_runner.exe daemon --config config.yaml" schtasks /Create /TN "act_runner (desktop session)" /SC ONLOGON /RU <user> /RL HIGHEST /TR "C:\act_runner\start.cmd" ``` **5. Check:** - Reboot. The VM should log itself in, and the runner should show **online** in Gitea (Site Administration → Runners). - Rerun the Windows smoke workflow. The "interactive desktop" line should pass, and the global-hotkey, visibility and tray checks should run for real instead of saying n/a. - That would close the automated part of #2 and #19. **Rollback:** `Set-Service <name> -StartupType Automatic; Start-Service <name>`, delete the scheduled task, and run `Autologon64.exe` again to turn auto-logon off. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LotusGuild/cinny-desktop#19