Files
wifi-densepose/deploy.sh
2025-06-07 11:44:19 +00:00

319 lines
9.5 KiB
Bash
Executable File

#!/bin/bash
# WiFi-DensePose Deployment Script
# This script orchestrates the complete deployment of WiFi-DensePose infrastructure
set -euo pipefail
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_NAME="wifi-densepose"
ENVIRONMENT="${ENVIRONMENT:-production}"
AWS_REGION="${AWS_REGION:-us-west-2}"
KUBECONFIG_PATH="${KUBECONFIG_PATH:-~/.kube/config}"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Logging functions
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Check prerequisites
check_prerequisites() {
log_info "Checking prerequisites..."
local missing_tools=()
# Check required tools
for tool in aws kubectl helm terraform docker; do
if ! command -v "$tool" &> /dev/null; then
missing_tools+=("$tool")
fi
done
if [ ${#missing_tools[@]} -ne 0 ]; then
log_error "Missing required tools: ${missing_tools[*]}"
log_info "Please install the missing tools and try again."
exit 1
fi
# Check AWS credentials
if ! aws sts get-caller-identity &> /dev/null; then
log_error "AWS credentials not configured or invalid"
log_info "Please configure AWS credentials using 'aws configure' or environment variables"
exit 1
fi
# Check Docker daemon
if ! docker info &> /dev/null; then
log_error "Docker daemon is not running"
log_info "Please start Docker daemon and try again"
exit 1
fi
log_success "All prerequisites satisfied"
}
# Deploy infrastructure with Terraform
deploy_infrastructure() {
log_info "Deploying infrastructure with Terraform..."
cd "${SCRIPT_DIR}/terraform"
# Initialize Terraform
log_info "Initializing Terraform..."
terraform init
# Plan deployment
log_info "Planning Terraform deployment..."
terraform plan -var="environment=${ENVIRONMENT}" -var="aws_region=${AWS_REGION}" -out=tfplan
# Apply deployment
log_info "Applying Terraform deployment..."
terraform apply tfplan
# Update kubeconfig
log_info "Updating kubeconfig..."
aws eks update-kubeconfig --region "${AWS_REGION}" --name "${PROJECT_NAME}-cluster"
log_success "Infrastructure deployed successfully"
cd "${SCRIPT_DIR}"
}
# Deploy Kubernetes resources
deploy_kubernetes() {
log_info "Deploying Kubernetes resources..."
# Create namespaces
log_info "Creating namespaces..."
kubectl apply -f k8s/namespace.yaml
# Deploy ConfigMaps and Secrets
log_info "Deploying ConfigMaps and Secrets..."
kubectl apply -f k8s/configmap.yaml
kubectl apply -f k8s/secrets.yaml
# Deploy application
log_info "Deploying application..."
kubectl apply -f k8s/deployment.yaml
kubectl apply -f k8s/service.yaml
kubectl apply -f k8s/ingress.yaml
kubectl apply -f k8s/hpa.yaml
# Wait for deployment to be ready
log_info "Waiting for deployment to be ready..."
kubectl wait --for=condition=available --timeout=300s deployment/wifi-densepose -n wifi-densepose
log_success "Kubernetes resources deployed successfully"
}
# Deploy monitoring stack
deploy_monitoring() {
log_info "Deploying monitoring stack..."
# Add Helm repositories
log_info "Adding Helm repositories..."
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
# Create monitoring namespace
kubectl create namespace monitoring --dry-run=client -o yaml | kubectl apply -f -
# Deploy Prometheus
log_info "Deploying Prometheus..."
helm upgrade --install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--values monitoring/prometheus-values.yaml \
--wait
# Deploy Grafana dashboard
log_info "Deploying Grafana dashboard..."
kubectl create configmap grafana-dashboard \
--from-file=monitoring/grafana-dashboard.json \
--namespace monitoring \
--dry-run=client -o yaml | kubectl apply -f -
# Deploy Fluentd for logging
log_info "Deploying Fluentd..."
kubectl apply -f logging/fluentd-config.yml
log_success "Monitoring stack deployed successfully"
}
# Build and push Docker images
build_and_push_images() {
log_info "Building and pushing Docker images..."
# Get ECR login token
aws ecr get-login-password --region "${AWS_REGION}" | docker login --username AWS --password-stdin "$(aws sts get-caller-identity --query Account --output text).dkr.ecr.${AWS_REGION}.amazonaws.com"
# Build application image
log_info "Building application image..."
docker build -t "${PROJECT_NAME}:latest" .
# Tag and push to ECR
local ecr_repo="$(aws sts get-caller-identity --query Account --output text).dkr.ecr.${AWS_REGION}.amazonaws.com/${PROJECT_NAME}"
docker tag "${PROJECT_NAME}:latest" "${ecr_repo}:latest"
docker tag "${PROJECT_NAME}:latest" "${ecr_repo}:$(git rev-parse --short HEAD)"
log_info "Pushing images to ECR..."
docker push "${ecr_repo}:latest"
docker push "${ecr_repo}:$(git rev-parse --short HEAD)"
log_success "Docker images built and pushed successfully"
}
# Run health checks
run_health_checks() {
log_info "Running health checks..."
# Check pod status
log_info "Checking pod status..."
kubectl get pods -n wifi-densepose
# Check service endpoints
log_info "Checking service endpoints..."
kubectl get endpoints -n wifi-densepose
# Check ingress
log_info "Checking ingress..."
kubectl get ingress -n wifi-densepose
# Test application health endpoint
local app_url=$(kubectl get ingress wifi-densepose-ingress -n wifi-densepose -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
if [ -n "$app_url" ]; then
log_info "Testing application health endpoint..."
if curl -f "http://${app_url}/health" &> /dev/null; then
log_success "Application health check passed"
else
log_warning "Application health check failed"
fi
else
log_warning "Ingress URL not available yet"
fi
log_success "Health checks completed"
}
# Configure CI/CD
setup_cicd() {
log_info "Setting up CI/CD pipelines..."
# Create GitHub Actions secrets (if using GitHub)
if [ -d ".git" ] && git remote get-url origin | grep -q "github.com"; then
log_info "GitHub repository detected"
log_info "Please configure the following secrets in your GitHub repository:"
echo " - AWS_ACCESS_KEY_ID"
echo " - AWS_SECRET_ACCESS_KEY"
echo " - KUBE_CONFIG_DATA"
echo " - ECR_REPOSITORY"
fi
# Validate CI/CD files
if [ -f ".github/workflows/ci.yml" ]; then
log_success "GitHub Actions CI workflow found"
fi
if [ -f ".github/workflows/cd.yml" ]; then
log_success "GitHub Actions CD workflow found"
fi
if [ -f ".gitlab-ci.yml" ]; then
log_success "GitLab CI configuration found"
fi
log_success "CI/CD setup completed"
}
# Cleanup function
cleanup() {
log_info "Cleaning up temporary files..."
rm -f terraform/tfplan
}
# Main deployment function
main() {
log_info "Starting WiFi-DensePose deployment..."
log_info "Environment: ${ENVIRONMENT}"
log_info "AWS Region: ${AWS_REGION}"
# Set trap for cleanup
trap cleanup EXIT
# Run deployment steps
check_prerequisites
case "${1:-all}" in
"infrastructure")
deploy_infrastructure
;;
"kubernetes")
deploy_kubernetes
;;
"monitoring")
deploy_monitoring
;;
"images")
build_and_push_images
;;
"health")
run_health_checks
;;
"cicd")
setup_cicd
;;
"all")
deploy_infrastructure
build_and_push_images
deploy_kubernetes
deploy_monitoring
setup_cicd
run_health_checks
;;
*)
log_error "Unknown deployment target: $1"
log_info "Usage: $0 [infrastructure|kubernetes|monitoring|images|health|cicd|all]"
exit 1
;;
esac
log_success "WiFi-DensePose deployment completed successfully!"
# Display useful information
echo ""
log_info "Useful commands:"
echo " kubectl get pods -n wifi-densepose"
echo " kubectl logs -f deployment/wifi-densepose -n wifi-densepose"
echo " kubectl port-forward svc/grafana 3000:80 -n monitoring"
echo " kubectl port-forward svc/prometheus-server 9090:80 -n monitoring"
echo ""
# Display access URLs
local ingress_url=$(kubectl get ingress wifi-densepose-ingress -n wifi-densepose -o jsonpath='{.status.loadBalancer.ingress[0].hostname}' 2>/dev/null || echo "Not available yet")
log_info "Application URL: http://${ingress_url}"
local grafana_url=$(kubectl get ingress grafana -n monitoring -o jsonpath='{.status.loadBalancer.ingress[0].hostname}' 2>/dev/null || echo "Use port-forward")
log_info "Grafana URL: http://${grafana_url}"
}
# Run main function with all arguments
main "$@"