1# On-demand Windows test lane. Manual only: nothing in the suite passes on
2# Windows yet, so this exists to give contributors (and agents) a cloud Windows
3# box to iterate against. Once the suite is green here, fold it into ci.yml.
4#
5# gh workflow run windows-tests.yml --ref <branch> -f package=packages/shared
6# gh workflow run windows-tests.yml --ref <branch> -f package=apps/server \
7# -f files="src/process/externalLauncher.test.ts src/cli/theme.test.ts"
8# gh run watch && gh run view --log-failed
9name: Windows Tests
10
11on:
12 workflow_dispatch:
13 inputs:
14 package:
15 description: "Workspace directory to test, e.g. apps/server or packages/shared. Empty runs every package except apps/server."
16 type: string
17 default: ""
18 files:
19 description: "Space-separated test files relative to the package directory. Empty runs the package's whole suite. Requires package."
20 type: string
21 default: ""
22
23permissions:
24 contents: read
25
26jobs:
27 test:
28 name: Test (${{ inputs.package || 'all non-server' }})
29 runs-on: blacksmith-8vcpu-windows-2025
30 timeout-minutes: 45
31 steps:
32 - name: Checkout
33 uses: actions/checkout@v6
34 with:
35 sparse-checkout: |
36 /*
37 !/.repos/
38 sparse-checkout-cone-mode: false
39
40 # setup-vp's own cache restores a Linux-shaped store on Windows, which is
41 # slower than no cache (see #7975). Cache pnpm's Windows store directly.
42 - name: Setup Vite+
43 uses: voidzero-dev/setup-vp@v1
44 with:
45 node-version-file: package.json
46 cache: false
47 run-install: false
48
49 - name: Resolve package cache path
50 id: package_cache_path
51 shell: pwsh
52 run: '"path=$(vp pm cache dir)" >> $env:GITHUB_OUTPUT'
53
54 - name: Cache packages
55 uses: actions/cache@v6
56 with:
57 path: ${{ steps.package_cache_path.outputs.path }}
58 key: windows-tests-packages-v1-${{ hashFiles('pnpm-lock.yaml') }}
59
60 - name: Install
61 run: vp install
62
63 - name: Ensure Electron runtime is installed
64 if: inputs.package == '' || inputs.package == 'apps/desktop'
65 run: vp run --filter "@t3tools/desktop" ensure:electron
66
67 # `vp run ... test -- <files>` does not forward positional args to vitest,
68 # so file-scoped runs call `vp test run` inside the package instead.
69 - name: Test
70 shell: pwsh
71 run: |
72 $package = '${{ inputs.package }}'
73 $files = '${{ inputs.files }}'
74 if ($package -eq '') {
75 vp run --parallel --concurrency-limit 4 --filter '!t3' --filter '!@t3tools/monorepo' test
76 } elseif ($files -eq '') {
77 vp run --filter "./$package" test
78 } else {
79 Set-Location $package
80 vp test run $files.Split(' ')
81 }