- 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)
142 lines
5.1 KiB
Makefile
142 lines
5.1 KiB
Makefile
# Makefile for Medication Reminder App
|
|
|
|
# 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
|
|
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 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 "$(APP_NAME) - Make Commands"
|
|
@echo ""
|
|
@echo "Environment Variables:"
|
|
@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 for $(APP_NAME)..."
|
|
@bun install
|
|
|
|
clean: ## Clean build artifacts and dependencies
|
|
@echo "Cleaning up $(APP_NAME) artifacts..."
|
|
@rm -rf node_modules dist build .cache
|
|
|
|
##@ Development
|
|
|
|
dev: ## Start development server
|
|
@echo "Starting $(APP_NAME) development server..."
|
|
@bun run dev
|
|
|
|
build: ## Build the application
|
|
@echo "Building $(APP_NAME) application..."
|
|
@bun run build
|
|
|
|
##@ Testing
|
|
|
|
test: ## Run unit tests
|
|
@echo "Running $(APP_NAME) unit tests..."
|
|
@bun run test
|
|
|
|
test-watch: ## Run unit 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 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 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 $(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 $(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 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 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
|