From d08533712f29560b7afb0e719ed5f980b3c1fd03 Mon Sep 17 00:00:00 2001 From: William Valentin Date: Mon, 8 Sep 2025 21:45:45 -0700 Subject: [PATCH] feat: enhance Makefile with APP_NAME integration and improved Docker workflows - Add APP_NAME from .env for personalized application naming - Use APP_NAME in all echo messages and Docker container names - Pass APP_NAME as build arg to Docker builds - Generate default DOCKER_IMAGE from APP_NAME (APP_NAME:latest) - Add new targets: - info: Show project information - docker-stop: Stop running container - docker-logs: Show container logs - docker-shell: Open shell in container - docker-clean-all: Complete cleanup - docker-dev: Build and run (development workflow) - docker-rebuild: Complete refresh workflow - Improve error handling and safety checks - Add container cleanup in docker-run to prevent conflicts - Add image existence check in docker-push Variable precedence: 1. Environment variables (highest) 2. .env file values (medium) 3. Defaults: APP_NAME=meds-app, DOCKER_IMAGE=APP_NAME:latest (lowest) --- Makefile | 93 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 73 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index 0d26970..bf4ea40 100644 --- a/Makefile +++ b/Makefile @@ -1,88 +1,141 @@ # Makefile for Medication Reminder App -# Check if DOCKER_IMAGE is set in environment, otherwise use .env or default +# Check if variables are set in environment, otherwise use .env or defaults +ifndef APP_NAME ifndef DOCKER_IMAGE # Include environment variables from .env file if it exists -include .env - # Set default if still not defined - DOCKER_IMAGE ?= meds-app:latest endif +endif + +# Set defaults if not defined anywhere +APP_NAME ?= meds-app +DOCKER_IMAGE ?= $(APP_NAME):latest export -.PHONY: help install clean dev build test docker-build docker-clean +.PHONY: help install clean dev build test docker-build docker-clean docker-stop docker-logs docker-shell docker-clean-all info docker-dev docker-rebuild # Default target .DEFAULT_GOAL := help ##@ General +info: ## Show project information + @echo "Project Information:" + @echo " Name: $(APP_NAME)" + @echo " Docker Image: $(DOCKER_IMAGE)" + @echo " Node Version: $(shell node --version 2>/dev/null || echo 'not installed')" + @echo " Bun Version: $(shell bun --version 2>/dev/null || echo 'not installed')" + @echo "" + help: ## Display available commands - @echo "Medication Reminder App - Make Commands" + @echo "$(APP_NAME) - Make Commands" @echo "" @echo "Environment Variables:" - @echo " DOCKER_IMAGE Docker image name (default: meds-app:latest)" - @echo " Can be set in .env file or environment" + @echo " APP_NAME Application name (default: meds-app)" + @echo " DOCKER_IMAGE Docker image name (default: $(APP_NAME):latest)" + @echo " Variables can be set in .env file or environment" @echo "" @awk 'BEGIN {FS = ":.*##"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " %-20s %s\n", $$1, $$2 } /^##@/ { printf "\n%s\n", substr($$0, 5) } ' $(MAKEFILE_LIST) install: ## Install dependencies - @echo "Installing dependencies..." + @echo "Installing dependencies for $(APP_NAME)..." @bun install clean: ## Clean build artifacts and dependencies - @echo "Cleaning up..." + @echo "Cleaning up $(APP_NAME) artifacts..." @rm -rf node_modules dist build .cache ##@ Development dev: ## Start development server - @echo "Starting development server..." + @echo "Starting $(APP_NAME) development server..." @bun run dev build: ## Build the application - @echo "Building application..." + @echo "Building $(APP_NAME) application..." @bun run build ##@ Testing test: ## Run unit tests - @echo "Running unit tests..." + @echo "Running $(APP_NAME) unit tests..." @bun run test test-watch: ## Run unit tests in watch mode - @echo "Running tests in watch mode..." + @echo "Running $(APP_NAME) tests in watch mode..." @bun run test:watch ##@ Docker docker-build: ## Build Docker image for multiple architectures - @echo "Building multi-platform Docker image: $(DOCKER_IMAGE)" + @echo "Building multi-platform Docker image for $(APP_NAME): $(DOCKER_IMAGE)" @docker buildx build --platform linux/amd64,linux/arm64 \ --build-arg NODE_ENV=production \ + --build-arg APP_NAME=$(APP_NAME) \ -t $(DOCKER_IMAGE) . docker-build-local: ## Build Docker image for local platform only - @echo "Building local Docker image: $(DOCKER_IMAGE)" + @echo "Building local Docker image for $(APP_NAME): $(DOCKER_IMAGE)" @docker buildx build --platform linux/amd64 \ --build-arg NODE_ENV=production \ + --build-arg APP_NAME=$(APP_NAME) \ -t $(DOCKER_IMAGE) --load . docker-run: ## Run Docker container from built image - @echo "Running Docker container: $(DOCKER_IMAGE)" - @docker run --rm -p 8080:80 $(DOCKER_IMAGE) + @echo "Running $(APP_NAME) container: $(DOCKER_IMAGE)" + @docker stop $(APP_NAME)-container 2>/dev/null || true + @docker rm $(APP_NAME)-container 2>/dev/null || true + @docker run --rm -p 8080:80 --name $(APP_NAME)-container $(DOCKER_IMAGE) docker-push: ## Push Docker image to registry - @echo "Pushing Docker image: $(DOCKER_IMAGE)" + @echo "Pushing $(APP_NAME) Docker image: $(DOCKER_IMAGE)" + @docker image inspect $(DOCKER_IMAGE) >/dev/null 2>&1 || (echo "Error: Image $(DOCKER_IMAGE) not found. Run 'make docker-build' first." && exit 1) @docker push $(DOCKER_IMAGE) docker-config: ## Show current Docker configuration - @echo "Current Docker configuration:" + @echo "Current Docker configuration for $(APP_NAME):" + @echo " APP_NAME: $(APP_NAME)" @echo " DOCKER_IMAGE: $(DOCKER_IMAGE)" @echo " Available images:" @docker images | grep -E "(REPOSITORY|$(shell echo $(DOCKER_IMAGE) | cut -d: -f1))" || true +docker-stop: ## Stop running container + @echo "Stopping $(APP_NAME) container..." + @docker stop $(APP_NAME)-container 2>/dev/null || echo "No $(APP_NAME) container running" + @docker rm $(APP_NAME)-container 2>/dev/null || true + +docker-logs: ## Show container logs + @echo "Showing logs for $(APP_NAME) container..." + @docker logs $(APP_NAME)-container 2>/dev/null || echo "No $(APP_NAME) container found or not running" + +docker-shell: ## Open shell in running container + @echo "Opening shell in $(APP_NAME) container..." + @docker exec -it $(APP_NAME)-container /bin/sh || (echo "Error: Container $(APP_NAME)-container not running. Run 'make docker-run' first." && exit 1) + docker-clean: ## Clean Docker resources - @echo "Cleaning Docker resources..." + @echo "Cleaning Docker resources for $(APP_NAME)..." @docker image prune -f --filter "until=24h" 2>/dev/null || true @docker volume prune -f 2>/dev/null || true + @docker container prune -f 2>/dev/null || true + +docker-clean-all: ## Remove all related Docker resources including images + @echo "Removing all Docker resources for $(APP_NAME)..." + @docker stop $(APP_NAME)-container 2>/dev/null || true + @docker rm $(APP_NAME)-container 2>/dev/null || true + @docker rmi $(DOCKER_IMAGE) 2>/dev/null || true + @docker image prune -f 2>/dev/null || true + +docker-dev: ## Build local image and run container (development workflow) + @echo "Building and running $(APP_NAME) for development..." + @make docker-stop + @make docker-build-local + @make docker-run + +docker-rebuild: ## Stop, clean, rebuild and run (complete refresh) + @echo "Complete rebuild of $(APP_NAME)..." + @make docker-stop + @make docker-clean-all + @make docker-build-local + @make docker-run