mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-01-30 06:12:03 +00:00
Enhanced backend server startup in CI: - Track server PID and process status - Save logs to backend.log for debugging - Better error detection with process monitoring - Added cleanup step to kill server process - Print backend logs on test failure Improves reliability of E2E tests by providing better diagnostics when backend fails to start
179 lines
5.9 KiB
YAML
179 lines
5.9 KiB
YAML
name: E2E Tests
|
|
|
|
on:
|
|
pull_request:
|
|
branches:
|
|
- '*'
|
|
push:
|
|
branches:
|
|
- main
|
|
- master
|
|
|
|
jobs:
|
|
e2e:
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 15
|
|
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Setup project
|
|
uses: ./.github/actions/setup-project
|
|
with:
|
|
check-lockfile: 'true'
|
|
rebuild-node-pty-path: 'apps/server'
|
|
|
|
- name: Install Playwright browsers
|
|
run: npx playwright install --with-deps chromium
|
|
working-directory: apps/ui
|
|
|
|
- name: Build server
|
|
run: npm run build --workspace=apps/server
|
|
|
|
- name: Set up Git user
|
|
run: |
|
|
git config --global user.name "GitHub CI"
|
|
git config --global user.email "ci@example.com"
|
|
|
|
- name: Start backend server
|
|
run: |
|
|
echo "Starting backend server..."
|
|
# Start server in background and save PID
|
|
npm run start --workspace=apps/server > backend.log 2>&1 &
|
|
SERVER_PID=$!
|
|
echo "Server started with PID: $SERVER_PID"
|
|
echo "SERVER_PID=$SERVER_PID" >> $GITHUB_ENV
|
|
|
|
env:
|
|
PORT: 3008
|
|
NODE_ENV: test
|
|
# Use a deterministic API key so Playwright can log in reliably
|
|
AUTOMAKER_API_KEY: test-api-key-for-e2e-tests
|
|
# Reduce log noise in CI
|
|
AUTOMAKER_HIDE_API_KEY: 'true'
|
|
# Avoid real API calls during CI
|
|
AUTOMAKER_MOCK_AGENT: 'true'
|
|
# Simulate containerized environment to skip sandbox confirmation dialogs
|
|
IS_CONTAINERIZED: 'true'
|
|
|
|
- name: Wait for backend server
|
|
run: |
|
|
echo "Waiting for backend server to be ready..."
|
|
|
|
# Check if server process is running
|
|
if [ -z "$SERVER_PID" ]; then
|
|
echo "ERROR: Server PID not found in environment"
|
|
cat backend.log 2>/dev/null || echo "No backend log found"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if process is actually running
|
|
if ! kill -0 $SERVER_PID 2>/dev/null; then
|
|
echo "ERROR: Server process $SERVER_PID is not running!"
|
|
echo "=== Backend logs ==="
|
|
cat backend.log
|
|
echo ""
|
|
echo "=== Recent system logs ==="
|
|
dmesg 2>/dev/null | tail -20 || echo "No dmesg available"
|
|
exit 1
|
|
fi
|
|
|
|
# Wait for health endpoint
|
|
for i in {1..60}; do
|
|
if curl -s -f http://localhost:3008/api/health > /dev/null 2>&1; then
|
|
echo "Backend server is ready!"
|
|
echo "=== Backend logs ==="
|
|
cat backend.log
|
|
echo ""
|
|
echo "Health check response:"
|
|
curl -s http://localhost:3008/api/health | jq . 2>/dev/null || echo "Health check: $(curl -s http://localhost:3008/api/health 2>/dev/null || echo 'No response')"
|
|
exit 0
|
|
fi
|
|
|
|
# Check if server process is still running
|
|
if ! kill -0 $SERVER_PID 2>/dev/null; then
|
|
echo "ERROR: Server process died during wait!"
|
|
echo "=== Backend logs ==="
|
|
cat backend.log
|
|
exit 1
|
|
fi
|
|
|
|
echo "Waiting... ($i/60)"
|
|
sleep 1
|
|
done
|
|
|
|
echo "ERROR: Backend server failed to start within 60 seconds!"
|
|
echo "=== Backend logs ==="
|
|
cat backend.log
|
|
echo ""
|
|
echo "=== Process status ==="
|
|
ps aux | grep -E "(node|tsx)" | grep -v grep || echo "No node processes found"
|
|
echo ""
|
|
echo "=== Port status ==="
|
|
netstat -tlnp 2>/dev/null | grep :3008 || echo "Port 3008 not listening"
|
|
lsof -i :3008 2>/dev/null || echo "lsof not available or port not in use"
|
|
echo ""
|
|
echo "=== Health endpoint test ==="
|
|
curl -v http://localhost:3008/api/health 2>&1 || echo "Health endpoint failed"
|
|
|
|
# Kill the server process if it's still hanging
|
|
if kill -0 $SERVER_PID 2>/dev/null; then
|
|
echo ""
|
|
echo "Killing stuck server process..."
|
|
kill -9 $SERVER_PID 2>/dev/null || true
|
|
fi
|
|
|
|
exit 1
|
|
|
|
- name: Run E2E tests
|
|
# Playwright automatically starts the Vite frontend via webServer config
|
|
# (see apps/ui/playwright.config.ts) - no need to start it manually
|
|
run: npm run test --workspace=apps/ui
|
|
env:
|
|
CI: true
|
|
VITE_SERVER_URL: http://localhost:3008
|
|
VITE_SKIP_SETUP: 'true'
|
|
# Keep UI-side login/defaults consistent
|
|
AUTOMAKER_API_KEY: test-api-key-for-e2e-tests
|
|
|
|
- name: Print backend logs on failure
|
|
if: failure()
|
|
run: |
|
|
echo "=== E2E Tests Failed - Backend Logs ==="
|
|
cat backend.log 2>/dev/null || echo "No backend log found"
|
|
echo ""
|
|
echo "=== Process status at failure ==="
|
|
ps aux | grep -E "(node|tsx)" | grep -v grep || echo "No node processes found"
|
|
echo ""
|
|
echo "=== Port status ==="
|
|
netstat -tlnp 2>/dev/null | grep :3008 || echo "Port 3008 not listening"
|
|
|
|
- name: Upload Playwright report
|
|
uses: actions/upload-artifact@v4
|
|
if: always()
|
|
with:
|
|
name: playwright-report
|
|
path: apps/ui/playwright-report/
|
|
retention-days: 7
|
|
|
|
- name: Upload test results (screenshots, traces, videos)
|
|
uses: actions/upload-artifact@v4
|
|
if: always()
|
|
with:
|
|
name: test-results
|
|
path: |
|
|
apps/ui/test-results/
|
|
retention-days: 7
|
|
if-no-files-found: ignore
|
|
|
|
- name: Cleanup - Kill backend server
|
|
if: always()
|
|
run: |
|
|
if [ -n "$SERVER_PID" ]; then
|
|
echo "Cleaning up backend server (PID: $SERVER_PID)..."
|
|
kill $SERVER_PID 2>/dev/null || true
|
|
kill -9 $SERVER_PID 2>/dev/null || true
|
|
echo "Backend server cleanup complete"
|
|
fi
|