From de04405de752c812d17bbec80635bc9a546ded22 Mon Sep 17 00:00:00 2001 From: adilallo <39313955+adilallo@users.noreply.github.com> Date: Sat, 30 Aug 2025 12:03:16 -0600 Subject: [PATCH] Revert "Apply robust server startup pattern to all jobs (visual-regression, performance) with proper cleanup" This reverts commit 8efe237018ae01900e2e76a633ce778246884c16. --- .gitea/workflows/ci.yaml | 192 +++++++++++++++++++++++---------------- 1 file changed, 112 insertions(+), 80 deletions(-) diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 755d0cf..36e2188 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -125,51 +125,74 @@ jobs: - run: npm ci - run: npx playwright install --with-deps - run: npm run build - - - name: Start app (background) + healthcheck + # 1) Sanity check that the build exists + - name: Verify Next build output run: | set -euxo pipefail - # pick a port that's unlikely to be busy - export PORT="${PORT:-3011}" - export HOST="127.0.0.1" + ls -la .next || true + test -f .next/BUILD_ID || (echo "No Next build output (.next) – did build fail?" && exit 1) - # ensure build exists - test -d .next || { echo "❌ Missing .next build output"; exit 1; } - - # start and detach with logs - mkdir -p .next - nohup npm run start -- -p "$PORT" -H "$HOST" > .next/runner.log 2>&1 & - echo $! > .next/runner.pid - echo "🌐 PID $(cat .next/runner.pid) listening on http://$HOST:$PORT" - - # wait for TCP, then HTTP - npx wait-on -t 120000 "tcp:$HOST:$PORT" - curl -fsS "http://$HOST:$PORT" >/dev/null - - echo "βœ… App is responding" - env: - NEXT_TELEMETRY_DISABLED: "1" - NODE_ENV: production - - name: Show last 200 lines of server log on failure - if: failure() + # 2) Start the right kind of server and capture logs + - name: Start app (auto-detect start vs export) run: | - echo "––– .next/runner.log (tail) –––" - tail -n 200 .next/runner.log || true + set -euxo pipefail + # prefer production server if Next build exists + if [ -f .next/BUILD_ID ]; then + # run Next in the foreground for 3s to flush any crash to logs, then background it + (NODE_ENV=production NEXT_TELEMETRY_DISABLED=1 \ + node --trace-uncaught node_modules/next/dist/bin/next start -p 3000 -H 127.0.0.1 \ + ) > server.log 2>&1 & + + # fall back to static export (if your project uses output: 'export') + elif [ -d out ]; then + npx --yes http-server out -p 3000 --silent > server.log 2>&1 & + else + echo "Neither .next nor out/ present – nothing to serve"; cat server.log || true; exit 1 + fi + + echo $! > server.pid + sleep 2 + echo "----- first server log lines -----" + head -n 200 server.log || true + echo "----------------------------------" + + # 3) Fail fast if the process died + - name: Check server process + run: | + set -e + PID=$(cat server.pid) + if ! ps -p "$PID" > /dev/null; then + echo "Server crashed during startup:" + cat server.log || true + exit 1 + fi + + # 4) Wait for readiness with helpful diagnostics + - name: Wait for http://127.0.0.1:3000 + run: | + set -euxo pipefail + for i in $(seq 1 60); do + if curl -sf http://127.0.0.1:3000 >/dev/null; then + echo "App is up βœ…"; exit 0 + fi + if [ $i -eq 1 ] || [ $((i%10)) -eq 0 ]; then + echo "Still waiting… attempt $i" + tail -n 50 server.log || true + fi + sleep 2 + done + echo "Timed out waiting for app"; tail -n +1 server.log || true; exit 1 # Seed snapshots on main branch only (one-time setup) - name: Seed snapshots (main only) - if: gitea.ref == 'refs/heads/main' + if: github.ref == 'refs/heads/main' run: PLAYWRIGHT_UPDATE_SNAPSHOTS=1 npx playwright test tests/e2e/visual-regression.spec.ts --project=chromium - env: - CI: true - BASE_URL: http://127.0.0.1:3011 + env: { CI: true } # Run visual regression tests - name: Run visual regression tests run: npx playwright test tests/e2e/visual-regression.spec.ts - env: - CI: true - BASE_URL: http://127.0.0.1:3011 + env: { CI: true } - name: Package visual artifacts if: always() @@ -183,13 +206,6 @@ jobs: name: visual-regression-results path: visual-regression.tgz retention-days: 30 - - - name: Stop app - if: always() - run: | - if [ -f .next/runner.pid ]; then - kill $(cat .next/runner.pid) 2>/dev/null || true - fi performance: runs-on: [self-hosted, macos-latest] @@ -211,59 +227,75 @@ jobs: - name: Build application run: npm run build - - name: Start app (background) + healthcheck + # 1) Sanity check that the build exists + - name: Verify Next build output run: | set -euxo pipefail - # pick a port that's unlikely to be busy - export PORT="${PORT:-3012}" - export HOST="127.0.0.1" + ls -la .next || true + test -f .next/BUILD_ID || (echo "No Next build output (.next) – did build fail?" && exit 1) - # ensure build exists - test -d .next || { echo "❌ Missing .next build output"; exit 1; } - - # start and detach with logs - mkdir -p .next - nohup npm run start -- -p "$PORT" -H "$HOST" > .next/runner.log 2>&1 & - echo $! > .next/runner.pid - echo "🌐 PID $(cat .next/runner.pid) listening on http://$HOST:$PORT" - - # wait for TCP, then HTTP - npx wait-on -t 120000 "tcp:$HOST:$PORT" - curl -fsS "http://$HOST:$PORT" >/dev/null - - echo "βœ… App is responding" - env: - NEXT_TELEMETRY_DISABLED: "1" - NODE_ENV: production - - name: Show last 200 lines of server log on failure - if: failure() + # 2) Start the right kind of server and capture logs + - name: Start app (auto-detect start vs export) run: | - echo "––– .next/runner.log (tail) –––" - tail -n 200 .next/runner.log || true + set -euxo pipefail + + # prefer production server if Next build exists + if [ -f .next/BUILD_ID ]; then + # run Next in the foreground for 3s to flush any crash to logs, then background it + (NODE_ENV=production NEXT_TELEMETRY_DISABLED=1 \ + node --trace-uncaught node_modules/next/dist/bin/next start -p 3000 -H 127.0.0.1 \ + ) > server.log 2>&1 & + + # fall back to static export (if your project uses output: 'export') + elif [ -d out ]; then + npx --yes http-server out -p 3000 --silent > server.log 2>&1 & + else + echo "Neither .next nor out/ present – nothing to serve"; cat server.log || true; exit 1 + fi + + echo $! > server.pid + sleep 2 + echo "----- first server log lines -----" + head -n 200 server.log || true + echo "----------------------------------" + + # 3) Fail fast if the process died + - name: Check server process + run: | + set -e + PID=$(cat server.pid) + if ! ps -p "$PID" > /dev/null; then + echo "Server crashed during startup:" + cat server.log || true + exit 1 + fi + + # 4) Wait for readiness with helpful diagnostics + - name: Wait for http://127.0.0.1:3000 + run: | + set -euxo pipefail + for i in $(seq 1 60); do + if curl -sf http://127.0.0.1:3000 >/dev/null; then + echo "App is up βœ…"; exit 0 + fi + if [ $i -eq 1 ] || [ $((i%10)) -eq 0 ]; then + echo "Still waiting… attempt $i" + tail -n 50 server.log || true + fi + sleep 2 + done + echo "Timed out waiting for app"; tail -n +1 server.log || true; exit 1 - name: Run Lighthouse CI run: npx lhci autorun --chrome-path="$CHROME_PATH" - env: - LHCI_BUILD_CONTEXT__CURRENT_HASH: ${{ gitea.sha }} - LHCI_BUILD_CONTEXT__COMMIT_TIME: ${{ gitea.event.head_commit.timestamp }} - LHCI_BUILD_CONTEXT__CURRENT_BRANCH: ${{ gitea.ref_name }} - LHCI_BUILD_CONTEXT__COMMIT_MESSAGE: ${{ gitea.event.head_commit.message }} - CI: true + env: { CI: true } - name: Upload LHCI results if: always() uses: actions/upload-artifact@v3 with: name: lhci-results - path: .lighthouseci/ - retention-days: 30 - - - name: Stop app - if: always() - run: | - if [ -f .next/runner.pid ]; then - kill $(cat .next/runner.pid) 2>/dev/null || true - fi + path: lhci-results storybook: runs-on: [self-hosted, macos-latest]