#!/bin/bash # Continuous Deployment Script for Kubernetes # This script deploys your application to a Kubernetes cluster # ============================================================================= # Environment Variables (with default values) # ============================================================================= # Kubernetes Configuration KUBECONFIG_DATA="${KUBECONFIG_DATA:-}" KUBERNETES_URL="${KUBERNETES_URL:-https://kubernetes.default.svc}" KUBERNETES_NAMESPACE="${KUBERNETES_NAMESPACE:-default}" KUBERNETES_INGRESS_HOST="${KUBERNETES_INGRESS_HOST:-stats-api.example.com}" # Container Registry CONTAINER_REGISTRY_URL="${CONTAINER_REGISTRY_URL:-127.0.0.1}" CONTAINER_REGISTRY_USERNAME="${CONTAINER_REGISTRY_USERNAME:-username}" CONTAINER_REGISTRY_NAMESPACE="${CONTAINER_REGISTRY_NAMESPACE:-username}" CONTAINER_REGISTRY_PASSWORD="${CONTAINER_REGISTRY_PASSWORD:-password}" CONTAINER_IMAGE_NAME="${CONTAINER_IMAGE_NAME:-stats-api}" CONTAINER_IMAGE_TAG="${CONTAINER_IMAGE_TAG:-latest}" # Application Configuration DATABASE_DSN="${DATABASE_DSN:-postgres://postgres:password@localhost:5432/steam_union?sslmode=disable}" # ============================================================================= # Functions # ============================================================================= # Print help message print_help() { echo "Usage: $0 [OPTIONS]" echo "" echo "Environment Variables:" echo " KUBECONFIG_DATA Kubernetes config data (base64 encoded)" echo " KUBERNETES_URL Kubernetes API URL (default: https://kubernetes.default.svc)" echo " KUBERNETES_NAMESPACE Kubernetes namespace (default: default)" echo " KUBERNETES_INGRESS_HOST Ingress host (default: stats-api.example.com)" echo " CONTAINER_REGISTRY_URL Container registry URL (default: 127.0.0.1)" echo " CONTAINER_REGISTRY_USERNAME Registry username" echo " CONTAINER_REGISTRY_PASSWORD Registry password" echo " CONTAINER_IMAGE_NAME Image name (default: stats-api)" echo " CONTAINER_IMAGE_TAG Image tag (default: latest)" echo " DATABASE_DSN Database connection string" echo "" echo "Commands:" echo " deploy Deploy application to Kubernetes" echo " help Show this help message (default)" } # Setup kubectl configuration setup_kubectl() { echo "Setting up kubectl configuration..." if [ -z "${KUBECONFIG_DATA}" ]; then echo "✗ KUBECONFIG_DATA is not set" return 1 fi mkdir -p ~/.kube echo "${KUBECONFIG_DATA}" | base64 -d > ~/.kube/config chmod 600 ~/.kube/config echo "✓ kubectl configured" return 0 } # Create namespace if it doesn't exist create_namespace() { echo "Checking namespace: ${KUBERNETES_NAMESPACE}" kubectl get namespace "${KUBERNETES_NAMESPACE}" &> /dev/null if [ $? -ne 0 ]; then echo "Creating namespace: ${KUBERNETES_NAMESPACE}" kubectl create namespace "${KUBERNETES_NAMESPACE}" else echo "✓ Namespace exists: ${KUBERNETES_NAMESPACE}" fi } # Create image pull secret create_image_pull_secret() { echo "Creating image pull secret..." kubectl create secret docker-registry regcred \ --docker-server="${CONTAINER_REGISTRY_URL}" \ --docker-username="${CONTAINER_REGISTRY_USERNAME}" \ --docker-password="${CONTAINER_REGISTRY_PASSWORD}" \ --namespace="${KUBERNETES_NAMESPACE}" \ --dry-run=client -o yaml | kubectl apply -f - echo "✓ Image pull secret created/updated" } # Deploy to Kubernetes deploy_to_kubernetes() { FULL_IMAGE_NAME="${CONTAINER_REGISTRY_URL}/${CONTAINER_REGISTRY_NAMESPACE}/${CONTAINER_IMAGE_NAME}:${CONTAINER_IMAGE_TAG}" echo "==========================================" echo "Deploying to Kubernetes" echo "==========================================" echo "Namespace: ${KUBERNETES_NAMESPACE}" echo "Image: ${FULL_IMAGE_NAME}" echo "Host: ${KUBERNETES_INGRESS_HOST}" echo "Database DSN: ${DATABASE_DSN}" echo "" # Setup kubectl setup_kubectl || return 1 # Create namespace create_namespace || return 1 # Create image pull secret create_image_pull_secret || return 1 # Apply Kubernetes manifests with variable substitution echo "Applying Kubernetes manifests..." export FULL_IMAGE_NAME export KUBERNETES_NAMESPACE export KUBERNETES_INGRESS_HOST export CONTAINER_IMAGE_NAME export DATABASE_DSN for file in script/k8s/*.yaml; do echo "Applying: $(basename $file)" envsubst < "$file" | kubectl apply -f - done echo "" echo "✓ Deployment complete" echo "" echo "Waiting for rollout..." kubectl rollout status deployment/${CONTAINER_IMAGE_NAME} -n ${KUBERNETES_NAMESPACE} --timeout=300s if [ $? -eq 0 ]; then echo "" echo "✓ Application is ready" echo "URL: http://${KUBERNETES_INGRESS_HOST}" return 0 else echo "" echo "✗ Rollout failed or timed out" return 1 fi } # ============================================================================= # Main Script # ============================================================================= case "${1:-help}" in deploy) deploy_to_kubernetes ;; help|*) print_help ;; esac