174 lines
4.5 KiB
Bash
Executable File
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
|