From bef95b046c9390586ae315fc8c5b0c697452fa44 Mon Sep 17 00:00:00 2001 From: William Valentin Date: Wed, 5 Nov 2025 12:26:51 -0800 Subject: [PATCH] feat(makefile): add comprehensive Kubernetes testing and deployment targets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add 16 new Makefile targets for K8s cluster management: Testing targets: - k8s-test-connection: Verify kubectl connectivity to cluster - k8s-test-manifests: Validate manifest syntax with dry-run - k8s-test-deploy-dev: Test deployment to dev namespace Deployment targets: - k8s-namespace-create: Create namespace with variable support - k8s-secret-create: Create image pull secrets (requires GITEA_PASSWORD) - k8s-deploy: Deploy all manifests to configurable namespace - k8s-deploy-dev/staging/prod: Environment-specific deployments Verification targets: - k8s-status: Show pods/services/deployments/statefulsets status - k8s-logs-backend/frontend: Tail logs for specific services - k8s-health: Check health endpoints for all services Utility targets: - k8s-port-forward: Port forward services for local testing - k8s-exec-backend: Shell into backend pod - k8s-rollback: Rollback deployments - k8s-delete: Delete all resources from namespace (with safety delay) Configuration: - K8S_NAMESPACE: Configurable namespace (default: adopt-a-street-dev) - K8S_CONTEXT: Cluster context (default: k0s-cluster) - REGISTRY: Container registry (default: gitea-http.taildb3494.ts.net) - GITEA_USERNAME: Registry username (default: will) All targets support namespace override via K8S_NAMESPACE parameter for multi-environment deployments to dev/staging/prod namespaces. 🤖 Generated with AI Assistant Co-Authored-By: AI Assistant --- Makefile | 185 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 183 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 83cc7ce..1441727 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,16 @@ # Adopt-a-Street Makefile # Provides convenient commands for building and running the application -.PHONY: help install build run dev test clean lint format docker-multiarch docker-multiarch-verify +.PHONY: help install build run dev test clean lint format docker-multiarch docker-multiarch-verify \ + k8s-test-connection k8s-test-manifests k8s-test-deploy-dev k8s-namespace-create k8s-secret-create \ + k8s-deploy k8s-deploy-dev k8s-deploy-staging k8s-deploy-prod k8s-status k8s-logs-backend \ + k8s-logs-frontend k8s-health k8s-port-forward k8s-exec-backend k8s-rollback k8s-delete + +# Kubernetes Configuration +K8S_NAMESPACE ?= adopt-a-street-dev +K8S_CONTEXT ?= k0s-cluster +REGISTRY ?= gitea-http.taildb3494.ts.net +GITEA_USERNAME ?= will # Default target help: @@ -35,6 +44,31 @@ help: @echo "Production:" @echo " run Run production build" @echo " start Start production servers" + @echo "" + @echo "Kubernetes Testing:" + @echo " k8s-test-connection Verify kubectl connectivity to cluster" + @echo " k8s-test-manifests Validate manifest syntax (dry-run)" + @echo " k8s-test-deploy-dev Deploy to dev namespace and verify" + @echo "" + @echo "Kubernetes Deployment:" + @echo " k8s-namespace-create Create namespace (K8S_NAMESPACE=name)" + @echo " k8s-secret-create Create image pull secrets (requires GITEA_PASSWORD)" + @echo " k8s-deploy Deploy all manifests to namespace" + @echo " k8s-deploy-dev Deploy to adopt-a-street-dev" + @echo " k8s-deploy-staging Deploy to adopt-a-street-staging" + @echo " k8s-deploy-prod Deploy to adopt-a-street-prod" + @echo "" + @echo "Kubernetes Verification:" + @echo " k8s-status Show pods/services status" + @echo " k8s-logs-backend Tail backend logs" + @echo " k8s-logs-frontend Tail frontend logs" + @echo " k8s-health Check health endpoints" + @echo "" + @echo "Kubernetes Utilities:" + @echo " k8s-port-forward Port forward for local testing" + @echo " k8s-exec-backend Shell into backend pod" + @echo " k8s-rollback Rollback deployment" + @echo " k8s-delete Delete all resources from namespace" # Installation install: @@ -188,4 +222,151 @@ quick-start: install env-setup db-setup @echo " docker-multiarch-setup Setup multi-architecture builder" @echo " docker-multiarch-build Build and push multi-arch images" @echo " docker-multiarch-verify Verify multi-arch images" - @echo " docker-multiarch Complete multi-arch workflow" \ No newline at end of file + @echo " docker-multiarch Complete multi-arch workflow" + +# ==================== Kubernetes Testing ==================== + +k8s-test-connection: + @echo "Testing kubectl connectivity to $(K8S_CONTEXT)..." + @kubectl cluster-info --context=$(K8S_CONTEXT) + @echo "" + @echo "Cluster nodes:" + @kubectl get nodes + @echo "" + @echo "Connection test successful!" + +k8s-test-manifests: + @echo "Validating Kubernetes manifests (dry-run)..." + @kubectl apply -f deploy/k8s/ --dry-run=client -n $(K8S_NAMESPACE) + @echo "" + @echo "Manifest validation successful!" + +k8s-test-deploy-dev: + @echo "Testing deployment to $(K8S_NAMESPACE)..." + @$(MAKE) K8S_NAMESPACE=adopt-a-street-dev k8s-namespace-create || true + @echo "Running manifest validation..." + @$(MAKE) K8S_NAMESPACE=adopt-a-street-dev k8s-test-manifests + @echo "" + @echo "Note: Run 'make k8s-secret-create K8S_NAMESPACE=adopt-a-street-dev GITEA_PASSWORD=xxx' before deploying" + @echo "Note: Run 'make k8s-deploy-dev' to actually deploy" + +# ==================== Kubernetes Deployment ==================== + +k8s-namespace-create: + @echo "Creating namespace: $(K8S_NAMESPACE)..." + @kubectl create namespace $(K8S_NAMESPACE) --dry-run=client -o yaml | kubectl apply -f - + @echo "Namespace $(K8S_NAMESPACE) ready!" + +k8s-secret-create: +ifndef GITEA_PASSWORD + @echo "Error: GITEA_PASSWORD environment variable not set" + @echo "Usage: make k8s-secret-create GITEA_PASSWORD=your-password K8S_NAMESPACE=namespace" + @exit 1 +endif + @echo "Creating image pull secret in $(K8S_NAMESPACE)..." + @kubectl create secret docker-registry regcred \ + --docker-server=$(REGISTRY) \ + --docker-username=$(GITEA_USERNAME) \ + --docker-password=$(GITEA_PASSWORD) \ + --namespace=$(K8S_NAMESPACE) \ + --dry-run=client -o yaml | kubectl apply -f - + @echo "Image pull secret created successfully!" + +k8s-deploy: k8s-namespace-create + @echo "Deploying to namespace: $(K8S_NAMESPACE)..." + @echo "Note: Ensure you've created secrets with 'make k8s-secret-create'" + @kubectl apply -f deploy/k8s/configmap.yaml -n $(K8S_NAMESPACE) + @kubectl apply -f deploy/k8s/secrets.yaml -n $(K8S_NAMESPACE) 2>/dev/null || echo "Warning: secrets.yaml not found or already exists" + @kubectl apply -f deploy/k8s/couchdb-configmap.yaml -n $(K8S_NAMESPACE) + @kubectl apply -f deploy/k8s/couchdb-statefulset.yaml -n $(K8S_NAMESPACE) + @kubectl apply -f deploy/k8s/backend-deployment.yaml -n $(K8S_NAMESPACE) + @kubectl apply -f deploy/k8s/frontend-deployment.yaml -n $(K8S_NAMESPACE) + @echo "" + @echo "Deployment initiated! Waiting for pods to be ready..." + @sleep 5 + @kubectl get pods -n $(K8S_NAMESPACE) + @echo "" + @echo "Deployment complete! Run 'make k8s-status K8S_NAMESPACE=$(K8S_NAMESPACE)' to check status" + +k8s-deploy-dev: + @$(MAKE) K8S_NAMESPACE=adopt-a-street-dev k8s-deploy + +k8s-deploy-staging: + @$(MAKE) K8S_NAMESPACE=adopt-a-street-staging k8s-deploy + +k8s-deploy-prod: + @$(MAKE) K8S_NAMESPACE=adopt-a-street-prod k8s-deploy + @echo "" + @echo "WARNING: Deployed to PRODUCTION namespace!" + +# ==================== Kubernetes Verification ==================== + +k8s-status: + @echo "Status for namespace: $(K8S_NAMESPACE)" + @echo "" + @echo "=== Pods ===" + @kubectl get pods -n $(K8S_NAMESPACE) -o wide + @echo "" + @echo "=== Services ===" + @kubectl get services -n $(K8S_NAMESPACE) + @echo "" + @echo "=== Deployments ===" + @kubectl get deployments -n $(K8S_NAMESPACE) + @echo "" + @echo "=== StatefulSets ===" + @kubectl get statefulsets -n $(K8S_NAMESPACE) + +k8s-logs-backend: + @echo "Tailing backend logs in $(K8S_NAMESPACE)..." + @kubectl logs -f -n $(K8S_NAMESPACE) -l app=adopt-a-street-backend --tail=100 + +k8s-logs-frontend: + @echo "Tailing frontend logs in $(K8S_NAMESPACE)..." + @kubectl logs -f -n $(K8S_NAMESPACE) -l app=adopt-a-street-frontend --tail=100 + +k8s-health: + @echo "Checking health endpoints in $(K8S_NAMESPACE)..." + @echo "" + @echo "Backend health:" + @kubectl exec -n $(K8S_NAMESPACE) deployment/adopt-a-street-backend -- curl -s http://localhost:5000/api/health || echo "Backend health check failed" + @echo "" + @echo "" + @echo "Frontend health:" + @kubectl exec -n $(K8S_NAMESPACE) deployment/adopt-a-street-frontend -- curl -s http://localhost:80/health || echo "Frontend health check failed" + @echo "" + @echo "" + @echo "CouchDB health:" + @kubectl exec -n $(K8S_NAMESPACE) deployment/adopt-a-street-backend -- curl -s http://adopt-a-street-couchdb:5984/_up || echo "CouchDB connection failed" + +# ==================== Kubernetes Utilities ==================== + +k8s-port-forward: + @echo "Port forwarding services in $(K8S_NAMESPACE)..." + @echo "Backend: http://localhost:5000" + @echo "Frontend: http://localhost:3000" + @echo "" + @echo "Press Ctrl+C to stop port forwarding" + @kubectl port-forward -n $(K8S_NAMESPACE) service/adopt-a-street-backend 5000:5000 & \ + kubectl port-forward -n $(K8S_NAMESPACE) service/adopt-a-street-frontend 3000:80 + +k8s-exec-backend: + @echo "Opening shell in backend pod..." + @kubectl exec -it -n $(K8S_NAMESPACE) deployment/adopt-a-street-backend -- /bin/bash + +k8s-rollback: + @echo "Rolling back deployments in $(K8S_NAMESPACE)..." + @kubectl rollout undo deployment/adopt-a-street-backend -n $(K8S_NAMESPACE) + @kubectl rollout undo deployment/adopt-a-street-frontend -n $(K8S_NAMESPACE) + @echo "Rollback initiated! Checking status..." + @kubectl rollout status deployment/adopt-a-street-backend -n $(K8S_NAMESPACE) + @kubectl rollout status deployment/adopt-a-street-frontend -n $(K8S_NAMESPACE) + +k8s-delete: + @echo "WARNING: This will delete all resources in $(K8S_NAMESPACE)" + @echo "Press Ctrl+C within 5 seconds to cancel..." + @sleep 5 + @echo "Deleting resources in $(K8S_NAMESPACE)..." + @kubectl delete -f deploy/k8s/ -n $(K8S_NAMESPACE) --ignore-not-found=true + @echo "" + @echo "Resources deleted from $(K8S_NAMESPACE)" + @echo "Note: The namespace itself still exists. Use 'kubectl delete namespace $(K8S_NAMESPACE)' to remove it." \ No newline at end of file