Files
michaelschiemer/deployment/Makefile
Michael Schiemer 9b74ade5b0 feat: Fix discovery system critical issues
Resolved multiple critical discovery system issues:

## Discovery System Fixes
- Fixed console commands not being discovered on first run
- Implemented fallback discovery for empty caches
- Added context-aware caching with separate cache keys
- Fixed object serialization preventing __PHP_Incomplete_Class

## Cache System Improvements
- Smart caching that only caches meaningful results
- Separate caches for different execution contexts (console, web, test)
- Proper array serialization/deserialization for cache compatibility
- Cache hit logging for debugging and monitoring

## Object Serialization Fixes
- Fixed DiscoveredAttribute serialization with proper string conversion
- Sanitized additional data to prevent object reference issues
- Added fallback for corrupted cache entries

## Performance & Reliability
- All 69 console commands properly discovered and cached
- 534 total discovery items successfully cached and restored
- No more __PHP_Incomplete_Class cache corruption
- Improved error handling and graceful fallbacks

## Testing & Quality
- Fixed code style issues across discovery components
- Enhanced logging for better debugging capabilities
- Improved cache validation and error recovery

Ready for production deployment with stable discovery system.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-13 12:04:17 +02:00

352 lines
14 KiB
Makefile

# Custom PHP Framework Deployment Makefile
# Domain: michaelschiemer.de | Email: kontakt@michaelschiemer.de | PHP: 8.4
# Default environment
ENV ?= staging
# Colors for output
RED = \033[0;31m
GREEN = \033[0;32m
YELLOW = \033[1;33m
BLUE = \033[0;34m
PURPLE = \033[0;35m
CYAN = \033[0;36m
WHITE = \033[1;37m
NC = \033[0m
# Directories
DEPLOYMENT_DIR = $(CURDIR)
PROJECT_ROOT = $(CURDIR)/..
INFRASTRUCTURE_DIR = $(DEPLOYMENT_DIR)/infrastructure
APPLICATIONS_DIR = $(DEPLOYMENT_DIR)/applications
.PHONY: help deploy deploy-dry deploy-infrastructure deploy-application
##@ Deployment Commands
help: ## Display this help message
@echo "$(WHITE)Custom PHP Framework Deployment System$(NC)"
@echo "$(CYAN)Domain: michaelschiemer.de | Email: kontakt@michaelschiemer.de | PHP: 8.4$(NC)"
@echo ""
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make $(CYAN)<target>$(NC) [ENV=<environment>]\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " $(CYAN)%-20s$(NC) %s\n", $$1, $$2 } /^##@/ { printf "\n$(WHITE)%s$(NC)\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
@echo ""
@echo "$(WHITE)Examples:$(NC)"
@echo " $(CYAN)make deploy ENV=staging$(NC) # Deploy to staging"
@echo " $(CYAN)make deploy-production$(NC) # Deploy to production"
@echo " $(CYAN)make deploy-dry ENV=production$(NC) # Dry run for production"
@echo " $(CYAN)make infrastructure ENV=staging$(NC) # Deploy only infrastructure"
@echo " $(CYAN)make application ENV=production$(NC) # Deploy only application"
@echo ""
deploy: ## Deploy full stack to specified environment (default: staging)
@echo "$(GREEN)🚀 Deploying full stack to $(ENV) environment$(NC)"
@./deploy.sh $(ENV)
deploy-dry: ## Perform dry run deployment to specified environment
@echo "$(BLUE)🧪 Performing dry run deployment to $(ENV) environment$(NC)"
@./deploy.sh $(ENV) --dry-run --verbose
deploy-force: ## Force deploy (skip validations) to specified environment
@echo "$(YELLOW)⚠️ Force deploying to $(ENV) environment$(NC)"
@./deploy.sh $(ENV) --force
deploy-quick: ## Quick deploy (skip tests and backup) to specified environment
@echo "$(YELLOW)⚡ Quick deploying to $(ENV) environment$(NC)"
@./deploy.sh $(ENV) --skip-tests --skip-backup
##@ Environment-Specific Shortcuts
deploy-development: ## Deploy to development environment
@echo "$(GREEN)🔧 Deploying to development environment$(NC)"
@./deploy.sh development --non-interactive
deploy-staging: ## Deploy to staging environment
@echo "$(GREEN)🧪 Deploying to staging environment$(NC)"
@./deploy.sh staging
deploy-production: ## Deploy to production environment (with confirmations)
@echo "$(RED)🌟 Deploying to production environment$(NC)"
@./deploy.sh production
##@ Partial Deployment Commands
infrastructure: ## Deploy only infrastructure (Ansible) to specified environment
@echo "$(PURPLE)🏗️ Deploying infrastructure to $(ENV) environment$(NC)"
@./deploy.sh $(ENV) --infrastructure-only
application: ## Deploy only application (Docker Compose) to specified environment
@echo "$(CYAN)📦 Deploying application to $(ENV) environment$(NC)"
@./deploy.sh $(ENV) --application-only
infrastructure-dry: ## Dry run infrastructure deployment
@echo "$(BLUE)🧪 Dry run infrastructure deployment to $(ENV) environment$(NC)"
@./deploy.sh $(ENV) --infrastructure-only --dry-run
application-dry: ## Dry run application deployment
@echo "$(BLUE)🧪 Dry run application deployment to $(ENV) environment$(NC)"
@./deploy.sh $(ENV) --application-only --dry-run
##@ Setup and Maintenance Commands
setup: ## First-time setup for deployment environment
@echo "$(GREEN)🔧 Setting up deployment environment$(NC)"
@./setup.sh
check-prerequisites: ## Check deployment prerequisites
@echo "$(BLUE)🔍 Checking deployment prerequisites$(NC)"
@./deploy.sh $(ENV) --dry-run --infrastructure-only --application-only 2>/dev/null || echo "$(YELLOW)Run 'make setup' to install missing dependencies$(NC)"
validate-config: ## Validate configuration files for specified environment
@echo "$(BLUE)✅ Validating configuration for $(ENV) environment$(NC)"
@if [ -f "$(APPLICATIONS_DIR)/environments/.env.$(ENV)" ]; then \
echo "$(GREEN)✓ Application environment file found$(NC)"; \
grep -q "*** REQUIRED" "$(APPLICATIONS_DIR)/environments/.env.$(ENV)" && \
echo "$(RED)❌ Found unfilled template values$(NC)" && \
grep "*** REQUIRED" "$(APPLICATIONS_DIR)/environments/.env.$(ENV)" || \
echo "$(GREEN)✓ No template placeholders found$(NC)"; \
else \
echo "$(RED)❌ Application environment file not found$(NC)"; \
echo "$(YELLOW)Copy from template: cp $(APPLICATIONS_DIR)/environments/.env.$(ENV).template $(APPLICATIONS_DIR)/environments/.env.$(ENV)$(NC)"; \
fi
@if [ -f "$(INFRASTRUCTURE_DIR)/inventories/$(ENV)/hosts.yml" ]; then \
echo "$(GREEN)✓ Ansible inventory found$(NC)"; \
else \
echo "$(YELLOW)⚠️ Ansible inventory not found (infrastructure deployment will be skipped)$(NC)"; \
fi
##@ Health and Status Commands
status: ## Show deployment status for specified environment
@echo "$(BLUE)📊 Checking deployment status for $(ENV) environment$(NC)"
@$(MAKE) validate-config ENV=$(ENV)
@if [ -f "$(APPLICATIONS_DIR)/scripts/health-check.sh" ]; then \
echo "$(BLUE)Running health checks...$(NC)"; \
$(APPLICATIONS_DIR)/scripts/health-check.sh $(ENV) 2>/dev/null || echo "$(YELLOW)Health checks failed or services not running$(NC)"; \
else \
echo "$(YELLOW)Health check script not found$(NC)"; \
fi
health: ## Run health checks for specified environment
@echo "$(GREEN)🏥 Running health checks for $(ENV) environment$(NC)"
@if [ -f "$(APPLICATIONS_DIR)/scripts/health-check.sh" ]; then \
$(APPLICATIONS_DIR)/scripts/health-check.sh $(ENV); \
else \
echo "$(RED)❌ Health check script not found$(NC)"; \
fi
##@ Log Management
logs: ## Show logs for all services (ENV=staging SERVICE=all FOLLOW=no)
@./deploy-cli.sh logs $(ENV)
logs-follow: ## Follow logs for all services in real-time
@./deploy-cli.sh logs $(ENV) "" --follow
logs-php: ## Show PHP service logs
@./deploy-cli.sh logs $(ENV) php
logs-php-follow: ## Follow PHP service logs in real-time
@./deploy-cli.sh logs $(ENV) php --follow
logs-nginx: ## Show Nginx service logs
@./deploy-cli.sh logs $(ENV) web
logs-nginx-follow: ## Follow Nginx service logs in real-time
@./deploy-cli.sh logs $(ENV) web --follow
logs-db: ## Show database service logs
@./deploy-cli.sh logs $(ENV) db
logs-db-follow: ## Follow database service logs in real-time
@./deploy-cli.sh logs $(ENV) db --follow
logs-redis: ## Show Redis service logs
@./deploy-cli.sh logs $(ENV) redis
logs-redis-follow: ## Follow Redis service logs in real-time
@./deploy-cli.sh logs $(ENV) redis --follow
logs-worker: ## Show queue worker service logs
@./deploy-cli.sh logs $(ENV) queue-worker
logs-worker-follow: ## Follow queue worker service logs in real-time
@./deploy-cli.sh logs $(ENV) queue-worker --follow
# Production shortcuts
logs-prod: ## Show production logs (all services)
@./deploy-cli.sh logs production
logs-prod-php: ## Show production PHP logs
@./deploy-cli.sh logs production php
logs-prod-nginx: ## Show production Nginx logs
@./deploy-cli.sh logs production web
logs-prod-follow: ## Follow production logs (PHP service)
@./deploy-cli.sh logs production php --follow
##@ Development and Testing Commands
test: ## Run deployment tests
@echo "$(GREEN)🧪 Running deployment tests$(NC)"
@cd $(PROJECT_ROOT) && [ -f vendor/bin/pest ] && vendor/bin/pest || echo "$(YELLOW)No test framework found$(NC)"
test-infrastructure: ## Test Ansible playbook syntax
@echo "$(BLUE)🔍 Testing Ansible playbook syntax$(NC)"
@if [ -f "$(INFRASTRUCTURE_DIR)/inventories/$(ENV)/hosts.yml" ]; then \
cd $(INFRASTRUCTURE_DIR) && ansible-playbook \
-i inventories/$(ENV)/hosts.yml \
site.yml \
--syntax-check; \
else \
echo "$(RED)❌ Ansible inventory not found for $(ENV)$(NC)"; \
fi
build-assets: ## Build frontend assets
@echo "$(CYAN)🎨 Building frontend assets$(NC)"
@cd $(PROJECT_ROOT) && [ -f package.json ] && npm ci && npm run build || echo "$(YELLOW)No package.json found$(NC)"
##@ Configuration Management Commands
init-config: ## Initialize configuration files from templates
@echo "$(GREEN)📝 Initializing configuration files$(NC)"
@for env in development staging production; do \
if [ ! -f "$(APPLICATIONS_DIR)/environments/.env.$$env" ] && [ -f "$(APPLICATIONS_DIR)/environments/.env.$$env.template" ]; then \
echo "$(YELLOW)Creating .env.$$env from template$(NC)"; \
cp "$(APPLICATIONS_DIR)/environments/.env.$$env.template" "$(APPLICATIONS_DIR)/environments/.env.$$env"; \
else \
echo "$(BLUE).env.$$env already exists or template not found$(NC)"; \
fi; \
done
edit-config: ## Edit configuration file for specified environment
@echo "$(CYAN)📝 Editing configuration for $(ENV) environment$(NC)"
@if [ -f "$(APPLICATIONS_DIR)/environments/.env.$(ENV)" ]; then \
${EDITOR:-nano} "$(APPLICATIONS_DIR)/environments/.env.$(ENV)"; \
else \
echo "$(RED)❌ Configuration file not found: .env.$(ENV)$(NC)"; \
echo "$(YELLOW)Run 'make init-config' first$(NC)"; \
fi
show-config: ## Display configuration for specified environment (safe values only)
@echo "$(BLUE)📋 Configuration for $(ENV) environment$(NC)"
@if [ -f "$(APPLICATIONS_DIR)/environments/.env.$(ENV)" ]; then \
echo "$(CYAN)Safe configuration values:$(NC)"; \
grep -E '^(APP_|DB_HOST|DB_PORT|DB_NAME|DOMAIN)' "$(APPLICATIONS_DIR)/environments/.env.$(ENV)" | grep -v -E '(PASSWORD|SECRET|KEY)' || true; \
echo "$(YELLOW)Sensitive values hidden for security$(NC)"; \
else \
echo "$(RED)❌ Configuration file not found$(NC)"; \
fi
##@ Backup and Recovery Commands
backup: ## Create backup before deployment
@echo "$(GREEN)💾 Creating backup for $(ENV) environment$(NC)"
@mkdir -p $(PROJECT_ROOT)/storage/backups
@cd $(PROJECT_ROOT) && docker-compose \
-f docker-compose.yml \
-f $(APPLICATIONS_DIR)/docker-compose.$(ENV).yml \
--env-file $(APPLICATIONS_DIR)/environments/.env.$(ENV) \
exec -T db sh -c 'mariadb-dump -u root -p$$DB_ROOT_PASSWORD --all-databases' \
> $(PROJECT_ROOT)/storage/backups/backup_$(ENV)_$(shell date +%Y%m%d_%H%M%S).sql
@echo "$(GREEN)✓ Backup created$(NC)"
restore: ## Restore from latest backup (use with caution!)
@echo "$(RED)⚠️ RESTORING FROM BACKUP - THIS WILL OVERWRITE CURRENT DATA$(NC)"
@read -p "Are you sure? Type 'RESTORE' to confirm: " confirm && [ "$$confirm" = "RESTORE" ] || (echo "Cancelled" && exit 1)
@latest_backup=$$(ls -t $(PROJECT_ROOT)/storage/backups/backup_$(ENV)_*.sql 2>/dev/null | head -n1); \
if [ -n "$$latest_backup" ]; then \
echo "$(YELLOW)Restoring from: $$latest_backup$(NC)"; \
cd $(PROJECT_ROOT) && docker-compose \
-f docker-compose.yml \
-f $(APPLICATIONS_DIR)/docker-compose.$(ENV).yml \
--env-file $(APPLICATIONS_DIR)/environments/.env.$(ENV) \
exec -T db sh -c 'mysql -u root -p$$DB_ROOT_PASSWORD' < "$$latest_backup"; \
echo "$(GREEN)✓ Database restored$(NC)"; \
else \
echo "$(RED)❌ No backup files found for $(ENV)$(NC)"; \
fi
##@ Utility Commands
clean: ## Clean up deployment artifacts and logs
@echo "$(YELLOW)🧹 Cleaning deployment artifacts$(NC)"
@rm -rf $(INFRASTRUCTURE_DIR)/logs/*
@docker system prune -f
@echo "$(GREEN)✓ Cleanup completed$(NC)"
version: ## Show version information
@echo "$(WHITE)Custom PHP Framework Deployment System$(NC)"
@echo "Version: 1.0.0"
@echo "Domain: michaelschiemer.de"
@echo "Email: kontakt@michaelschiemer.de"
@echo "PHP Version: 8.4"
info: ## Show deployment information and available environments
@echo "$(WHITE)📋 Deployment Information$(NC)"
@echo ""
@echo "$(CYAN)Project Details:$(NC)"
@echo " Domain: michaelschiemer.de"
@echo " Email: kontakt@michaelschiemer.de"
@echo " PHP Version: 8.4"
@echo " Framework: Custom PHP Framework"
@echo ""
@echo "$(CYAN)Available Environments:$(NC)"
@for env in development staging production; do \
echo -n " $$env: "; \
if [ -f "$(APPLICATIONS_DIR)/environments/.env.$$env" ]; then \
echo "$(GREEN)✓ Configured$(NC)"; \
else \
echo "$(RED)❌ Not configured$(NC)"; \
fi; \
done
@echo ""
@echo "$(CYAN)Deployment Modes:$(NC)"
@echo " • Full Stack: Infrastructure + Application"
@echo " • Infrastructure Only: Ansible deployment"
@echo " • Application Only: Docker Compose deployment"
@echo ""
@echo "$(CYAN)Quick Commands:$(NC)"
@echo " make deploy-staging # Deploy to staging"
@echo " make deploy-production # Deploy to production"
@echo " make deploy-dry ENV=prod # Dry run for production"
@echo " make status ENV=staging # Check staging status"
@echo ""
##@ Emergency Commands
emergency-stop: ## Emergency stop all services for specified environment
@echo "$(RED)🚨 EMERGENCY STOP: Stopping all services for $(ENV) environment$(NC)"
@cd $(PROJECT_ROOT) && docker-compose \
-f docker-compose.yml \
-f $(APPLICATIONS_DIR)/docker-compose.$(ENV).yml \
--env-file $(APPLICATIONS_DIR)/environments/.env.$(ENV) \
down
@echo "$(YELLOW)✓ All services stopped$(NC)"
emergency-restart: ## Emergency restart all services for specified environment
@echo "$(YELLOW)🔄 EMERGENCY RESTART: Restarting all services for $(ENV) environment$(NC)"
@$(MAKE) emergency-stop ENV=$(ENV)
@sleep 5
@cd $(PROJECT_ROOT) && docker-compose \
-f docker-compose.yml \
-f $(APPLICATIONS_DIR)/docker-compose.$(ENV).yml \
--env-file $(APPLICATIONS_DIR)/environments/.env.$(ENV) \
up -d
@echo "$(GREEN)✓ All services restarted$(NC)"
rollback: ## Rollback to previous deployment (use with extreme caution!)
@echo "$(RED)⚠️ ROLLBACK: This will attempt to restore the previous deployment$(NC)"
@echo "$(YELLOW)This is a destructive operation that should only be used in emergencies$(NC)"
@read -p "Are you sure? Type 'ROLLBACK' to confirm: " confirm && [ "$$confirm" = "ROLLBACK" ] || (echo "Cancelled" && exit 1)
@echo "$(YELLOW)Performing emergency rollback...$(NC)"
@$(MAKE) backup ENV=$(ENV)
@$(MAKE) restore ENV=$(ENV)
@echo "$(GREEN)✓ Rollback completed$(NC)"
@echo "$(YELLOW)Please verify system functionality immediately$(NC)"
# Include environment-specific makefiles if they exist
-include $(DEPLOYMENT_DIR)/environments/$(ENV).mk
# Default target
.DEFAULT_GOAL := help