Files
btpxpress-backend/deploy.sh
2025-10-01 01:37:34 +00:00

295 lines
7.7 KiB
Bash

#!/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 "$@"