Files
metabuilder/tools/diagnose-workflows.sh
2025-12-25 16:00:00 +00:00

301 lines
9.4 KiB
Bash

#!/bin/bash
# Quick workflow issue diagnosis script
# Identifies common problems without running act
set -e
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
NC='\033[0m' # No Color
echo -e "${MAGENTA}╔═══════════════════════════════════════════╗${NC}"
echo -e "${MAGENTA}║ GitHub Actions Issue Diagnostic Report ║${NC}"
echo -e "${MAGENTA}╚═══════════════════════════════════════════╝${NC}"
echo ""
issues_found=0
warnings_found=0
# Function to report an issue
report_issue() {
echo -e "${RED}✗ ISSUE: $1${NC}"
if [ -n "$2" ]; then
echo -e " ${YELLOW}Fix: $2${NC}"
fi
echo ""
((issues_found++))
}
# Function to report a warning
report_warning() {
echo -e "${YELLOW}⚠ WARNING: $1${NC}"
if [ -n "$2" ]; then
echo -e " Info: $2"
fi
echo ""
((warnings_found++))
}
# Function to report success
report_success() {
echo -e "${GREEN}$1${NC}"
}
echo -e "${BLUE}Checking project structure...${NC}"
echo ""
# Check package.json
if [ ! -f "package.json" ]; then
report_issue "package.json not found" "Create package.json with npm init"
else
report_success "package.json exists"
# Check scripts
if ! grep -q '"lint"' package.json; then
report_issue "lint script missing in package.json" "Add: \"lint\": \"eslint . --ext ts,tsx\""
else
report_success "lint script found"
fi
if ! grep -q '"build"' package.json; then
report_issue "build script missing in package.json" "Add: \"build\": \"vite build\""
else
report_success "build script found"
fi
if ! grep -q '"test:e2e"' package.json; then
report_issue "test:e2e script missing in package.json" "Add: \"test:e2e\": \"playwright test\""
else
report_success "test:e2e script found"
fi
echo ""
# Check dependencies
if ! grep -q '"@prisma/client"' package.json; then
report_issue "@prisma/client missing from dependencies" "Run: npm install @prisma/client"
else
report_success "@prisma/client dependency found"
fi
if ! grep -q '"prisma"' package.json; then
report_issue "prisma missing from dependencies" "Run: npm install -D prisma"
else
report_success "prisma dependency found"
fi
if ! grep -q '"@playwright/test"' package.json; then
report_issue "@playwright/test missing from dependencies" "Run: npm install -D @playwright/test"
else
report_success "@playwright/test dependency found"
fi
fi
echo ""
echo -e "${BLUE}Checking Prisma setup...${NC}"
echo ""
if [ ! -d "prisma" ]; then
report_issue "prisma directory not found" "Run: npx prisma init"
else
report_success "prisma directory exists"
if [ ! -f "prisma/schema.prisma" ]; then
report_issue "prisma/schema.prisma not found" "Run: npx prisma init"
else
report_success "prisma/schema.prisma exists"
# Check if schema has models
if ! grep -q "model" prisma/schema.prisma; then
report_warning "No models defined in schema.prisma" "Add your data models"
else
report_success "Models found in schema"
fi
fi
if [ -d "prisma/migrations" ]; then
report_success "Migrations directory exists"
migration_count=$(ls -1 prisma/migrations | wc -l)
echo -e " ${GREEN}Found $migration_count migration(s)${NC}"
else
report_warning "No migrations directory" "Run: npx prisma migrate dev --name init"
fi
fi
echo ""
echo -e "${BLUE}Checking Playwright setup...${NC}"
echo ""
if [ ! -f "playwright.config.ts" ]; then
report_issue "playwright.config.ts not found" "Run: npm init playwright@latest"
else
report_success "playwright.config.ts exists"
fi
if [ -d "e2e" ]; then
report_success "e2e directory exists"
test_count=$(find e2e -name "*.spec.ts" -o -name "*.test.ts" | wc -l)
if [ "$test_count" -eq 0 ]; then
report_warning "No test files found in e2e directory" "Create test files: e2e/example.spec.ts"
else
echo -e " ${GREEN}Found $test_count test file(s)${NC}"
fi
else
report_warning "e2e directory not found" "Create e2e tests directory"
fi
echo ""
echo -e "${BLUE}Checking node_modules...${NC}"
echo ""
if [ ! -d "node_modules" ]; then
report_warning "node_modules directory not found" "Run: npm install"
else
report_success "node_modules exists"
# Check specific critical packages
if [ ! -d "node_modules/@prisma/client" ]; then
report_issue "@prisma/client not installed" "Run: npm install"
fi
if [ ! -d "node_modules/prisma" ]; then
report_issue "prisma not installed" "Run: npm install"
fi
if [ ! -d "node_modules/@playwright/test" ]; then
report_issue "@playwright/test not installed" "Run: npm install"
fi
fi
echo ""
echo -e "${BLUE}Checking GitHub workflows...${NC}"
echo ""
if [ ! -d ".github/workflows" ]; then
report_issue ".github/workflows directory not found" "Workflows not set up"
else
report_success ".github/workflows directory exists"
workflow_count=$(ls -1 .github/workflows/*.yml 2>/dev/null | wc -l)
echo -e " ${GREEN}Found $workflow_count workflow file(s)${NC}"
# Check specific workflows
if [ -f ".github/workflows/ci.yml" ]; then
report_success "CI workflow exists"
# Analyze CI workflow for issues
if grep -q "prisma generate" .github/workflows/ci.yml; then
if ! grep -q "DATABASE_URL" .github/workflows/ci.yml; then
report_warning "prisma generate without DATABASE_URL in CI" "May cause issues"
fi
fi
if grep -q "npm ci" .github/workflows/ci.yml; then
report_success "Using npm ci (good practice)"
elif grep -q "npm install" .github/workflows/ci.yml; then
report_warning "Using npm install instead of npm ci" "Consider using npm ci for CI"
fi
else
report_warning "ci.yml not found" "No CI workflow configured"
fi
fi
echo ""
echo -e "${BLUE}Checking package-lock.json...${NC}"
echo ""
if [ ! -f "package-lock.json" ]; then
report_warning "package-lock.json not found" "Run: npm install to generate it"
else
report_success "package-lock.json exists"
# Check if package-lock is newer than package.json
if [ package.json -nt package-lock.json ]; then
report_warning "package.json is newer than package-lock.json" "Run: npm install to update lockfile"
fi
fi
echo ""
echo -e "${BLUE}Checking TypeScript setup...${NC}"
echo ""
if [ ! -f "tsconfig.json" ]; then
report_warning "tsconfig.json not found" "TypeScript may not be configured"
else
report_success "tsconfig.json exists"
fi
echo ""
echo -e "${BLUE}Checking environment files...${NC}"
echo ""
if [ -f ".env" ]; then
report_success ".env file exists"
if ! grep -q "DATABASE_URL" .env; then
report_warning "DATABASE_URL not found in .env" "Prisma may need this"
fi
else
if [ -f ".env.example" ]; then
report_warning ".env file missing but .env.example exists" "Copy .env.example to .env"
else
report_warning ".env file not found" "May be needed for local development"
fi
fi
echo ""
echo -e "${BLUE}Checking .gitignore...${NC}"
echo ""
if [ ! -f ".gitignore" ]; then
report_warning ".gitignore not found" "Create one to avoid committing sensitive files"
else
report_success ".gitignore exists"
critical_ignores=("node_modules" ".env" "dist")
for ignore in "${critical_ignores[@]}"; do
if ! grep -q "^$ignore" .gitignore; then
report_warning "$ignore not in .gitignore" "Add to prevent committing"
fi
done
fi
echo ""
echo -e "${MAGENTA}═══════════════════════════════════════════${NC}"
echo -e "${MAGENTA}Summary${NC}"
echo -e "${MAGENTA}═══════════════════════════════════════════${NC}"
echo ""
if [ $issues_found -eq 0 ] && [ $warnings_found -eq 0 ]; then
echo -e "${GREEN}✓ No issues found! Your project looks good.${NC}"
echo ""
echo -e "${BLUE}Next steps:${NC}"
echo " 1. Install act: https://github.com/nektos/act"
echo " 2. Run: ./scripts/test-workflows.sh"
echo " 3. Or directly: act push"
elif [ $issues_found -eq 0 ]; then
echo -e "${YELLOW}Found $warnings_found warning(s) but no critical issues.${NC}"
echo -e "${GREEN}Your workflows should run, but consider addressing warnings.${NC}"
else
echo -e "${RED}Found $issues_found issue(s) and $warnings_found warning(s).${NC}"
echo ""
echo -e "${YELLOW}Please fix the issues above before running workflows.${NC}"
echo ""
echo -e "${BLUE}Common fixes:${NC}"
echo " 1. npm install # Install dependencies"
echo " 2. npx prisma init # Initialize Prisma"
echo " 3. npm init playwright@latest # Initialize Playwright"
echo " 4. npm install @prisma/client # Install Prisma client"
echo ""
fi
echo -e "${BLUE}For detailed workflow testing, run:${NC}"
echo " ./scripts/test-workflows.sh"
echo ""
exit $issues_found