Safely upgrade Vercel CLI, Node.js runtime versions, and framework versions (especially Next.js) on Vercel. Covers breaking change detection, vercel.json schema changes, and rollback strategy.
!vercel --version 2>/dev/null || echo 'Vercel CLI not installed'
!node --version 2>/dev/null || echo 'N/A'
!cat package.json 2>/dev/null | jq -r '.dependencies.next // "no next.js"' 2>/dev/null || echo 'N/A'
# Current CLI version
vercel --version
# Current Node.js runtime on Vercel
cat package.json | jq '.engines.node'
# Or check vercel.json
cat vercel.json | jq '.functions'
# Check for available CLI updates
npm outdated -g vercel
# Check framework version
npm ls next react
# Upgrade to latest
npm install -g vercel@latest
# Or specific version
npm install -g vercel@39
# Verify
vercel --version
CLI breaking changes to watch for:
vercel env pull output format changedvercel dev uses new function runtimevercel.json builds property deprecated in favor of framework detection// package.json — specify the Node.js version
{
"engines": {
"node": "20.x"
}
}
Available runtimes on Vercel:
| Runtime | Status | EOL |
|---|---|---|
| Node.js 18.x | Supported | April 2025 |
| Node.js 20.x | Active LTS (recommended) | April 2026 |
| Node.js 22.x | Current | October 2027 |
# Test locally with the target Node version first
nvm use 20
npm test
npm run build
# Use the Next.js upgrade codemod
npx @next/codemod@latest upgrade
# Or manual upgrade
npm install next@latest react@latest react-dom@latest
# Check for breaking changes
npx @next/codemod --dry-run
Key Next.js migration points:
fetch no longer cached by default, cookies() is async, NextRequest.geo removed (use geolocation() from @vercel/functions)rewrites/redirects in next.config.js take precedence over vercel.json
# Create a branch for the upgrade
git checkout -b upgrade/vercel-cli-39
# Make changes and push
git add -A && git commit -m "chore: upgrade vercel CLI and Node.js 20"
git push -u origin upgrade/vercel-cli-39
# Vercel auto-deploys a preview — test it
vercel ls | head -3
curl -s https://my-app-git-upgrade-vercel-cli-39-team.vercel.app/api/health
# Run full test suite against preview
npm test -- --env=preview
# If the upgrade breaks production — instant rollback
vercel rollback
# Pin to a specific CLI version in CI
# .github/workflows/deploy.yml
# - run: npm install -g vercel@38 # pin to known good version
# Revert Node.js runtime
# Change engines.node back in package.json
# Push and redeploy
Deprecated builds property (v2 → current):
// Old (deprecated):
{
"builds": [
{ "src": "api/**/*.ts", "use": "@vercel/node" }
]
}
// New (framework auto-detection):
{
"functions": {
"api/**/*.ts": {
"runtime": "nodejs20.x",
"maxDuration": 30
}
}
}
| Error | Cause | Solution |
|---|---|---|
Build failed after Node upgrade |
Dependency incompatible with new Node | Check npm ls for native modules, rebuild |
Module not found after Next.js upgrade |
Import paths changed | Run npx @next/codemod for automatic fixes |
vercel.json validation error |
Schema changed in new CLI version | Remove deprecated builds, use functions |
FUNCTION_INVOCATION_FAILED |
Runtime API removed in new Node.js | Check Node.js changelog for removed APIs |
| Preview works but prod fails | Env vars differ between environments | Verify production env vars match preview |
For CI/CD integration, see vercel-ci-integration.