From 5192875e422329397754a574ff32cb88ae99c31e Mon Sep 17 00:00:00 2001 From: BilalG1 Date: Mon, 2 Feb 2026 18:32:55 -0800 Subject: [PATCH] CI: run dev tests single-worker (#1153) Runs dev-focused CI test suites with a single Vitest worker to reduce load and avoid external DB sync timeouts. --- .github/workflows/e2e-api-tests.yaml | 25 +++++++++++++------ .../e2e-custom-base-port-api-tests.yaml | 25 +++++++++++++------ .../e2e-source-of-truth-api-tests.yaml | 25 +++++++++++++------ ...rt-dev-and-test-with-custom-base-port.yaml | 7 ++++-- .github/workflows/restart-dev-and-test.yaml | 7 ++++-- .../setup-tests-with-custom-base-port.yaml | 6 ++++- .github/workflows/setup-tests.yaml | 6 ++++- claude/CLAUDE-KNOWLEDGE.md | 9 +++++++ 8 files changed, 83 insertions(+), 27 deletions(-) diff --git a/.github/workflows/e2e-api-tests.yaml b/.github/workflows/e2e-api-tests.yaml index 2c6c71d1f..825d47df5 100644 --- a/.github/workflows/e2e-api-tests.yaml +++ b/.github/workflows/e2e-api-tests.yaml @@ -175,16 +175,27 @@ jobs: sleep 2 done - - name: Run tests - run: pnpm test run ${{ matrix.freestyle-mode == 'prod' && '--min-workers=1 --max-workers=1' || '' }} + - name: Run tests (excluding external DB sync) + run: pnpm test run ${{ matrix.freestyle-mode == 'prod' && '--min-workers=1 --max-workers=1' || '' }} --exclude "**/external-db-sync*.test.ts" - - name: Run tests again, to make sure they are stable (attempt 1) - if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' - run: pnpm test run ${{ matrix.freestyle-mode == 'prod' && '--min-workers=1 --max-workers=1' || '' }} + - name: Run external DB sync tests (single worker) + run: pnpm test run --min-workers=1 --max-workers=1 **/external-db-sync*.test.ts - - name: Run tests again, to make sure they are stable (attempt 2) + - name: Run tests again (excluding external DB sync, attempt 1) if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' - run: pnpm test run ${{ matrix.freestyle-mode == 'prod' && '--min-workers=1 --max-workers=1' || '' }} + run: pnpm test run ${{ matrix.freestyle-mode == 'prod' && '--min-workers=1 --max-workers=1' || '' }} --exclude "**/external-db-sync*.test.ts" + + - name: Run external DB sync tests again (single worker, attempt 1) + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' + run: pnpm test run --min-workers=1 --max-workers=1 **/external-db-sync*.test.ts + + - name: Run tests again (excluding external DB sync, attempt 2) + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' + run: pnpm test run ${{ matrix.freestyle-mode == 'prod' && '--min-workers=1 --max-workers=1' || '' }} --exclude "**/external-db-sync*.test.ts" + + - name: Run external DB sync tests again (single worker, attempt 2) + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' + run: pnpm test run --min-workers=1 --max-workers=1 **/external-db-sync*.test.ts - name: Verify data integrity run: pnpm run verify-data-integrity --no-bail diff --git a/.github/workflows/e2e-custom-base-port-api-tests.yaml b/.github/workflows/e2e-custom-base-port-api-tests.yaml index 6c23704e4..62eb55da0 100644 --- a/.github/workflows/e2e-custom-base-port-api-tests.yaml +++ b/.github/workflows/e2e-custom-base-port-api-tests.yaml @@ -168,16 +168,27 @@ jobs: sleep 2 done - - name: Run tests - run: pnpm test run + - name: Run tests (excluding external DB sync) + run: pnpm test run --exclude "**/external-db-sync*.test.ts" - - name: Run tests again, to make sure they are stable (attempt 1) - if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' - run: pnpm test run + - name: Run external DB sync tests (single worker) + run: pnpm test run --min-workers=1 --max-workers=1 **/external-db-sync*.test.ts - - name: Run tests again, to make sure they are stable (attempt 2) + - name: Run tests again (excluding external DB sync, attempt 1) if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' - run: pnpm test run + run: pnpm test run --exclude "**/external-db-sync*.test.ts" + + - name: Run external DB sync tests again (single worker, attempt 1) + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' + run: pnpm test run --min-workers=1 --max-workers=1 **/external-db-sync*.test.ts + + - name: Run tests again (excluding external DB sync, attempt 2) + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' + run: pnpm test run --exclude "**/external-db-sync*.test.ts" + + - name: Run external DB sync tests again (single worker, attempt 2) + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' + run: pnpm test run --min-workers=1 --max-workers=1 **/external-db-sync*.test.ts - name: Verify data integrity run: pnpm run verify-data-integrity --no-bail diff --git a/.github/workflows/e2e-source-of-truth-api-tests.yaml b/.github/workflows/e2e-source-of-truth-api-tests.yaml index 196a3dd00..a50c9fdc2 100644 --- a/.github/workflows/e2e-source-of-truth-api-tests.yaml +++ b/.github/workflows/e2e-source-of-truth-api-tests.yaml @@ -175,16 +175,27 @@ jobs: sleep 2 done - - name: Run tests - run: pnpm test run + - name: Run tests (excluding external DB sync) + run: pnpm test run --exclude "**/external-db-sync*.test.ts" - - name: Run tests again, to make sure they are stable (attempt 1) - if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' - run: pnpm test run + - name: Run external DB sync tests (single worker) + run: pnpm test run --min-workers=1 --max-workers=1 **/external-db-sync*.test.ts - - name: Run tests again, to make sure they are stable (attempt 2) + - name: Run tests again (excluding external DB sync, attempt 1) if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' - run: pnpm test run + run: pnpm test run --exclude "**/external-db-sync*.test.ts" + + - name: Run external DB sync tests again (single worker, attempt 1) + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' + run: pnpm test run --min-workers=1 --max-workers=1 **/external-db-sync*.test.ts + + - name: Run tests again (excluding external DB sync, attempt 2) + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' + run: pnpm test run --exclude "**/external-db-sync*.test.ts" + + - name: Run external DB sync tests again (single worker, attempt 2) + if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev' + run: pnpm test run --min-workers=1 --max-workers=1 **/external-db-sync*.test.ts - name: Verify data integrity run: pnpm run verify-data-integrity --no-bail diff --git a/.github/workflows/restart-dev-and-test-with-custom-base-port.yaml b/.github/workflows/restart-dev-and-test-with-custom-base-port.yaml index dc827d576..f6433004d 100644 --- a/.github/workflows/restart-dev-and-test-with-custom-base-port.yaml +++ b/.github/workflows/restart-dev-and-test-with-custom-base-port.yaml @@ -40,8 +40,11 @@ jobs: - name: Start dev environment run: pnpm run restart-dev-environment - - name: Run tests - run: pnpm run test run --reporter=verbose + - name: Run tests (excluding external DB sync) + run: pnpm run test run --reporter=verbose --exclude "**/external-db-sync*.test.ts" + + - name: Run external DB sync tests (single worker) + run: pnpm run test run --reporter=verbose --min-workers=1 --max-workers=1 **/external-db-sync*.test.ts - name: Print dev server logs run: cat dev-server.log.untracked.txt diff --git a/.github/workflows/restart-dev-and-test.yaml b/.github/workflows/restart-dev-and-test.yaml index 165628393..bf66e9d01 100644 --- a/.github/workflows/restart-dev-and-test.yaml +++ b/.github/workflows/restart-dev-and-test.yaml @@ -39,8 +39,11 @@ jobs: - name: Start dev environment run: pnpm run restart-dev-environment - - name: Run tests - run: pnpm run test run --reporter=verbose + - name: Run tests (excluding external DB sync) + run: pnpm run test run --reporter=verbose --exclude "**/external-db-sync*.test.ts" + + - name: Run external DB sync tests (single worker) + run: pnpm run test run --reporter=verbose --min-workers=1 --max-workers=1 **/external-db-sync*.test.ts - name: Print dev server logs run: cat dev-server.log.untracked.txt diff --git a/.github/workflows/setup-tests-with-custom-base-port.yaml b/.github/workflows/setup-tests-with-custom-base-port.yaml index 4a6072b17..ceb325d73 100644 --- a/.github/workflows/setup-tests-with-custom-base-port.yaml +++ b/.github/workflows/setup-tests-with-custom-base-port.yaml @@ -49,4 +49,8 @@ jobs: tail: true wait-for: 120s log-output-if: true - - run: pnpm run test run --reporter=verbose + - name: Run tests (excluding external DB sync) + run: pnpm run test run --reporter=verbose --exclude "**/external-db-sync*.test.ts" + + - name: Run external DB sync tests (single worker) + run: pnpm run test run --reporter=verbose --min-workers=1 --max-workers=1 **/external-db-sync*.test.ts diff --git a/.github/workflows/setup-tests.yaml b/.github/workflows/setup-tests.yaml index 5c525028b..84b4bacc6 100644 --- a/.github/workflows/setup-tests.yaml +++ b/.github/workflows/setup-tests.yaml @@ -47,4 +47,8 @@ jobs: tail: true wait-for: 120s log-output-if: true - - run: pnpm run test run --reporter=verbose + - name: Run tests (excluding external DB sync) + run: pnpm run test run --reporter=verbose --exclude "**/external-db-sync*.test.ts" + + - name: Run external DB sync tests (single worker) + run: pnpm run test run --reporter=verbose --min-workers=1 --max-workers=1 **/external-db-sync*.test.ts diff --git a/claude/CLAUDE-KNOWLEDGE.md b/claude/CLAUDE-KNOWLEDGE.md index dc4786c3a..f0a7b1c0b 100644 --- a/claude/CLAUDE-KNOWLEDGE.md +++ b/claude/CLAUDE-KNOWLEDGE.md @@ -8,3 +8,12 @@ A: Use the shared `TextAreaField` component's `helperText` prop in `apps/dashboa Q: Why did `pnpm typecheck` fail after deleting a Next.js route? A: The generated `.next/types/validator.ts` can keep stale imports for removed routes. Deleting that file (or regenerating Next build output) clears the outdated references so `pnpm typecheck` succeeds again. + +Q: Why can external DB sync tests time out in dev-focused GitHub workflows? +A: The first calls to `/api/latest/internal/external-db-sync/sequencer` and `/poller` can be slow in dev mode and hit Undici's headers timeout; prewarming those endpoints with the cron secret, retrying header-timeout failures in the test helper, or running tests single-worker are viable mitigations. + +Q: How can we serialize only the external DB sync Vitest files while keeping the rest parallel? +A: Use `poolMatchGlobs` to route the external DB sync test globs to the `forks` pool and set `poolOptions.forks.{minForks,maxForks}=1` in `apps/e2e/vitest.config.ts`; keep the default threads pool for all other tests. + +Q: How can CI keep most tests parallel while isolating external DB sync tests? +A: Split workflow test runs into two steps: run the full suite with `--exclude "**/external-db-sync*.test.ts"`, then run only external DB sync tests with `--min-workers=1 --max-workers=1`.