118 lines
3.8 KiB
Bash
Executable File
118 lines
3.8 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Auto-deploy script after GitHub Actions
|
|
# This script can be executed locally or via webhook
|
|
|
|
set -e
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Configuration
|
|
IMAGE_NAME="resource-governance"
|
|
REGISTRY="andersonid"
|
|
NAMESPACE="resource-governance"
|
|
IMAGE_TAG=${1:-latest}
|
|
|
|
echo -e "${BLUE}Auto-Deploy to OpenShift${NC}"
|
|
echo "================================"
|
|
echo "Image: ${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}"
|
|
echo "Namespace: ${NAMESPACE}"
|
|
echo ""
|
|
|
|
# 1. Check OpenShift login
|
|
if ! oc whoami > /dev/null 2>&1; then
|
|
echo -e "${RED}ERROR: Not logged into OpenShift. Please login with 'oc login'.${NC}"
|
|
exit 1
|
|
fi
|
|
echo -e "${GREEN}SUCCESS: Logged into OpenShift as: $(oc whoami)${NC}"
|
|
echo ""
|
|
|
|
# 2. Check if image exists on Docker Hub
|
|
echo -e "${BLUE}Checking image on Docker Hub...${NC}"
|
|
if ! skopeo inspect docker://${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} > /dev/null 2>&1; then
|
|
echo -e "${RED}ERROR: Image ${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} not found on Docker Hub!${NC}"
|
|
exit 1
|
|
fi
|
|
echo -e "${GREEN}SUCCESS: Image found on Docker Hub${NC}"
|
|
echo ""
|
|
|
|
# 3. Check if namespace exists
|
|
if ! oc get namespace ${NAMESPACE} > /dev/null 2>&1; then
|
|
echo -e "${BLUE}Creating namespace ${NAMESPACE}...${NC}"
|
|
oc create namespace ${NAMESPACE}
|
|
else
|
|
echo -e "${GREEN}SUCCESS: Namespace ${NAMESPACE} already exists${NC}"
|
|
fi
|
|
echo ""
|
|
|
|
# 4. Apply basic manifests
|
|
echo -e "${BLUE}Applying basic manifests...${NC}"
|
|
oc apply -f k8s/rbac.yaml -n ${NAMESPACE}
|
|
oc apply -f k8s/configmap.yaml -n ${NAMESPACE}
|
|
echo ""
|
|
|
|
# 5. Check if deployment exists
|
|
if oc get deployment ${IMAGE_NAME} -n ${NAMESPACE} > /dev/null 2>&1; then
|
|
echo -e "${BLUE}Existing deployment found. Starting update...${NC}"
|
|
|
|
# Get current image
|
|
CURRENT_IMAGE=$(oc get deployment ${IMAGE_NAME} -n ${NAMESPACE} -o jsonpath='{.spec.template.spec.containers[0].image}')
|
|
echo "Current image: ${CURRENT_IMAGE}"
|
|
echo "New image: ${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}"
|
|
|
|
# Check if image changed
|
|
if [ "${CURRENT_IMAGE}" = "${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}" ]; then
|
|
echo -e "${YELLOW}WARNING: Image already up to date. No action needed.${NC}"
|
|
exit 0
|
|
fi
|
|
|
|
# Update deployment with new image
|
|
echo -e "${BLUE}Updating deployment image...${NC}"
|
|
oc set image deployment/${IMAGE_NAME} ${IMAGE_NAME}=${REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG} -n ${NAMESPACE}
|
|
|
|
# Wait for rollout
|
|
echo -e "${BLUE}Waiting for rollout (may take a few minutes)...${NC}"
|
|
oc rollout status deployment/${IMAGE_NAME} -n ${NAMESPACE} --timeout=300s
|
|
echo -e "${GREEN}SUCCESS: Rollout completed successfully!${NC}"
|
|
|
|
else
|
|
echo -e "${BLUE}Deployment not found. Creating new deployment...${NC}"
|
|
# Apply deployment, service and route
|
|
oc apply -f k8s/deployment.yaml -n ${NAMESPACE}
|
|
oc apply -f k8s/service.yaml -n ${NAMESPACE}
|
|
oc apply -f k8s/route.yaml -n ${NAMESPACE}
|
|
|
|
# Wait for initial rollout
|
|
echo -e "${BLUE}Waiting for initial rollout...${NC}"
|
|
oc rollout status deployment/${IMAGE_NAME} -n ${NAMESPACE} --timeout=300s
|
|
echo -e "${GREEN}SUCCESS: Initial rollout completed successfully!${NC}"
|
|
fi
|
|
echo ""
|
|
|
|
# 6. Check final status
|
|
echo -e "${BLUE}FINAL STATUS:${NC}"
|
|
echo "================"
|
|
oc get deployment ${IMAGE_NAME} -n ${NAMESPACE}
|
|
echo ""
|
|
oc get pods -n ${NAMESPACE} -l app.kubernetes.io/name=${IMAGE_NAME}
|
|
echo ""
|
|
|
|
# 7. Get access URLs
|
|
ROUTE_URL=$(oc get route ${IMAGE_NAME}-route -n ${NAMESPACE} -o jsonpath='{.spec.host}' 2>/dev/null || echo "")
|
|
echo -e "${BLUE}Access URLs:${NC}"
|
|
if [ -n "$ROUTE_URL" ]; then
|
|
echo " OpenShift: https://$ROUTE_URL"
|
|
else
|
|
echo " OpenShift: Route not found or not available."
|
|
fi
|
|
echo " Port-forward: http://localhost:8080 (if active)"
|
|
echo ""
|
|
|
|
echo -e "${GREEN}SUCCESS: Auto-deploy completed successfully!${NC}"
|
|
echo -e "${BLUE}Strategy: Rolling Update with maxUnavailable=0 (zero downtime)${NC}"
|