295 lines
7.7 KiB
Bash
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 "$@"
|