Files
vercel__next.js/scripts/test-stats-benchmark.sh
Jimmy Lai 4cd3ca26d7 perf: improve stats action reliability and reduce CI noise (#87945)
## Summary

Comprehensive improvements to the PR stats action for more reliable benchmarks and reduced CI noise.

### Vercel KV Integration
- Add `@vercel/kv` for historical data persistence
- Track metrics over time with `loadHistory()` / `saveToHistory()`
- Display trend sparklines in comments when history is available

### Comment Generation Refactor
- New `METRIC_LABELS` and `METRIC_GROUPS` configuration system
- Organized metrics by category (Dev Server, Production Builds, Production Runtime)
- Better formatting utilities (`prettifyTime`, `formatChange`, `generateTrendBar`)
- Bundle group totals for KV persistence

### Noise Reduction
- Significance thresholds: `50ms AND 10%` for time, `1KB AND 1%` for size
- Additional `<2%` filter for long-running operations (builds)
- Filters typical CI variance while catching real regressions

### Stats Config Updates
- Add `measureDevBoot: true` to enable dev boot benchmarks
- Fix `appDevCommand` to include `dev` subcommand
- Add `--webpack` flag to `appBuildCommand`
- Rename "Client Bundles (main, webpack)" to "Client Bundles (main)"
- Add `turbopack: {}` to test configs

### GitHub Actions Updates
- New `action.yml` with bundler input parameter
- Workflow improvements in `pull_request_stats.yml`

### New Files
- `scripts/test-stats-benchmark.sh` - Local testing script
- `.github/actions/next-stats-action/src/util/stats.js` - Shared stats utilities
- `.github/actions/next-stats-action/test-local.js` - Local comment testing

## Test Plan
```bash
cd .github/actions/next-stats-action
node test-local.js              # Basic test
node test-local.js --with-history  # Test with trend sparklines
```
2026-01-06 12:36:41 +01:00

114 lines
2.8 KiB
Bash
Executable File

#!/bin/bash
# Quick sanity check for stats benchmark config
# Tests that the dev server can start with the new config
set -e
REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
cd "$REPO_ROOT"
echo "=== Stats Benchmark Config Test ==="
# Check Next.js is built
if [ ! -d "packages/next/dist" ]; then
echo "ERROR: Next.js not built. Run 'pnpm build' first."
exit 1
fi
# Create temp test app
WORK_DIR=$(mktemp -d)
trap "rm -rf $WORK_DIR" EXIT
echo "Setting up test app in $WORK_DIR..."
cp -r test/.stats-app/* "$WORK_DIR/"
cd "$WORK_DIR"
# Write the config that stats-config.js would write (with turbopack: {})
cat > next.config.js << 'EOF'
module.exports = {
generateBuildId: () => 'BUILD_ID',
turbopack: {},
}
EOF
echo "Config:"
cat next.config.js
echo ""
# Link local Next.js
node -e "
const fs = require('fs');
const pkg = JSON.parse(fs.readFileSync('package.json'));
pkg.dependencies.next = 'file:$REPO_ROOT/packages/next';
fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2));
"
echo "Installing dependencies..."
pnpm install --ignore-scripts 2>/dev/null
# Test Turbopack dev (the failing scenario)
echo ""
echo "=== Test 1: Turbopack dev (default, no flag) ==="
PORT=$(python3 -c "import socket; s=socket.socket(); s.bind(('',0)); print(s.getsockname()[1]); s.close()")
rm -rf .next
NEXT_TELEMETRY_DISABLED=1 timeout 30 pnpm next dev --port $PORT > /tmp/turbo.log 2>&1 &
PID=$!
sleep 12
if kill -0 $PID 2>/dev/null; then
echo "OK: Turbopack dev server is running"
kill $PID 2>/dev/null || true
wait $PID 2>/dev/null || true
else
wait $PID 2>/dev/null || CODE=$?
if [ "$CODE" = "1" ]; then
echo "FAIL: Turbopack dev crashed (exit 1)"
echo "Output:"
cat /tmp/turbo.log
exit 1
fi
echo "OK: Process exited (timeout or normal)"
fi
# Test Webpack dev
echo ""
echo "=== Test 2: Webpack dev (--webpack flag) ==="
PORT=$(python3 -c "import socket; s=socket.socket(); s.bind(('',0)); print(s.getsockname()[1]); s.close()")
rm -rf .next
NEXT_TELEMETRY_DISABLED=1 timeout 30 pnpm next dev --webpack --port $PORT > /tmp/webpack.log 2>&1 &
PID=$!
sleep 12
if kill -0 $PID 2>/dev/null; then
echo "OK: Webpack dev server is running"
kill $PID 2>/dev/null || true
wait $PID 2>/dev/null || true
else
echo "OK: Process exited (timeout or normal)"
fi
# Test Turbopack build
echo ""
echo "=== Test 3: Turbopack build ==="
rm -rf .next
if NEXT_TELEMETRY_DISABLED=1 pnpm next build 2>&1 | head -20; then
echo "OK: Turbopack build completed"
else
echo "FAIL: Turbopack build failed"
exit 1
fi
# Test Webpack build
echo ""
echo "=== Test 4: Webpack build (--webpack flag) ==="
rm -rf .next
if NEXT_TELEMETRY_DISABLED=1 pnpm next build --webpack 2>&1 | head -20; then
echo "OK: Webpack build completed"
else
echo "FAIL: Webpack build failed"
exit 1
fi
echo ""
echo "=== All tests passed ==="