Recently, I contributed to react.dev repo and noticed how their CI/CD pipeline was structured. Clean, automated, and resilient. It made me think: what are the essentials every React/Next.js project should have in its pipeline?
Let’s explore the best practices 🚀.
🎯 The problem with "Basic pipelines"
Many teams set up basic commands
- Install dependencies
- Build project
- Deploy
Sounds fine right? You are missing many critical points.
- Bundle size related issues
- Broken builds
- Inconsistent environments
- Slow feedbacks
The list doesn't end here.
The point is: a fragile pipeline leads to fragile releases.
🧬 Essential Steps in a Pipeline
A solid React/Next.js pipeline should go beyond just install, lint, test, build.
Here’s an extended GitHub Actions workflow you can adapt to your projects:
name: CI
on:
push:
branches: [ main ]
pull_request:
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
# Checkout the repo
- uses: actions/checkout@v3
# Setup Node.js
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
# Clean install dependencies
- run: npm ci
# Lint checks (fail fast)
- run: npm run lint
# Type checking with TypeScript
- run: npm run type-check
# Unit tests with coverage
- run: npm run test -- --ci --coverage
# End-to-End tests (optional: Cypress/Playwright)
- run: npm run e2e
# Build the Next.js app
- run: npm run build
# Run Next.js static analysis
- run: npm run analyze
# Check bundle size (with e.g. size-limit)
- run: npm run size
# Lint commit messages (Conventional Commits)
- run: npx commitlint --from=HEAD~1 --to=HEAD
# Upload build artifacts (optional)
- uses: actions/upload-artifact@v4
with:
name: next-build
path: .next
👏 Best Practices
- Use npm ci over npm install → reproducible, clean installs.
- Linting as a first step → fail fast on code style issues.
- Unit + integration tests with coverage → reliability guaranteed prior to merging.
- Preview deployments (e.g., Vercel, Netlify) → every PR receives a live environment.
- Cache dependencies between runs → faster pipelines.
- Secrets management → use environment variables safely (no .env leaks!).
- Bundle analysis → track performance are monitored in PRs.
🙋 Bonus Steps Worth Adding
- Type checking (tsc --noEmit) → prevents runtime bugs.
- Playwright / Cypress e2e tests → simulate real user flows.
- Accessibility checks (axe-core, Lighthouse CI) → catch issues early.
- Storybook build → visual regression testing for UI components..
👋 Conclusion
A bad or poor CI/CD is no more tolerated. Is a powerful tool to leverage the development process.
A solid pipeline should be your safety net
Good pipelines include:
- Fast feedback
- Error prevention
- Consistent environments
- Bundle monitoring Of course, pipelines evolve daily, but that's not an excuse to ignore. 👉 The goal isn't perfection, is continuous improvement.
👏 Thank you for reading.
This is my first article.
If you found this useful let me know and share it.
See you around!
Top comments (0)