Files
paragliding/ship.sh
2026-01-03 14:16:16 -08:00

174 lines
4.5 KiB
Bash
Executable File

#!/bin/bash
set -e
# Paragliding Build & Deploy Script
REGISTRY="harbor.scottyah.com"
NAMESPACE="scottyah"
K8S_NAMESPACE="paragliding"
API_IMAGE="${REGISTRY}/${NAMESPACE}/paragliding-api"
WEB_IMAGE="${REGISTRY}/${NAMESPACE}/paragliding-web"
# Parse flags
BUILD_ONLY=false
DEPLOY_ONLY=false
API_ONLY=false
WEB_ONLY=false
while [[ $# -gt 0 ]]; do
case $1 in
--build-only)
BUILD_ONLY=true
shift
;;
--deploy-only)
DEPLOY_ONLY=true
shift
;;
--api-only)
API_ONLY=true
shift
;;
--web-only)
WEB_ONLY=true
shift
;;
-h|--help)
echo "Usage: ./ship.sh [OPTIONS]"
echo ""
echo "Build and deploy Paragliding to Kubernetes"
echo ""
echo "Options:"
echo " --build-only Only build and push Docker images"
echo " --deploy-only Only deploy to Kubernetes (skip build)"
echo " --api-only Only build/deploy the API"
echo " --web-only Only build/deploy the web frontend"
echo " -h, --help Show this help message"
echo ""
echo "Examples:"
echo " ./ship.sh # Build and deploy everything"
echo " ./ship.sh --build-only # Only build images"
echo " ./ship.sh --api-only # Only build and deploy API"
exit 0
;;
*)
echo "Unknown option: $1"
echo "Use --help for usage information"
exit 1
;;
esac
done
TIMESTAMP=$(date +%Y%m%d-%H%M%S)
# Detect container runtime
if command -v docker &> /dev/null; then
CONTAINER_CMD="docker"
elif command -v podman &> /dev/null; then
CONTAINER_CMD="podman"
else
echo "❌ Error: Neither docker nor podman found"
exit 1
fi
# BUILD PHASE
if [ "$DEPLOY_ONLY" = false ]; then
echo "🪂 Building Paragliding Docker images..."
echo "Registry: ${REGISTRY}"
echo "Timestamp: ${TIMESTAMP}"
echo "Using: ${CONTAINER_CMD}"
echo ""
# Build API
if [ "$WEB_ONLY" = false ]; then
echo "📦 Building API image..."
${CONTAINER_CMD} build \
--network=host \
-t "${API_IMAGE}:${TIMESTAMP}" \
-t "${API_IMAGE}:latest" \
./backend
echo "🚀 Pushing API images..."
${CONTAINER_CMD} push "${API_IMAGE}:${TIMESTAMP}"
${CONTAINER_CMD} push "${API_IMAGE}:latest"
echo "✅ API image pushed!"
echo ""
fi
# Build Web
if [ "$API_ONLY" = false ]; then
echo "📦 Building Web image..."
${CONTAINER_CMD} build \
--network=host \
-t "${WEB_IMAGE}:${TIMESTAMP}" \
-t "${WEB_IMAGE}:latest" \
--target runner \
./frontend
echo "🚀 Pushing Web images..."
${CONTAINER_CMD} push "${WEB_IMAGE}:${TIMESTAMP}"
${CONTAINER_CMD} push "${WEB_IMAGE}:latest"
echo "✅ Web image pushed!"
echo ""
fi
fi
# DEPLOY PHASE
if [ "$BUILD_ONLY" = false ]; then
echo "🪂 Deploying Paragliding to Kubernetes..."
echo ""
# Create namespace if it doesn't exist
echo "Ensuring namespace exists..."
kubectl create namespace ${K8S_NAMESPACE} --dry-run=client -o yaml | kubectl apply -f -
# Apply Kubernetes configuration
echo "Applying Kubernetes configuration..."
kubectl apply -f k8s.yaml
echo ""
echo "Waiting for namespace to be ready..."
kubectl wait --for=condition=Ready --timeout=10s namespace/${K8S_NAMESPACE} 2>/dev/null || true
# Restart deployments
if [ "$WEB_ONLY" = false ]; then
echo "Restarting API deployment..."
kubectl rollout restart deployment/paragliding-api -n ${K8S_NAMESPACE}
fi
if [ "$API_ONLY" = false ]; then
echo "Restarting Web deployment..."
kubectl rollout restart deployment/paragliding-web -n ${K8S_NAMESPACE}
fi
echo ""
echo "Waiting for rollouts to complete..."
if [ "$WEB_ONLY" = false ]; then
kubectl rollout status deployment/paragliding-api -n ${K8S_NAMESPACE} --timeout=300s
fi
if [ "$API_ONLY" = false ]; then
kubectl rollout status deployment/paragliding-web -n ${K8S_NAMESPACE} --timeout=300s
fi
echo ""
echo "✅ Deployment complete!"
echo ""
echo "📊 Deployment status:"
kubectl get pods -n ${K8S_NAMESPACE}
echo ""
kubectl get svc -n ${K8S_NAMESPACE}
echo ""
kubectl get ingress -n ${K8S_NAMESPACE}
echo ""
echo "🌍 Your site should be available at: https://paragliding.scottyah.com"
echo ""
echo "To view logs:"
echo " kubectl logs -f deployment/paragliding-api -n ${K8S_NAMESPACE}"
echo " kubectl logs -f deployment/paragliding-web -n ${K8S_NAMESPACE}"
echo ""
fi
if [ "$BUILD_ONLY" = false ] && [ "$DEPLOY_ONLY" = false ]; then
echo "✨ Build and deployment complete!"
fi