From 98c4a08d64cc5aaa78ed40e42d12ea34905a0523 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Fri, 19 Dec 2025 15:48:35 +0000 Subject: [PATCH] fix(e2e): add debugging and container logging to diagnose CI failures - Separate pretest (start containers) from test (run playwright) steps - Add container log collection step that runs on failure - Add verbose logging to pretest.mjs for better failure diagnosis - Use PULSE_E2E_SKIP_DOCKER and PULSE_E2E_SKIP_PLAYWRIGHT_INSTALL flags --- .github/workflows/test-e2e.yml | 20 +++++++++++++ tests/integration/scripts/pretest.mjs | 41 +++++++++++++++++++++++---- 2 files changed, 56 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml index 00bad61f8..56e64a1d3 100644 --- a/.github/workflows/test-e2e.yml +++ b/.github/workflows/test-e2e.yml @@ -54,12 +54,32 @@ jobs: docker build -t pulse-mock-github:test ./tests/integration/mock-github-server docker build -t pulse:test -f Dockerfile . + - name: Start test containers + working-directory: tests/integration + env: + PULSE_E2E_BOOTSTRAP_TOKEN: 0123456789abcdef0123456789abcdef0123456789abcdef + PULSE_E2E_SKIP_PLAYWRIGHT_INSTALL: "true" + run: node scripts/pretest.mjs + - name: Run E2E suite working-directory: tests/integration env: PULSE_E2E_BOOTSTRAP_TOKEN: 0123456789abcdef0123456789abcdef0123456789abcdef + PULSE_E2E_SKIP_DOCKER: "true" + PULSE_E2E_SKIP_PLAYWRIGHT_INSTALL: "true" run: npm test + - name: Collect container logs + if: always() + working-directory: tests/integration + run: | + echo "=== Docker containers ===" + docker ps -a + echo "=== Pulse test server logs ===" + docker logs pulse-test-server 2>&1 || echo "No pulse-test-server container" + echo "=== Mock GitHub server logs ===" + docker logs pulse-mock-github 2>&1 || echo "No pulse-mock-github container" + - name: Upload Playwright report if: always() uses: actions/upload-artifact@v4 diff --git a/tests/integration/scripts/pretest.mjs b/tests/integration/scripts/pretest.mjs index e6357c3df..221b42b76 100644 --- a/tests/integration/scripts/pretest.mjs +++ b/tests/integration/scripts/pretest.mjs @@ -65,11 +65,42 @@ const composeArgs = ['compose', '-f', 'docker-compose.test.yml', 'up', '-d']; const legacyComposeArgs = ['-f', 'docker-compose.test.yml', 'up', '-d']; const useDockerCompose = !(await canRun('docker', ['compose', 'version'])); -if (useDockerCompose) { - await run('docker-compose', legacyComposeArgs); -} else { - await run('docker', composeArgs); +console.log('[pretest] Starting docker compose...'); +try { + if (useDockerCompose) { + console.log('[pretest] Using legacy docker-compose command'); + await run('docker-compose', legacyComposeArgs); + } else { + console.log('[pretest] Using modern docker compose command'); + await run('docker', composeArgs); + } + console.log('[pretest] Docker compose completed successfully'); +} catch (error) { + console.error('[pretest] Docker compose failed:', error.message); + // Try to get container logs for debugging + try { + await run('docker', ['logs', 'pulse-test-server'], { stdio: 'inherit' }); + } catch { + // ignore + } + process.exit(1); } const baseURL = (process.env.PULSE_BASE_URL || 'http://localhost:7655').replace(/\/+$/, ''); -await waitForHealth(`${baseURL}/api/health`); +console.log(`[pretest] Waiting for health check at ${baseURL}/api/health...`); + +try { + await waitForHealth(`${baseURL}/api/health`); + console.log('[pretest] Health check passed!'); +} catch (error) { + console.error('[pretest] Health check failed:', error.message); + // Try to get container logs for debugging + console.log('[pretest] Attempting to retrieve container logs...'); + try { + console.log('[pretest] === pulse-test-server logs ==='); + await run('docker', ['logs', 'pulse-test-server'], { stdio: 'inherit' }); + } catch { + console.log('[pretest] Could not retrieve pulse-test-server logs'); + } + process.exit(1); +}