# Bolsa - tareas de construcción y despliegue en Kubernetes # # Uso: make -C k8s # Ej.: make -C k8s deploy IMAGE := harbor.reymota.es/reymota/bolsa:latest NAMESPACE := bolsa DEPLOY := bolsa HARBOR := harbor.reymota.es .DEFAULT_GOAL := help .PHONY: help build push deploy robot-secret db-secret restart status logs uninstall purge help: ## Muestra esta ayuda @grep -E '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) | \ awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-12s\033[0m %s\n", $$1, $$2}' build: ## Construye la imagen Docker desde la raíz del proyecto docker build -t $(IMAGE) .. push: build ## Sube la imagen a Harbor docker push $(IMAGE) robot-secret: ## Crea/renueva el pull secret del robot account. Uso: make -C k8s robot-secret TOKEN='' @test -n "$(TOKEN)" || { echo "Error: falta TOKEN. Uso: make -C k8s robot-secret TOKEN=''"; exit 1; } kubectl create secret docker-registry myregistrykey \ --docker-server=$(HARBOR) \ --docker-username='robot$$reymota+regbrowser-pull' \ --docker-password='$(TOKEN)' \ -n $(NAMESPACE) --dry-run=client -o yaml | kubectl apply -f - kubectl rollout restart deploy/$(DEPLOY) -n $(NAMESPACE) kubectl rollout status deploy/$(DEPLOY) -n $(NAMESPACE) --timeout=180s db-secret: ## Crea/renueva el secret de conexión a Postgres (copia credenciales de reymota-pg-cluster) kubectl get secret postgres-app-user -n reymota-pg-cluster -o json | \ python3 -c "import json,sys; d=json.load(sys.stdin); print(json.dumps({'apiVersion':'v1','kind':'Secret','metadata':{'name':'bolsa-db','namespace':'$(NAMESPACE)'},'type':'Opaque','data':{k:d['data'][k] for k in ('username','password')}}))" | \ kubectl apply -f - deploy: ## Aplica los manifiestos y espera a que esté disponible kubectl apply -f namespace.yaml kubectl apply -f database.yaml -n reymota-pg-cluster @if ! kubectl get secret myregistrykey -n $(NAMESPACE) >/dev/null 2>&1; then \ echo ">> Falta el pull secret; cópialo con:"; \ echo ">> kubectl get secret myregistrykey -n regbrowser -o json | python3 -c \"import json,sys; d=json.load(sys.stdin); d['metadata']={'name':'myregistrykey','namespace':'$(NAMESPACE)'}; print(json.dumps(d))\" | kubectl apply -f -"; \ exit 1; \ fi @if ! kubectl get secret bolsa-db -n $(NAMESPACE) >/dev/null 2>&1; then \ echo ">> Falta el secret de BD; ejecutando 'make db-secret'..."; \ $(MAKE) --no-print-directory db-secret; \ fi kubectl apply -f secrets.yaml -f deployment.yaml -f service-ingress.yaml kubectl rollout status deploy/$(DEPLOY) -n $(NAMESPACE) --timeout=180s restart: ## Reinicia el deployment (para hacer pull de la última imagen) kubectl rollout restart deploy/$(DEPLOY) -n $(NAMESPACE) kubectl rollout status deploy/$(DEPLOY) -n $(NAMESPACE) --timeout=180s status: ## Estado de pods, service, ingress kubectl get pods,svc,ingress -n $(NAMESPACE) logs: ## Sigue los logs del pod kubectl logs -f deploy/$(DEPLOY) -n $(NAMESPACE) uninstall: ## Elimina la app (deployment, service, ingress, secrets) conservando namespace y BD kubectl delete deployment/$(DEPLOY) service/bolsa ingress/bolsa \ secret/myregistrykey secret/bolsa-db secret/bolsa-secrets \ -n $(NAMESPACE) --ignore-not-found purge: ## Elimina TODO incluida la BD (borra el namespace completo). ¡Los datos se pierden! kubectl delete namespace $(NAMESPACE) --ignore-not-found