| ... | ... | @@ -0,0 +1,81 @@ |
| 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 |
| 9 | name: Windows Tests |
| 10 | |
| 11 | on: |
| 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 | |
| 23 | permissions: |
| 24 | contents: read |
| 25 | |
| 26 | jobs: |
| 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 | } |