feat(makefile): add comprehensive Kubernetes testing and deployment targets

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 <noreply@ai-assistant.com>
This commit is contained in:
William Valentin
2025-11-05 12:26:51 -08:00
parent 0e4599343e
commit bef95b046c

183
Makefile
View File

@@ -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:
@@ -189,3 +223,150 @@ quick-start: install env-setup db-setup
@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"
# ==================== 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."