.PHONY: build push test update clean help # Detect container engine (podman or docker) CONTAINER_CMD := $(shell command -v podman 2>/dev/null || command -v docker 2>/dev/null) REGISTRY ?= registry.gitlab.com/towerops/towerops DOCKERHUB_REGISTRY ?= docker.io/gmcintire IMAGE_NAME ?= towerops-base BUILDER_TAG ?= builder RUNTIME_TAG ?= runtime ELIXIR_VERSION ?= 1.19.4 OTP_VERSION ?= 28.3 DEBIAN_VERSION ?= trixie-20251229-slim help: ## Show this help message @echo "Available targets:" @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-15s\033[0m %s\n", $$1, $$2}' build: ## Build the base image with latest packages @chmod +x build.sh @./build.sh update: build ## Alias for build (rebuilds with latest packages) test: ## Test the built images @echo "Testing builder image..." @$(CONTAINER_CMD) run --rm $(REGISTRY)/$(IMAGE_NAME):$(BUILDER_TAG) mix --version @echo "Testing runtime image..." @$(CONTAINER_CMD) run --rm $(REGISTRY)/$(IMAGE_NAME):$(RUNTIME_TAG) locale | grep "en_US.UTF-8" @echo "✅ All tests passed!" push: ## Push images to GitLab and Docker Hub @echo "Pushing to GitLab registry..." @$(CONTAINER_CMD) push $(REGISTRY)/$(IMAGE_NAME):$(BUILDER_TAG) @$(CONTAINER_CMD) push $(REGISTRY)/$(IMAGE_NAME):$(RUNTIME_TAG) @$(CONTAINER_CMD) push $(REGISTRY)/$(IMAGE_NAME):latest @echo "Tagging for Docker Hub..." @$(CONTAINER_CMD) tag $(REGISTRY)/$(IMAGE_NAME):$(BUILDER_TAG) $(DOCKERHUB_REGISTRY)/$(IMAGE_NAME):$(BUILDER_TAG) @$(CONTAINER_CMD) tag $(REGISTRY)/$(IMAGE_NAME):$(RUNTIME_TAG) $(DOCKERHUB_REGISTRY)/$(IMAGE_NAME):$(RUNTIME_TAG) @$(CONTAINER_CMD) tag $(REGISTRY)/$(IMAGE_NAME):latest $(DOCKERHUB_REGISTRY)/$(IMAGE_NAME):latest @echo "Pushing to Docker Hub..." @$(CONTAINER_CMD) push $(DOCKERHUB_REGISTRY)/$(IMAGE_NAME):$(BUILDER_TAG) @$(CONTAINER_CMD) push $(DOCKERHUB_REGISTRY)/$(IMAGE_NAME):$(RUNTIME_TAG) @$(CONTAINER_CMD) push $(DOCKERHUB_REGISTRY)/$(IMAGE_NAME):latest pull: ## Pull latest images from registry @$(CONTAINER_CMD) pull $(REGISTRY)/$(IMAGE_NAME):$(BUILDER_TAG) @$(CONTAINER_CMD) pull $(REGISTRY)/$(IMAGE_NAME):$(RUNTIME_TAG) inspect: ## Show image details (size, layers, labels) @echo "Builder image:" @$(CONTAINER_CMD) images $(REGISTRY)/$(IMAGE_NAME):$(BUILDER_TAG) --format "table {{.Repository}}:{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}" @echo "" @echo "Runtime image:" @$(CONTAINER_CMD) images $(REGISTRY)/$(IMAGE_NAME):$(RUNTIME_TAG) --format "table {{.Repository}}:{{.Tag}}\t{{.Size}}\t{{.CreatedAt}}" @echo "" @echo "Builder labels:" @$(CONTAINER_CMD) inspect $(REGISTRY)/$(IMAGE_NAME):$(BUILDER_TAG) --format '{{range $$k, $$v := .Config.Labels}}{{$$k}}={{$$v}}{{println}}{{end}}' @echo "" @echo "Runtime labels:" @$(CONTAINER_CMD) inspect $(REGISTRY)/$(IMAGE_NAME):$(RUNTIME_TAG) --format '{{range $$k, $$v := .Config.Labels}}{{$$k}}={{$$v}}{{println}}{{end}}' clean: ## Remove local images @$(CONTAINER_CMD) rmi $(REGISTRY)/$(IMAGE_NAME):$(BUILDER_TAG) || true @$(CONTAINER_CMD) rmi $(REGISTRY)/$(IMAGE_NAME):$(RUNTIME_TAG) || true @$(CONTAINER_CMD) rmi $(REGISTRY)/$(IMAGE_NAME):latest || true @$(CONTAINER_CMD) rmi $(DOCKERHUB_REGISTRY)/$(IMAGE_NAME):$(BUILDER_TAG) || true @$(CONTAINER_CMD) rmi $(DOCKERHUB_REGISTRY)/$(IMAGE_NAME):$(RUNTIME_TAG) || true @$(CONTAINER_CMD) rmi $(DOCKERHUB_REGISTRY)/$(IMAGE_NAME):latest || true @echo "✅ Cleaned local images" login: ## Login to GitLab container registry @$(CONTAINER_CMD) login registry.gitlab.com login-dockerhub: ## Login to Docker Hub @$(CONTAINER_CMD) login docker.io # Quick commands b: build ## Shortcut for build t: test ## Shortcut for test p: push ## Shortcut for push