diff --git a/Makefile b/Makefile index 063ddee..82bc7ae 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ # Makefile for Medication Reminder App # Acts as a wrapper for package.json scripts with organized targets -.PHONY: help install clean build dev test lint deploy docker gitea k8s +.PHONY: help install clean build dev test lint deploy undeploy docker gitea k8s # Default target .DEFAULT_GOAL := help @@ -16,218 +16,285 @@ RESET := \033[0m ##@ General help: ## Display this help message - @echo "$(BLUE)Medication Reminder App - Available Commands$(RESET)" - @echo "" + @printf "$(BLUE)Medication Reminder App - Available Commands$(RESET)\n" + @printf "\n" @awk 'BEGIN {FS = ":.*##"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " $(GREEN)%-20s$(RESET) %s\n", $$1, $$2 } /^##@/ { printf "\n$(YELLOW)%s$(RESET)\n", substr($$0, 5) } ' $(MAKEFILE_LIST) install: ## Install dependencies - @echo "$(BLUE)Installing dependencies...$(RESET)" + @printf "$(BLUE)Installing dependencies...$(RESET)\n" @bun install clean: ## Clean build artifacts and dependencies - @echo "$(BLUE)Cleaning up...$(RESET)" + @printf "$(BLUE)Cleaning up...$(RESET)\n" @rm -rf node_modules dist build .cache ##@ Development dev: ## Start development server - @echo "$(BLUE)Starting development server...$(RESET)" + @printf "$(BLUE)Starting development server...$(RESET)\n" @bun run dev build: ## Build the application - @echo "$(BLUE)Building application...$(RESET)" + @printf "$(BLUE)Building application...$(RESET)\n" @bun run build preview: ## Preview the built application - @echo "$(BLUE)Starting preview server...$(RESET)" + @printf "$(BLUE)Starting preview server...$(RESET)\n" @bun run preview ##@ Testing test: ## Run unit tests - @echo "$(BLUE)Running unit tests...$(RESET)" + @printf "$(BLUE)Running unit tests...$(RESET)\n" @bun run test test-watch: ## Run unit tests in watch mode - @echo "$(BLUE)Running tests in watch mode...$(RESET)" + @printf "$(BLUE)Running tests in watch mode...$(RESET)\n" @bun run test:watch test-coverage: ## Run tests with coverage - @echo "$(BLUE)Running tests with coverage...$(RESET)" + @printf "$(BLUE)Running tests with coverage...$(RESET)\n" @bun run test:coverage test-integration: ## Run integration tests - @echo "$(BLUE)Running integration tests...$(RESET)" + @printf "$(BLUE)Running integration tests...$(RESET)\n" @bun run test:integration test-e2e: ## Run end-to-end tests - @echo "$(BLUE)Running e2e tests...$(RESET)" + @printf "$(BLUE)Running e2e tests...$(RESET)\n" @bun run test:e2e test-e2e-ui: ## Run e2e tests with UI - @echo "$(BLUE)Running e2e tests with UI...$(RESET)" + @printf "$(BLUE)Running e2e tests with UI...$(RESET)\n" @bun run test:e2e:ui test-e2e-debug: ## Debug e2e tests - @echo "$(BLUE)Debugging e2e tests...$(RESET)" + @printf "$(BLUE)Debugging e2e tests...$(RESET)\n" @bun run test:e2e:debug test-e2e-report: ## Show e2e test report - @echo "$(BLUE)Showing e2e test report...$(RESET)" + @printf "$(BLUE)Showing e2e test report...$(RESET)\n" @bun run test:e2e:report test-backend: ## Run backend tests (unit + integration) - @echo "$(BLUE)Running backend tests...$(RESET)" + @printf "$(BLUE)Running backend tests...$(RESET)\n" @bun run test && bun run test:integration test-all: ## Run all tests (unit + integration + e2e) - @echo "$(BLUE)Running all tests...$(RESET)" + @printf "$(BLUE)Running all tests...$(RESET)\n" @bun run test:all ##@ Code Quality lint: ## Run all linting checks - @echo "$(BLUE)Running linting checks...$(RESET)" + @printf "$(BLUE)Running linting checks...$(RESET)\n" @bun run lint lint-fix: ## Fix linting issues - @echo "$(BLUE)Fixing linting issues...$(RESET)" + @printf "$(BLUE)Fixing linting issues...$(RESET)\n" @bun run lint:fix lint-markdown: ## Lint markdown files - @echo "$(BLUE)Linting markdown files...$(RESET)" + @printf "$(BLUE)Linting markdown files...$(RESET)\n" @bun run lint:markdown lint-markdown-fix: ## Fix markdown linting issues - @echo "$(BLUE)Fixing markdown linting issues...$(RESET)" + @printf "$(BLUE)Fixing markdown linting issues...$(RESET)\n" @bun run lint:markdown:fix lint-docker: ## Lint Dockerfile - @echo "$(BLUE)Linting Dockerfile...$(RESET)" + @printf "$(BLUE)Linting Dockerfile...$(RESET)\n" @bun run lint:docker check-secrets: ## Check for secrets in code - @echo "$(BLUE)Checking for secrets...$(RESET)" + @printf "$(BLUE)Checking for secrets...$(RESET)\n" @bun run check:secrets check-editorconfig: ## Check EditorConfig compliance - @echo "$(BLUE)Checking EditorConfig compliance...$(RESET)" + @printf "$(BLUE)Checking EditorConfig compliance...$(RESET)\n" @bun run check:editorconfig fix-editorconfig: ## Fix EditorConfig issues - @echo "$(BLUE)Fixing EditorConfig issues...$(RESET)" + @printf "$(BLUE)Fixing EditorConfig issues...$(RESET)\n" @bun run fix:editorconfig pre-commit: ## Run pre-commit checks - @echo "$(BLUE)Running pre-commit checks...$(RESET)" + @printf "$(BLUE)Running pre-commit checks...$(RESET)\n" @bun run pre-commit ##@ Setup & Deployment setup: ## Setup the project - @echo "$(BLUE)Setting up project...$(RESET)" + @printf "$(BLUE)Setting up project...$(RESET)\n" @bun run setup deploy: ## Deploy the application - @echo "$(BLUE)Deploying application...$(RESET)" + @printf "$(BLUE)Deploying application...$(RESET)\n" @bun run deploy +undeploy: ## Undeploy the application (both k8s and docker) + @printf "$(BLUE)Undeploying application...$(RESET)\n" + @$(MAKE) undeploy-k8s + @$(MAKE) undeploy-docker + +undeploy-k8s: ## Undeploy from Kubernetes only + @printf "$(BLUE)Undeploying from Kubernetes...$(RESET)\n" + @if kubectl get deployment -l app=rxminder 2>/dev/null | grep -q rxminder; then \ + $(MAKE) k8s-undeploy; \ + else \ + printf "$(YELLOW)No Kubernetes deployments found for rxminder$(RESET)\n"; \ + fi + +undeploy-docker: ## Stop and remove Docker Compose services + @printf "$(BLUE)Undeploying Docker containers...$(RESET)\n" + @if docker-compose -f docker/docker-compose.yaml ps --services 2>/dev/null | grep -q .; then \ + $(MAKE) docker-down; \ + else \ + printf "$(YELLOW)No Docker Compose services found running$(RESET)\n"; \ + fi + +undeploy-docker-full: ## Stop, remove containers and delete volumes + @printf "$(BLUE)Full Docker undeploy (includes volumes)...$(RESET)\n" + @if docker-compose -f docker/docker-compose.yaml ps --services 2>/dev/null | grep -q .; then \ + $(MAKE) docker-down-volumes; \ + else \ + printf "$(YELLOW)No Docker Compose services found running$(RESET)\n"; \ + fi + validate-env: ## Validate environment configuration - @echo "$(BLUE)Validating environment...$(RESET)" + @printf "$(BLUE)Validating environment...$(RESET)\n" @bun run validate:env validate-deployment: ## Validate deployment - @echo "$(BLUE)Validating deployment...$(RESET)" + @printf "$(BLUE)Validating deployment...$(RESET)\n" @bun run validate:deployment seed-production: ## Seed production database - @echo "$(BLUE)Seeding production database...$(RESET)" + @printf "$(BLUE)Seeding production database...$(RESET)\n" @bun run seed:production ##@ Kubernetes k8s-deploy: ## Deploy to Kubernetes - @echo "$(BLUE)Deploying to Kubernetes...$(RESET)" + @printf "$(BLUE)Deploying to Kubernetes...$(RESET)\n" @bun run deploy:k8s k8s-undeploy: ## Remove from Kubernetes - @echo "$(BLUE)Removing from Kubernetes...$(RESET)" + @printf "$(BLUE)Removing from Kubernetes...$(RESET)\n" @bun run undeploy:k8s k8s-deploy-dry: ## Dry run Kubernetes deployment - @echo "$(BLUE)Dry run Kubernetes deployment...$(RESET)" + @printf "$(BLUE)Dry run Kubernetes deployment...$(RESET)\n" @bun run deploy:k8s --dry-run k8s-undeploy-dry: ## Dry run Kubernetes removal - @echo "$(BLUE)Dry run Kubernetes removal...$(RESET)" + @printf "$(BLUE)Dry run Kubernetes removal...$(RESET)\n" @bun run undeploy:k8s --dry-run k8s-status: ## Show Kubernetes deployment status - @echo "$(BLUE)Showing Kubernetes status...$(RESET)" + @printf "$(BLUE)Showing Kubernetes status...$(RESET)\n" @bun run deploy:k8s --status ##@ Docker docker-setup: ## Setup Docker buildx - @echo "$(BLUE)Setting up Docker buildx...$(RESET)" + @printf "$(BLUE)Setting up Docker buildx...$(RESET)\n" @bun run docker:setup docker-build: ## Build multi-platform Docker images - @echo "$(BLUE)Building multi-platform Docker images...$(RESET)" + @printf "$(BLUE)Building multi-platform Docker images...$(RESET)\n" @bun run docker:build docker-build-local: ## Build local Docker image - @echo "$(BLUE)Building local Docker image...$(RESET)" + @printf "$(BLUE)Building local Docker image...$(RESET)\n" @bun run docker:build-local docker-bake: ## Build with Docker Bake - @echo "$(BLUE)Building with Docker Bake...$(RESET)" + @printf "$(BLUE)Building with Docker Bake...$(RESET)\n" @bun run docker:bake docker-inspect: ## Inspect Docker buildx - @echo "$(BLUE)Inspecting Docker buildx...$(RESET)" + @printf "$(BLUE)Inspecting Docker buildx...$(RESET)\n" @bun run docker:inspect docker-cleanup: ## Cleanup Docker buildx - @echo "$(BLUE)Cleaning up Docker buildx...$(RESET)" + @printf "$(BLUE)Cleaning up Docker buildx...$(RESET)\n" @bun run docker:cleanup +docker-stop: ## Stop Docker Compose services + @printf "$(BLUE)Stopping Docker Compose services...$(RESET)\n" + @if docker-compose -f docker/docker-compose.yaml ps --services 2>/dev/null | grep -q .; then \ + docker-compose -f docker/docker-compose.yaml stop; \ + printf "$(GREEN)Docker Compose services stopped$(RESET)\n"; \ + else \ + printf "$(YELLOW)No Docker Compose services found running$(RESET)\n"; \ + fi + +docker-down: ## Stop and remove Docker Compose containers + @printf "$(BLUE)Stopping and removing Docker Compose containers...$(RESET)\n" + @if docker-compose -f docker/docker-compose.yaml ps --services 2>/dev/null | grep -q .; then \ + docker-compose -f docker/docker-compose.yaml down; \ + printf "$(GREEN)Docker Compose containers stopped and removed$(RESET)\n"; \ + else \ + printf "$(YELLOW)No Docker Compose services found running$(RESET)\n"; \ + fi + +docker-down-volumes: ## Stop, remove containers and delete volumes + @printf "$(BLUE)Stopping containers and removing volumes...$(RESET)\n" + @if docker-compose -f docker/docker-compose.yaml ps --services 2>/dev/null | grep -q .; then \ + docker-compose -f docker/docker-compose.yaml down --volumes --remove-orphans; \ + printf "$(GREEN)Docker Compose containers and volumes removed$(RESET)\n"; \ + else \ + printf "$(YELLOW)No Docker Compose services found running$(RESET)\n"; \ + fi + +docker-stop-all: ## Stop and remove ALL Docker containers (use with caution) + @printf "$(BLUE)Stopping all Docker containers...$(RESET)\n" + @docker stop $$(docker ps -aq) 2>/dev/null || true + @docker rm $$(docker ps -aq) 2>/dev/null || true + +docker-prune: ## Remove unused Docker images and volumes + @printf "$(BLUE)Cleaning up Docker images and volumes...$(RESET)\n" + @docker image prune -f --filter "until=24h" 2>/dev/null || true + @docker volume prune -f 2>/dev/null || true + @docker system prune -f 2>/dev/null || true + ##@ Gitea gitea-setup: ## Setup Gitea integration - @echo "$(BLUE)Setting up Gitea integration...$(RESET)" + @printf "$(BLUE)Setting up Gitea integration...$(RESET)\n" @bun run gitea:setup gitea-build: ## Build multi-platform images for Gitea - @echo "$(BLUE)Building multi-platform images for Gitea...$(RESET)" + @printf "$(BLUE)Building multi-platform images for Gitea...$(RESET)\n" @bun run gitea:build gitea-build-local: ## Build local image for Gitea - @echo "$(BLUE)Building local image for Gitea...$(RESET)" + @printf "$(BLUE)Building local image for Gitea...$(RESET)\n" @bun run gitea:build-local gitea-build-staging: ## Build staging image for Gitea - @echo "$(BLUE)Building staging image for Gitea...$(RESET)" + @printf "$(BLUE)Building staging image for Gitea...$(RESET)\n" @bun run gitea:build-staging gitea-build-prod: ## Build production image for Gitea - @echo "$(BLUE)Building production image for Gitea...$(RESET)" + @printf "$(BLUE)Building production image for Gitea...$(RESET)\n" @bun run gitea:build-prod gitea-test: ## Test Gitea integration - @echo "$(BLUE)Testing Gitea integration...$(RESET)" + @printf "$(BLUE)Testing Gitea integration...$(RESET)\n" @bun run gitea:test gitea-deploy: ## Deploy to Gitea - @echo "$(BLUE)Deploying to Gitea...$(RESET)" + @printf "$(BLUE)Deploying to Gitea...$(RESET)\n" @bun run gitea:deploy gitea-status: ## Show Gitea deployment status - @echo "$(BLUE)Showing Gitea status...$(RESET)" + @printf "$(BLUE)Showing Gitea status...$(RESET)\n" @bun run gitea:status gitea-cleanup: ## Cleanup Gitea resources - @echo "$(BLUE)Cleaning up Gitea resources...$(RESET)" + @printf "$(BLUE)Cleaning up Gitea resources...$(RESET)\n" @bun run gitea:cleanup ##@ Quick Commands @@ -235,16 +302,16 @@ gitea-cleanup: ## Cleanup Gitea resources start: dev ## Alias for dev (start development server) build-and-test: build test ## Build and run tests - @echo "$(GREEN)Build and test completed!$(RESET)" + @printf "$(GREEN)Build and test completed!$(RESET)\n" full-check-backend: lint test-backend ## Run backend code quality check (unit + integration tests only) - @echo "$(GREEN)Backend check completed!$(RESET)" + @printf "$(GREEN)Backend check completed!$(RESET)\n" full-check: lint test-all ## Run full code quality check (includes unit + integration + E2E tests) - @echo "$(GREEN)Full check completed!$(RESET)" + @printf "$(GREEN)Full check completed!$(RESET)\n" quick-deploy: build k8s-deploy ## Quick build and deploy to Kubernetes - @echo "$(GREEN)Quick deployment completed!$(RESET)" + @printf "$(GREEN)Quick deployment completed!$(RESET)\n" reset: clean install ## Reset project (clean and reinstall) - @echo "$(GREEN)Project reset completed!$(RESET)" + @printf "$(GREEN)Project reset completed!$(RESET)\n"