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:
183
Makefile
183
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:
|
||||
@@ -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."
|
||||
Reference in New Issue
Block a user