From ddb02da77af4400b1536c67c8971f6ffdc483e62 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 15 May 2026 12:30:24 +0200 Subject: [PATCH 1/8] ci: test self-hosted windows arm64 runner Route the Windows test matrix entry to a self-hosted ARM64 runner to validate the toolchain end-to-end. Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/test.yml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 083041bff..edfb6e589 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -24,9 +24,13 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest-x64] - name: test - ${{ matrix.os }} - runs-on: ${{ matrix.os }} + include: + - name: ubuntu-latest + runner: ubuntu-latest + - name: windows-self-hosted-arm64 + runner: [self-hosted, Windows, ARM64, checkly-cli] + name: test - ${{ matrix.name }} + runs-on: ${{ matrix.runner }} steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v4 @@ -44,7 +48,7 @@ jobs: - name: Save LLM rules as an artifact uses: actions/upload-artifact@v4 with: - name: llm-rules-test-${{ matrix.os }} + name: llm-rules-test-${{ matrix.name }} if-no-files-found: error path: packages/cli/dist/ai-context/* retention-days: 1 From 81541f088d89a2ea8c61f786bc6fbd2b99a34a4b Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 15 May 2026 12:42:04 +0200 Subject: [PATCH 2/8] ci: re-trigger after installing git + pwsh on self-hosted runner Co-Authored-By: Claude Opus 4.7 (1M context) From 45c48f3633cffb308f30b1051d3831f4104defb8 Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 15 May 2026 16:26:34 +0200 Subject: [PATCH 3/8] ci: re-trigger after moving runner workspace + Verdaccio onto RAM disk Co-Authored-By: Claude Opus 4.7 (1M context) From 14ed0bc79dc6b6655cf87895a45ac3cf4bac88ce Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 15 May 2026 16:49:27 +0200 Subject: [PATCH 4/8] ci: re-trigger after fully relocating runner workspace to RAM disk Co-Authored-By: Claude Opus 4.7 (1M context) From 330505fe50f410bf278f65f68aa53c70f886a5ea Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 15 May 2026 17:09:02 +0200 Subject: [PATCH 5/8] ci: re-trigger after switching RAM disk to exFAT Co-Authored-By: Claude Opus 4.7 (1M context) From 5e70b99d372379236c404b48ebf253954c5a13db Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 15 May 2026 17:18:15 +0200 Subject: [PATCH 6/8] ci: trim workflow to just the self-hosted windows runner Co-Authored-By: Claude Opus 4.7 (1M context) --- .github/workflows/test.yml | 55 +++----------------------------------- 1 file changed, 3 insertions(+), 52 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index edfb6e589..7d91fbe2b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,31 +6,9 @@ on: - main jobs: - lint: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v4 - with: - node-version: '20.x' - cache: "npm" - cache-dependency-path: package-lock.json - - run: npm config set fund false && npm set audit false - - run: npm ci - # Test that the packaging works as well - - run: npm pack --workspaces - - run: npm run lint test: - strategy: - fail-fast: false - matrix: - include: - - name: ubuntu-latest - runner: ubuntu-latest - - name: windows-self-hosted-arm64 - runner: [self-hosted, Windows, ARM64, checkly-cli] - name: test - ${{ matrix.name }} - runs-on: ${{ matrix.runner }} + name: test - windows-self-hosted-arm64 + runs-on: [self-hosted, Windows, ARM64, checkly-cli] steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v4 @@ -48,34 +26,7 @@ jobs: - name: Save LLM rules as an artifact uses: actions/upload-artifact@v4 with: - name: llm-rules-test-${{ matrix.name }} + name: llm-rules-test-windows-self-hosted-arm64 if-no-files-found: error path: packages/cli/dist/ai-context/* retention-days: 1 - test-e2e: - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, windows-latest-x64] - name: test-e2e - ${{ matrix.os }} - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v4 - with: - node-version: '20.x' - cache: "npm" - cache-dependency-path: package-lock.json - - uses: pnpm/action-setup@v5 - with: - version: 10 - - run: npm config set fund false && npm set audit false - - run: npm ci - - run: npm run prepack - - run: npm run test:e2e - env: - CHECKLY_ACCOUNT_NAME: ${{ secrets.E2E_CHECKLY_ACCOUNT_NAME }} - CHECKLY_ACCOUNT_ID: ${{ secrets.E2E_CHECKLY_ACCOUNT_ID }} - CHECKLY_API_KEY: ${{ secrets.E2E_CHECKLY_API_KEY }} - CHECKLY_EMPTY_ACCOUNT_ID: ${{ secrets.E2E_EMPTY_CHECKLY_ACCOUNT_ID }} - CHECKLY_EMPTY_API_KEY: ${{ secrets.E2E_EMPTY_CHECKLY_API_KEY }} From aa261514e246bf791f13e1ced0810f9d1bfb19dc Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 15 May 2026 17:31:19 +0200 Subject: [PATCH 7/8] fix(cli): skip fs.realpath on Windows in FixtureSandbox fs.realpath uses GetFinalPathNameByHandle on Windows which fails with EISDIR on virtual filesystems that don't register with the Mount Manager (e.g. ImDisk RAM disks). tmpdir() on Windows is never a symlink, so the resolution is unnecessary there. Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/cli/src/testing/fixture-sandbox.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/cli/src/testing/fixture-sandbox.ts b/packages/cli/src/testing/fixture-sandbox.ts index 6c4a0d812..277776fef 100644 --- a/packages/cli/src/testing/fixture-sandbox.ts +++ b/packages/cli/src/testing/fixture-sandbox.ts @@ -82,10 +82,16 @@ export class FixtureSandbox { const root = maybeRoot ? await fs.mkdir(maybeRoot, { recursive: true }).then(() => maybeRoot) - // tmpdir() on macOS usually returns a path starting with /var which is - // a symlink. Resolve the path so that we don't run into path mismatch - // issues. - : await fs.realpath(await fs.mkdtemp(path.join(tmpdir(), 'fixture-sandbox-'))) + : process.platform === 'win32' + // fs.realpath uses GetFinalPathNameByHandle on Windows, which fails + // with EISDIR on virtual filesystems that don't register with the + // Mount Manager (e.g. ImDisk RAM disks). tmpdir() on Windows is + // never a symlink, so skipping realpath is safe. + ? await fs.mkdtemp(path.join(tmpdir(), 'fixture-sandbox-')) + // tmpdir() on macOS usually returns a path starting with /var which is + // a symlink. Resolve the path so that we don't run into path mismatch + // issues. + : await fs.realpath(await fs.mkdtemp(path.join(tmpdir(), 'fixture-sandbox-'))) debug(`Using root ${root}`) From ca28a0cf962c96b6d7c4c531372e47181116acde Mon Sep 17 00:00:00 2001 From: Daniel Paulus Date: Fri, 15 May 2026 17:37:53 +0200 Subject: [PATCH 8/8] ci: re-trigger; runner workspace + Verdaccio + TEMP all on RAM disk (NTFS) Co-Authored-By: Claude Opus 4.7 (1M context)