infra/scripts/deploy.sh
2025-08-03 02:44:38 +02:00

243 lines
6.4 KiB
Bash
Executable File

#!/bin/bash
# Script de déploiement Xpeditis
# Usage: ./deploy.sh [environment] [component]
# Environments: dev, staging, prod
# Components: all, backend, frontend, database
set -e
ENVIRONMENT=${1:-dev}
COMPONENT=${2:-all}
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
# Couleurs pour les logs
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
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"
}
# Vérifier les prérequis
check_prerequisites() {
log_info "Vérification des prérequis..."
if ! command -v docker &> /dev/null; then
log_error "Docker n'est pas installé"
exit 1
fi
if ! command -v docker-compose &> /dev/null; then
log_error "Docker Compose n'est pas installé"
exit 1
fi
if [[ "$ENVIRONMENT" == "prod" ]] && ! command -v kubectl &> /dev/null; then
log_error "kubectl n'est pas installé (requis pour la production)"
exit 1
fi
log_success "Prérequis vérifiés"
}
# Déploiement en développement
deploy_dev() {
log_info "Déploiement en environnement de développement..."
cd "$PROJECT_ROOT"
case $COMPONENT in
"all")
docker-compose down
docker-compose up --build -d
;;
"backend")
docker-compose up --build -d backend
;;
"frontend")
docker-compose up --build -d frontend
;;
"database")
docker-compose up -d postgres
;;
*)
log_error "Composant inconnu: $COMPONENT"
exit 1
;;
esac
log_success "Déploiement dev terminé"
log_info "Frontend: http://localhost:3000"
log_info "Backend: http://localhost:8080"
log_info "Base de données: localhost:5432"
}
# Déploiement en staging
deploy_staging() {
log_info "Déploiement en environnement de staging..."
# Build et push des images
build_and_push_images "staging"
# Déploiement Kubernetes
kubectl apply -f "$PROJECT_ROOT/k8s/namespace.yaml"
kubectl apply -f "$PROJECT_ROOT/k8s/" -n xpeditis-staging
log_success "Déploiement staging terminé"
}
# Déploiement en production
deploy_prod() {
log_info "Déploiement en environnement de production..."
# Confirmation utilisateur
read -p "Êtes-vous sûr de vouloir déployer en production? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
log_info "Déploiement annulé"
exit 0
fi
# Build et push des images
build_and_push_images "prod"
# Déploiement Kubernetes
kubectl apply -f "$PROJECT_ROOT/k8s/namespace.yaml"
kubectl apply -f "$PROJECT_ROOT/k8s/" -n xpeditis
# Attendre que les pods soient prêts
kubectl wait --for=condition=ready pod -l app=backend -n xpeditis --timeout=300s
kubectl wait --for=condition=ready pod -l app=frontend -n xpeditis --timeout=300s
log_success "Déploiement production terminé"
log_info "Site web: https://xpeditis.fr"
log_info "API: https://api.xpeditis.fr"
}
# Build et push des images Docker
build_and_push_images() {
local env=$1
log_info "Build et push des images Docker pour $env..."
# Backend
if [[ "$COMPONENT" == "all" || "$COMPONENT" == "backend" ]]; then
log_info "Build de l'image backend..."
docker build -t "xpeditis/backend:$env" "$PROJECT_ROOT/backend"
docker tag "xpeditis/backend:$env" "ghcr.io/your-username/xpeditis/backend:$env"
docker push "ghcr.io/your-username/xpeditis/backend:$env"
fi
# Frontend
if [[ "$COMPONENT" == "all" || "$COMPONENT" == "frontend" ]]; then
log_info "Build de l'image frontend..."
docker build -t "xpeditis/frontend:$env" \
--build-arg VITE_API_URL="https://api.xpeditis.fr" \
--target production \
"$PROJECT_ROOT/frontend"
docker tag "xpeditis/frontend:$env" "ghcr.io/your-username/xpeditis/frontend:$env"
docker push "ghcr.io/your-username/xpeditis/frontend:$env"
fi
log_success "Images Docker buildées et pushées"
}
# Fonction de rollback
rollback() {
log_warning "Rollback en cours..."
if [[ "$ENVIRONMENT" == "dev" ]]; then
docker-compose down
docker-compose up -d
else
kubectl rollout undo deployment/backend -n xpeditis
kubectl rollout undo deployment/frontend -n xpeditis
fi
log_success "Rollback terminé"
}
# Afficher l'aide
show_help() {
echo "Usage: $0 [environment] [component]"
echo ""
echo "Environments:"
echo " dev - Environnement de développement (défaut)"
echo " staging - Environnement de staging"
echo " prod - Environnement de production"
echo ""
echo "Components:"
echo " all - Tous les composants (défaut)"
echo " backend - Backend Spring Boot uniquement"
echo " frontend - Frontend React uniquement"
echo " database - Base de données uniquement"
echo ""
echo "Options:"
echo " --rollback - Effectuer un rollback"
echo " --help - Afficher cette aide"
echo ""
echo "Exemples:"
echo " $0 # Déploiement dev complet"
echo " $0 prod all # Déploiement production complet"
echo " $0 staging backend # Déploiement staging backend uniquement"
echo " $0 --rollback # Rollback"
}
# Point d'entrée principal
main() {
case "${1:-}" in
"--help"|"-h")
show_help
exit 0
;;
"--rollback")
rollback
exit 0
;;
esac
log_info "Démarrage du déploiement Xpeditis"
log_info "Environnement: $ENVIRONMENT"
log_info "Composant: $COMPONENT"
check_prerequisites
case $ENVIRONMENT in
"dev")
deploy_dev
;;
"staging")
deploy_staging
;;
"prod")
deploy_prod
;;
*)
log_error "Environnement inconnu: $ENVIRONMENT"
show_help
exit 1
;;
esac
log_success "Déploiement terminé avec succès!"
}
# Exécuter le script principal
main "$@"