Makefile
Rama main · réplica de lectura del repositorio original.
IMAGE_REGISTRY := docker.io
IMAGE_REPOSITORY := cozedev
IMAGE_NAME := coze-loop
# Python FaaS image config
PYFAAS_IMAGE_NAME := coze-loop-python-faas
PYFAAS_DOCKERFILE := ./release/image/python-faas.Dockerfile
DOCKER_COMPOSE_DIR := ./release/deployment/docker-compose
HELM_CHART_DIR := ./release/deployment/helm-chart/umbrella
HELM_NAMESPACE := coze-loop
HELM_RELEASE := coze-loop
COZE_LOOP_NGINX_DATA_VOLUME_NAME := $(or $(COZE_LOOP_NGINX_DATA_VOLUME_NAME),coze-loop-nginx-data)
.PHONY: image mini-start mini-tunnel
.PHONY: FORCE
FORCE:
image%:
@case "$*" in \
-login) \
docker login $(IMAGE_REGISTRY) -u $(IMAGE_REPOSITORY) ;; \
-bpush-*) \
version="$*"; \
version="$${version#-bpush-}"; \
docker buildx build \
--platform linux/amd64,linux/arm64 \
--progress=plain \
--push \
-f ./release/image/Dockerfile \
-t $(IMAGE_REGISTRY)/$(IMAGE_REPOSITORY)/$(IMAGE_NAME):latest \
-t $(IMAGE_REGISTRY)/$(IMAGE_REPOSITORY)/$(IMAGE_NAME):"$$version" \
.; \
docker pull $(IMAGE_REGISTRY)/$(IMAGE_REPOSITORY)/$(IMAGE_NAME):latest; \
docker run --rm $(IMAGE_REPOSITORY)/$(IMAGE_NAME):latest du -sh /coze-loop/bin; \
docker run --rm $(IMAGE_REPOSITORY)/$(IMAGE_NAME):latest du -sh /coze-loop/resources; \
docker run --rm $(IMAGE_REPOSITORY)/$(IMAGE_NAME):latest du -sh /coze-loop ;; \
-python-faas-bpush-*) \
version="$*"; \
version="$${version#-python-faas-bpush-}"; \
docker buildx build \
--platform linux/amd64,linux/arm64 \
--progress=plain \
--push \
--build-context bootstrap=$(DOCKER_COMPOSE_DIR)/bootstrap/python-faas \
-f $(PYFAAS_DOCKERFILE) \
-t $(IMAGE_REGISTRY)/$(IMAGE_REPOSITORY)/$(PYFAAS_IMAGE_NAME):latest \
-t $(IMAGE_REGISTRY)/$(IMAGE_REPOSITORY)/$(PYFAAS_IMAGE_NAME):"$$version" \
.; \
docker pull $(IMAGE_REGISTRY)/$(IMAGE_REPOSITORY)/$(PYFAAS_IMAGE_NAME):latest; \
docker run --rm $(IMAGE_REPOSITORY)/$(PYFAAS_IMAGE_NAME):latest du -sh /app; \
docker run --rm $(IMAGE_REPOSITORY)/$(PYFAAS_IMAGE_NAME):latest du -sh /app/vendor; \
;; \
-help|*) \
echo "Usage:"; \
echo " make image--login # Login to the image registry ($(IMAGE_REGISTRY))"; \
echo " make image-<version> # Build & push coze-loop image (<version>, latest)"; \
echo " make image-python-faas-bpush-<version> # Build & push python-faas image (<version>, latest)"; \
echo; \
echo "Examples:"; \
echo " make image--login"; \
echo " make image-1.0.0"; \
echo " make image-python-faas-bpush-1.0.0"; \
echo; \
echo "Notes:"; \
echo " - 'image--login' logs in using IMAGE_REPOSITORY as the username."; \
echo " - 'image-<version>' pushes to $(IMAGE_REGISTRY)/$(IMAGE_REPOSITORY)/$(IMAGE_NAME)"; \
echo " - 'image-python-faas-bpush-<version>' pushes to $(IMAGE_REGISTRY)/$(IMAGE_REPOSITORY)/$(PYFAAS_IMAGE_NAME)"; \
exit 1 ;; \
esac
compose%:
@case "$*" in \
-up-dev) \
docker volume rm ${COZE_LOOP_NGINX_DATA_VOLUME_NAME} 2>/dev/null || true; \
docker compose \
-f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \
-f $(DOCKER_COMPOSE_DIR)/docker-compose-dev.yml \
--env-file $(DOCKER_COMPOSE_DIR)/.env \
--profile "*" \
up --build ;; \
-restart-dev-*) \
svc="$*"; \
svc="$${svc#-restart-dev-}"; \
docker compose \
-f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \
-f $(DOCKER_COMPOSE_DIR)/docker-compose-dev.yml \
--env-file $(DOCKER_COMPOSE_DIR)/.env \
restart "$$svc" ;; \
-down-dev) \
docker compose \
-f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \
-f $(DOCKER_COMPOSE_DIR)/docker-compose-dev.yml \
--env-file $(DOCKER_COMPOSE_DIR)/.env \
--profile "*" \
down ;; \
-down-v-dev) \
docker compose \
-f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \
-f $(DOCKER_COMPOSE_DIR)/docker-compose-dev.yml \
--env-file $(DOCKER_COMPOSE_DIR)/.env \
--profile "*" \
down -v ;; \
-up-debug) \
docker volume rm ${COZE_LOOP_NGINX_DATA_VOLUME_NAME} 2>/dev/null || true; \
docker compose \
-f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \
-f $(DOCKER_COMPOSE_DIR)/docker-compose-debug.yml \
--env-file $(DOCKER_COMPOSE_DIR)/.env \
--profile "*" \
up --build ;; \
-restart-debug-*) \
svc="$*"; \
svc="$${svc#-restart-debug-}"; \
docker compose \
-f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \
-f $(DOCKER_COMPOSE_DIR)/docker-compose-debug.yml \
--env-file $(DOCKER_COMPOSE_DIR)/.env \
restart "$$svc" ;; \
-down-debug) \
docker compose \
-f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \
-f $(DOCKER_COMPOSE_DIR)/docker-compose-debug.yml \
--env-file $(DOCKER_COMPOSE_DIR)/.env \
--profile "*" \
down ;; \
-down-v-debug) \
docker compose \
-f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \
-f $(DOCKER_COMPOSE_DIR)/docker-compose-debug.yml \
--env-file $(DOCKER_COMPOSE_DIR)/.env \
--profile "*" \
down -v ;; \
-up) \
docker volume rm ${COZE_LOOP_NGINX_DATA_VOLUME_NAME} 2>/dev/null || true; \
docker compose \
-f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \
--env-file $(DOCKER_COMPOSE_DIR)/.env \
--profile "*" \
up ;; \
-restart-*) \
svc="$*"; \
svc="$${svc#-restart-}"; \
docker compose \
-f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \
--env-file $(DOCKER_COMPOSE_DIR)/.env \
restart "$$svc" ;; \
-down) \
docker compose \
-f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \
--env-file $(DOCKER_COMPOSE_DIR)/.env \
--profile "*" \
down ;; \
-down-v) \
docker compose \
-f $(DOCKER_COMPOSE_DIR)/docker-compose.yml \
--env-file $(DOCKER_COMPOSE_DIR)/.env \
--profile "*" \
down -v ;; \
-help|*) \
echo "Usage:"; \
echo " # Stable profile"; \
echo " make compose-up # Start base services"; \
echo " make compose-restart-<svc> # Restart specific base service"; \
echo " make compose-down # Stop base services"; \
echo " make compose-down-v # Stop base services and remove volumes"; \
echo; \
echo " # Dev profile"; \
echo " make compose-up-dev # Start base + dev services (build)"; \
echo " make compose-restart-dev-<svc> # Restart specific dev service"; \
echo " make compose-down-dev # Stop base + dev services"; \
echo " make compose-down-v-dev # Stop base + dev services and remove volumes"; \
echo; \
echo " # Debug profile"; \
echo " make compose-up-debug # Start base + debug services (build)"; \
echo " make compose-restart-debug-<svc> # Restart specific debug service"; \
echo " make compose-down-debug # Stop base + debug services"; \
echo " make compose-down-v-debug # Stop base + debug services and remove volumes"; \
echo; \
echo "Notes:"; \
echo " - '<svc>' means the name of a service in docker-compose.yml"; \
echo " - '--profile \"*\"' is only needed for 'up', not for 'down' or 'restart'."; \
echo " - If you used multiple -f files for 'up', use the same -f set for 'down' or 'restart'."; \
exit 1 ;; \
esac
helm%:
@case "$*" in \
-login) \
helm registry login $(IMAGE_REGISTRY) -u $(IMAGE_REPOSITORY) ;; \
-chart-deps) \
helm dependency build $(HELM_CHART_DIR) ;; \
-chart-deps-clean) \
rm -rf $(HELM_CHART_DIR)/charts $(HELM_CHART_DIR)/Chart.lock ;; \
-chart-bpush-*) \
version="$*"; \
version="$${version#-chart-bpush-}"; \
helm dependency build $(HELM_CHART_DIR); \
helm package $(HELM_CHART_DIR) --version "$$version"-helm; \
helm push $(IMAGE_NAME)-"$$version"-helm.tgz oci://$(IMAGE_REGISTRY)/$(IMAGE_REPOSITORY); \
rm -f $(IMAGE_NAME)-"$$version"-helm.tgz; \
rm -rf $(HELM_CHART_DIR)/charts $(HELM_CHART_DIR)/Chart.lock ;; \
-ctx) \
kubectl config get-contexts ;; \
-ctx-*) \
ctx="$*"; \
ctx="$${ctx#-ctx-}"; \
echo "switch to context: $$ctx"; \
kubectl config use-context "$$ctx" ;; \
-ns) \
kubectl get namespaces ;; \
-pod) \
kubectl get pods -n $(HELM_NAMESPACE) ;; \
-svc) \
kubectl get svc -n $(HELM_NAMESPACE) -o wide ;; \
-ingress) \
kubectl get ingress -n $(HELM_NAMESPACE) ;; \
-up) \
helm upgrade \
--install --force $(HELM_RELEASE) $(HELM_CHART_DIR) \
--namespace $(HELM_NAMESPACE) --create-namespace \
-f $(HELM_CHART_DIR)/values.yaml ;; \
-up-exp-minikube-*) \
vals="$*"; \
vals="$${vals#-up-exp-minikube-}"; \
helm upgrade \
--install --force $(HELM_RELEASE) $(HELM_CHART_DIR) \
--namespace $(HELM_NAMESPACE) --create-namespace \
-f $(HELM_CHART_DIR)/examples/minikube/"$$vals".values.yaml ;; \
-down) \
helm list -n $(HELM_NAMESPACE) -q \
| \
xargs -r -n1 helm uninstall -n $(HELM_NAMESPACE) ;; \
-logf-*) \
app="$*"; \
app="$${app#-logf-}"; \
kubectl -n $(HELM_NAMESPACE) logs \
-l app=$(HELM_RELEASE)-$$app \
--all-containers=true \
--tail=100 \
--prefix=true \
--max-log-requests=10 \
-f ;; \
-tpl-*) \
app="$*"; \
app="$${app#-tpl-}"; \
helm template $(HELM_RELEASE) $(HELM_CHART_DIR) \
--namespace $(HELM_NAMESPACE) \
-f $(HELM_CHART_DIR)/values.yaml | \
APP="$$app" yq eval '. | select(.kind == "Deployment" and .metadata.name == ("coze-loop-" + strenv(APP)))' - ;; \
-help|*) \
echo "Usage:"; \
echo; \
echo " # Auth & Chart packaging"; \
echo " make helm-login # OCI login to registry ($(IMAGE_REGISTRY)) using user=$(IMAGE_REPOSITORY)"; \
echo " make helm-chart-deps # Build chart dependencies (helm dependency build)"; \
echo " make helm-chart-deps-clean # Clean deps: remove charts/ and Chart.lock"; \
echo " make helm-chart-bpush-<version> # Package chart as <version>-helm and push to OCI ($(IMAGE_REGISTRY)/$(IMAGE_REPOSITORY))"; \
echo; \
echo " # Kube context & namespace"; \
echo " make helm-ctx # List kube contexts"; \
echo " make helm-ctx-<context> # Switch to kube context <context>"; \
echo " make helm-ns # List namespaces"; \
echo; \
echo " # Inspect resources in namespace $(HELM_NAMESPACE)"; \
echo " make helm-pod # List pods (wide)"; \
echo " make helm-svc # List services (wide)"; \
echo " make helm-ingress # List ingress resources"; \
echo; \
echo " # Release lifecycle"; \
echo " make helm-up # helm upgrade --install $(HELM_RELEASE) from $(HELM_CHART_DIR) (uses values.yaml)"; \
echo " make helm-up-exp-minikube-<vals> # helm upgrade using examples/minikube/<vals>.values.yaml"; \
echo " make helm-down # Uninstall ALL releases in namespace $(HELM_NAMESPACE)"; \
echo; \
echo " # Logs & templating"; \
echo " make helm-logf-<app> # Follow logs for pods with label app=$(HELM_RELEASE)-<app>, all containers"; \
echo " make helm-tpl-<app> # Render only Deployment coze-loop-<app> to stdout (no apply)"; \
echo; \
echo "Examples:"; \
echo " make helm-login"; \
echo " make helm-chart-deps && make helm-chart-bpush-1.0.0"; \
echo " make helm-ctx && make helm-ctx-minikube"; \
echo " make helm-up # installs/updates $(HELM_RELEASE) in $(HELM_NAMESPACE)"; \
echo " make helm-logf-app # e.g., app=api => label app=$(HELM_RELEASE)-api"; \
echo; \
echo "Notes:"; \
echo " - Ensure HELM_NAMESPACE and HELM_RELEASE are exported or set in the environment."; \
echo " - helm-chart-bpush-<version> produces <chart>-<version>-helm.tgz then pushes and cleans local artifact."; \
echo " - Template filter expects Deployment.metadata.name = \"coze-loop-<app>\"."; \
exit 1 ;; \
esac
minikube%:
@case "$*" in \
-start) \
minikube start --addons=ingress ;; \
-tunnel) \
sudo minikube tunnel ;; \
-help|*) \
echo "Usage:"; \
echo; \
echo " make minikube-start # Start minikube with ingress addon enabled"; \
echo " make minikube-tunnel # Run minikube tunnel (requires sudo), exposes LoadBalancer/Ingress services locally"; \
echo; \
echo "Examples:"; \
echo " make minikube-start"; \
echo " make minikube-tunnel"; \
echo; \
echo "Notes:"; \
echo " - 'minikube-start' uses '--addons=ingress' to enable NGINX ingress controller automatically."; \
echo " - 'minikube-tunnel' will bind service external IPs to localhost for LoadBalancer/Ingress access."; \
echo " - 'minikube-tunnel' may require admin privileges (sudo) depending on your OS/network setup."; \
exit 1 ;; \
esac