232 lines
5.0 KiB
Bash
Executable File
232 lines
5.0 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# Pre-Deployment Validation Script
|
||
# This script MUST pass before deploying to production
|
||
|
||
set -e # Exit on any error
|
||
|
||
echo "🚀 Pre-Deployment Validation Check"
|
||
echo "=================================="
|
||
echo ""
|
||
|
||
# Colors
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Counter
|
||
TESTS_PASSED=0
|
||
TESTS_FAILED=0
|
||
|
||
# Function to print success
|
||
success() {
|
||
echo -e "${GREEN}✓${NC} $1"
|
||
((TESTS_PASSED++))
|
||
}
|
||
|
||
# Function to print error
|
||
error() {
|
||
echo -e "${RED}✗${NC} $1"
|
||
((TESTS_FAILED++))
|
||
}
|
||
|
||
# Function to print warning
|
||
warning() {
|
||
echo -e "${YELLOW}⚠${NC} $1"
|
||
}
|
||
|
||
# Function to print info
|
||
info() {
|
||
echo -e "${BLUE}ℹ${NC} $1"
|
||
}
|
||
|
||
echo "Step 1: Checking Git Status"
|
||
echo "----------------------------"
|
||
|
||
# Check if we're in a git repository
|
||
if ! git rev-parse --git-dir > /dev/null 2>&1; then
|
||
error "Not a git repository"
|
||
exit 1
|
||
else
|
||
success "Git repository detected"
|
||
fi
|
||
|
||
# Check for uncommitted changes
|
||
if [[ -n $(git status -s) ]]; then
|
||
warning "There are uncommitted changes"
|
||
git status -s
|
||
echo ""
|
||
read -p "Continue anyway? (y/N) " -n 1 -r
|
||
echo
|
||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||
exit 1
|
||
fi
|
||
else
|
||
success "No uncommitted changes"
|
||
fi
|
||
|
||
echo ""
|
||
echo "Step 2: Checking Node.js & npm"
|
||
echo "-------------------------------"
|
||
|
||
# Check Node.js version
|
||
if command -v node &> /dev/null; then
|
||
NODE_VERSION=$(node --version)
|
||
success "Node.js ${NODE_VERSION} installed"
|
||
else
|
||
error "Node.js not found"
|
||
exit 1
|
||
fi
|
||
|
||
# Check npm
|
||
if command -v npm &> /dev/null; then
|
||
NPM_VERSION=$(npm --version)
|
||
success "npm ${NPM_VERSION} installed"
|
||
else
|
||
error "npm not found"
|
||
exit 1
|
||
fi
|
||
|
||
echo ""
|
||
echo "Step 3: Installing/Updating Dependencies"
|
||
echo "-----------------------------------------"
|
||
|
||
# Install root dependencies
|
||
if [ -f "package.json" ]; then
|
||
info "Installing root dependencies..."
|
||
if npm install --silent --ignore-scripts; then
|
||
success "Root dependencies installed"
|
||
else
|
||
error "Failed to install root dependencies"
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
# Install API dependencies
|
||
if [ -f "api/package.json" ]; then
|
||
info "Installing API dependencies..."
|
||
cd api
|
||
if npm install --silent --ignore-scripts; then
|
||
success "API dependencies installed"
|
||
else
|
||
error "Failed to install API dependencies"
|
||
exit 1
|
||
fi
|
||
cd ..
|
||
fi
|
||
|
||
echo ""
|
||
echo "Step 4: Running API Tests"
|
||
echo "-------------------------"
|
||
|
||
cd api
|
||
|
||
# Run critical API tests
|
||
info "Running critical endpoint tests..."
|
||
if npm run test:api --silent; then
|
||
success "All API tests passed"
|
||
else
|
||
error "API tests failed"
|
||
echo ""
|
||
echo "Fix the failing tests before deploying!"
|
||
exit 1
|
||
fi
|
||
|
||
cd ..
|
||
|
||
echo ""
|
||
echo "Step 5: Checking API File Structure"
|
||
echo "------------------------------------"
|
||
|
||
# Check critical API endpoints exist
|
||
CRITICAL_ENDPOINTS=(
|
||
"api/track-download-supabase.js"
|
||
"api/discord/interactions.js"
|
||
"api/claude-code-check.js"
|
||
)
|
||
|
||
for endpoint in "${CRITICAL_ENDPOINTS[@]}"; do
|
||
if [ -f "$endpoint" ]; then
|
||
success "$(basename $endpoint) exists"
|
||
else
|
||
error "$(basename $endpoint) NOT FOUND - Critical endpoint missing!"
|
||
exit 1
|
||
fi
|
||
done
|
||
|
||
echo ""
|
||
echo "Step 6: Validating Environment Variables"
|
||
echo "-----------------------------------------"
|
||
|
||
# Check if .env.example exists
|
||
if [ -f ".env.example" ]; then
|
||
success ".env.example file exists"
|
||
|
||
# Extract required variables
|
||
REQUIRED_VARS=$(grep -E "^[A-Z_]+=" .env.example | cut -d'=' -f1 | sort | uniq)
|
||
|
||
info "Required environment variables:"
|
||
echo "$REQUIRED_VARS" | while read var; do
|
||
echo " - $var"
|
||
done
|
||
echo ""
|
||
warning "Make sure these are set in Vercel Dashboard"
|
||
else
|
||
warning ".env.example not found"
|
||
fi
|
||
|
||
echo ""
|
||
echo "Step 7: Vercel Configuration Check"
|
||
echo "-----------------------------------"
|
||
|
||
# Check vercel.json
|
||
if [ -f "vercel.json" ]; then
|
||
success "vercel.json exists"
|
||
|
||
# Validate it's valid JSON
|
||
if jq empty vercel.json 2>/dev/null; then
|
||
success "vercel.json is valid JSON"
|
||
else
|
||
error "vercel.json is invalid JSON"
|
||
exit 1
|
||
fi
|
||
else
|
||
warning "vercel.json not found"
|
||
fi
|
||
|
||
echo ""
|
||
echo "Step 8: Final Checks"
|
||
echo "--------------------"
|
||
|
||
# Check if vercel CLI is installed
|
||
if command -v vercel &> /dev/null; then
|
||
VERCEL_VERSION=$(vercel --version)
|
||
success "Vercel CLI ${VERCEL_VERSION} installed"
|
||
else
|
||
warning "Vercel CLI not installed (install with: npm i -g vercel)"
|
||
fi
|
||
|
||
# Summary
|
||
echo ""
|
||
echo "=================================="
|
||
echo "Pre-Deployment Check Summary"
|
||
echo "=================================="
|
||
echo -e "${GREEN}Passed: ${TESTS_PASSED}${NC}"
|
||
echo -e "${RED}Failed: ${TESTS_FAILED}${NC}"
|
||
echo ""
|
||
|
||
if [ $TESTS_FAILED -eq 0 ]; then
|
||
echo -e "${GREEN}✓ All checks passed! Ready to deploy.${NC}"
|
||
echo ""
|
||
echo "Deploy with:"
|
||
echo " vercel --prod"
|
||
echo ""
|
||
exit 0
|
||
else
|
||
echo -e "${RED}✗ Some checks failed. Fix issues before deploying.${NC}"
|
||
echo ""
|
||
exit 1
|
||
fi
|