#!/bin/bash # 🚀 Script de déploiement automatisé BTPXpress Server # Auteur: BTPXpress Team # Version: 1.0.0 set -e # Arrêter en cas d'erreur # 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 # Configuration APP_NAME="btpxpress-server" VERSION="1.0.0" DOCKER_IMAGE="$APP_NAME:$VERSION" DOCKER_REGISTRY="registry.lions.dev" NAMESPACE="btpxpress" # Fonctions utilitaires 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érification des prérequis check_prerequisites() { log_info "Vérification des prérequis..." # Vérifier Java if ! command -v java &> /dev/null; then log_error "Java n'est pas installé" exit 1 fi # Vérifier Maven if ! command -v mvn &> /dev/null; then log_error "Maven n'est pas installé" exit 1 fi # Vérifier Docker if ! command -v docker &> /dev/null; then log_error "Docker n'est pas installé" exit 1 fi log_success "Tous les prérequis sont satisfaits" } # Exécution des tests run_tests() { log_info "Exécution des tests..." # Tests unitaires log_info "Exécution des tests unitaires..." mvn test -Punit-tests-only -q if [ $? -eq 0 ]; then log_success "Tests unitaires réussis" else log_error "Échec des tests unitaires" exit 1 fi # Tests d'intégration log_info "Exécution des tests d'intégration..." mvn test -Pintegration-tests -q if [ $? -eq 0 ]; then log_success "Tests d'intégration réussis" else log_warning "Certains tests d'intégration ont échoué, mais le déploiement continue" fi } # Construction de l'application build_application() { log_info "Construction de l'application..." # Nettoyage mvn clean -q # Compilation et packaging mvn package -DskipTests -q if [ $? -eq 0 ]; then log_success "Application construite avec succès" else log_error "Échec de la construction" exit 1 fi } # Construction de l'image Docker build_docker_image() { log_info "Construction de l'image Docker..." # Construction de l'image JVM docker build -f src/main/docker/Dockerfile.jvm -t $DOCKER_IMAGE . if [ $? -eq 0 ]; then log_success "Image Docker construite: $DOCKER_IMAGE" else log_error "Échec de la construction Docker" exit 1 fi # Tag pour le registry docker tag $DOCKER_IMAGE $DOCKER_REGISTRY/$DOCKER_IMAGE log_success "Image taguée pour le registry: $DOCKER_REGISTRY/$DOCKER_IMAGE" } # Déploiement local deploy_local() { log_info "Déploiement local avec Docker Compose..." # Arrêter les conteneurs existants docker-compose down 2>/dev/null || true # Démarrer les services docker-compose up -d if [ $? -eq 0 ]; then log_success "Application déployée localement" log_info "Application accessible sur: http://localhost:8080" log_info "Swagger UI: http://localhost:8080/q/swagger-ui" log_info "Health Check: http://localhost:8080/q/health" else log_error "Échec du déploiement local" exit 1 fi } # Déploiement en production deploy_production() { log_info "Déploiement en production..." # Push de l'image vers le registry log_info "Push de l'image vers le registry..." docker push $DOCKER_REGISTRY/$DOCKER_IMAGE if [ $? -eq 0 ]; then log_success "Image poussée vers le registry" else log_error "Échec du push vers le registry" exit 1 fi # Déploiement Kubernetes (si disponible) if command -v kubectl &> /dev/null; then log_info "Déploiement Kubernetes..." kubectl set image deployment/$APP_NAME $APP_NAME=$DOCKER_REGISTRY/$DOCKER_IMAGE -n $NAMESPACE kubectl rollout status deployment/$APP_NAME -n $NAMESPACE log_success "Déploiement Kubernetes terminé" else log_warning "kubectl non disponible, déploiement Kubernetes ignoré" fi } # Vérification de santé health_check() { log_info "Vérification de santé de l'application..." local max_attempts=30 local attempt=1 while [ $attempt -le $max_attempts ]; do if curl -f http://localhost:8080/q/health >/dev/null 2>&1; then log_success "Application en bonne santé" return 0 fi log_info "Tentative $attempt/$max_attempts - En attente de l'application..." sleep 2 ((attempt++)) done log_error "L'application ne répond pas après $max_attempts tentatives" return 1 } # Nettoyage cleanup() { log_info "Nettoyage des ressources temporaires..." # Supprimer les images Docker non utilisées docker image prune -f >/dev/null 2>&1 || true log_success "Nettoyage terminé" } # Affichage de l'aide show_help() { echo "🏗️ Script de déploiement BTPXpress Server" echo "" echo "Usage: $0 [OPTION]" echo "" echo "Options:" echo " local Déploiement local avec Docker Compose" echo " prod Déploiement en production" echo " test Exécution des tests uniquement" echo " build Construction de l'application uniquement" echo " docker Construction de l'image Docker uniquement" echo " health Vérification de santé uniquement" echo " clean Nettoyage des ressources" echo " help Afficher cette aide" echo "" echo "Exemples:" echo " $0 local # Déploiement local complet" echo " $0 prod # Déploiement en production" echo " $0 test # Tests uniquement" } # Fonction principale main() { local command=${1:-"local"} case $command in "local") log_info "🚀 Démarrage du déploiement local..." check_prerequisites run_tests build_application build_docker_image deploy_local health_check cleanup log_success "✅ Déploiement local terminé avec succès!" ;; "prod") log_info "🚀 Démarrage du déploiement en production..." check_prerequisites run_tests build_application build_docker_image deploy_production cleanup log_success "✅ Déploiement en production terminé avec succès!" ;; "test") log_info "🧪 Exécution des tests..." check_prerequisites run_tests log_success "✅ Tests terminés avec succès!" ;; "build") log_info "🔨 Construction de l'application..." check_prerequisites build_application log_success "✅ Construction terminée avec succès!" ;; "docker") log_info "🐳 Construction de l'image Docker..." check_prerequisites build_docker_image log_success "✅ Image Docker construite avec succès!" ;; "health") log_info "🏥 Vérification de santé..." health_check ;; "clean") log_info "🧹 Nettoyage..." cleanup ;; "help"|"-h"|"--help") show_help ;; *) log_error "Commande inconnue: $command" show_help exit 1 ;; esac } # Gestion des signaux trap cleanup EXIT # Exécution main "$@"