#!/bin/bash # Script de génération iOS pour GEOSECTOR # Usage: ./ios.sh set -e # Arrêter le script en cas d'erreur # Couleurs pour les messages RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Configuration Mac mini MAC_MINI_IP="192.168.1.34" MAC_USER="pierre" # Fonction pour afficher les messages print_message() { echo -e "${BLUE}[INFO]${NC} $1" } print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } # Fonction pour gérer les erreurs handle_error() { print_error "Une erreur est survenue lors de l'exécution de la commande" print_error "Ligne $1" exit 1 } # Trap pour capturer les erreurs trap 'handle_error $LINENO' ERR # Vérifier que nous sommes dans le bon dossier if [ ! -f "pubspec.yaml" ]; then print_error "Ce script doit être exécuté depuis le dossier racine de l'application Flutter" print_error "Fichier pubspec.yaml introuvable" exit 1 fi print_message "=========================================" print_message " GEOSECTOR - Génération iOS" print_message "=========================================" echo # Vérifier que Flutter est installé if ! command -v flutter &> /dev/null; then print_error "Flutter n'est pas installé ou n'est pas dans le PATH" exit 1 fi # Étape 1 : Synchroniser la version depuis ../VERSION print_message "Étape 1/4 : Synchronisation de la version..." echo VERSION_FILE="../VERSION" if [ ! -f "$VERSION_FILE" ]; then print_error "Fichier VERSION introuvable : $VERSION_FILE" exit 1 fi # Lire la version depuis le fichier (enlever espaces/retours à la ligne) VERSION_NUMBER=$(cat "$VERSION_FILE" | tr -d '\n\r ' | tr -d '[:space:]') if [ -z "$VERSION_NUMBER" ]; then print_error "Le fichier VERSION est vide" exit 1 fi print_message "Version lue depuis $VERSION_FILE : $VERSION_NUMBER" # Calculer le versionCode (supprimer les points) VERSION_CODE=$(echo $VERSION_NUMBER | tr -d '.') if [ -z "$VERSION_CODE" ]; then print_error "Impossible de calculer le versionCode" exit 1 fi print_message "Version code calculé : $VERSION_CODE" # Mettre à jour pubspec.yaml print_message "Mise à jour de pubspec.yaml..." sed -i.bak "s/^version:.*/version: $VERSION_NUMBER+$VERSION_CODE/" pubspec.yaml # Vérifier que la mise à jour a réussi UPDATED_VERSION=$(grep "^version:" pubspec.yaml | sed 's/version: //') if [ "$UPDATED_VERSION" != "$VERSION_NUMBER+$VERSION_CODE" ]; then print_error "Échec de la mise à jour de pubspec.yaml" print_error "Attendu : $VERSION_NUMBER+$VERSION_CODE" print_error "Obtenu : $UPDATED_VERSION" exit 1 fi print_success "pubspec.yaml mis à jour : version: $VERSION_NUMBER+$VERSION_CODE" echo # Récupérer la version finale pour l'affichage VERSION="$VERSION_NUMBER-$VERSION_CODE" print_message "Version finale : $VERSION" print_message "Version code : $VERSION_CODE" echo # Étape 2 : Vérifier la connexion au Mac mini print_message "Étape 2/4 : Vérification de la connexion au Mac mini..." echo print_message "Test de connexion à $MAC_USER@$MAC_MINI_IP..." if ssh -o ConnectTimeout=5 -o BatchMode=yes "$MAC_USER@$MAC_MINI_IP" exit 2>/dev/null; then print_success "Connexion SSH au Mac mini établie" else print_warning "Impossible de se connecter au Mac mini en mode non-interactif" print_message "Le transfert demandera votre mot de passe" fi echo # Étape 3 : Nettoyer le projet print_message "Étape 3/4 : Nettoyage du projet local..." echo print_message "Nettoyage en cours..." flutter clean print_success "Projet nettoyé" echo # Étape 4 : Transfert vers Mac mini print_message "Étape 4/4 : Transfert vers Mac mini..." echo # Construire le chemin de destination avec numéro de version DESTINATION_DIR="app_$VERSION_CODE" DESTINATION="$MAC_USER@$MAC_MINI_IP:/Users/pierre/dev/geosector/$DESTINATION_DIR" print_message "Configuration du transfert :" print_message " Source : $(pwd)" print_message " Destination : $DESTINATION" echo # Supprimer le dossier de destination s'il existe déjà print_message "Suppression du dossier existant sur le Mac mini (si présent)..." ssh -o IdentitiesOnly=yes -o PubkeyAuthentication=no -o PreferredAuthentications=password \ "$MAC_USER@$MAC_MINI_IP" "rm -rf /Users/pierre/dev/geosector/$DESTINATION_DIR" 2>/dev/null || true print_success "Dossier nettoyé" echo print_warning "Note: Vous allez devoir saisir le mot de passe du Mac mini" print_message "rsync va créer le dossier de destination automatiquement" echo # Transfert réel (rsync créera le dossier automatiquement) # Options SSH pour éviter "too many authentication failures" rsync -avz --progress \ -e "ssh -o IdentitiesOnly=yes -o PubkeyAuthentication=no -o PreferredAuthentications=password" \ --rsync-path="mkdir -p /Users/pierre/dev/geosector/$DESTINATION_DIR && rsync" \ --exclude='build/' \ --exclude='.dart_tool/' \ --exclude='ios/Pods/' \ --exclude='ios/.symlinks/' \ --exclude='macos/Pods/' \ --exclude='linux/flutter/ephemeral/' \ --exclude='windows/flutter/ephemeral/' \ --exclude='.pub-cache/' \ --exclude='android/build/' \ --exclude='*.aab' \ --exclude='*.apk' \ ./ "$DESTINATION/" if [ $? -eq 0 ]; then echo print_success "Transfert terminé avec succès !" echo else print_error "Erreur lors du transfert" exit 1 fi # Afficher le résumé echo print_message "=========================================" print_success " TRANSFERT TERMINÉ AVEC SUCCÈS !" print_message "=========================================" echo print_message "Version : ${GREEN}$VERSION${NC}" print_message "Dossier sur le Mac : ${GREEN}/Users/pierre/dev/geosector/$DESTINATION_DIR${NC}" echo # Proposer de lancer le build automatiquement print_message "Voulez-vous lancer le build iOS maintenant ?" echo print_message " ${GREEN}[A]${NC} Se connecter en SSH et lancer le build automatiquement" print_message " ${YELLOW}[B]${NC} Afficher les instructions manuelles (défaut)" echo read -p "Votre choix (A/B) [défaut: B] : " -n 1 -r BUILD_CHOICE echo echo if [[ $BUILD_CHOICE =~ ^[Aa]$ ]]; then print_message "Connexion au Mac mini et lancement du build..." echo # Se connecter en SSH et lancer le build # Options SSH pour éviter "too many authentication failures" ssh -t -o IdentitiesOnly=yes -o PubkeyAuthentication=no -o PreferredAuthentications=password \ "$MAC_USER@$MAC_MINI_IP" "cd /Users/pierre/dev/geosector/$DESTINATION_DIR && ./ios-build-mac.sh" echo print_success "Build terminé sur le Mac mini" echo print_message "Prochaines étapes sur le Mac mini :" print_message "1. Xcode est maintenant ouvert" print_message "2. Vérifier Signing & Capabilities (Team: 6WT84NWCTC)" print_message "3. Product > Archive" print_message "4. Organizer > Distribute App > App Store Connect" else print_message "=========================================" print_message " INSTRUCTIONS MANUELLES" print_message "=========================================" echo print_message "Sur votre Mac mini, exécutez les commandes suivantes :" echo echo -e "${YELLOW}# Se connecter au Mac mini${NC}" echo "ssh $MAC_USER@$MAC_MINI_IP" echo echo -e "${YELLOW}# Aller dans le dossier du projet${NC}" echo "cd /Users/pierre/dev/geosector/$DESTINATION_DIR" echo echo -e "${YELLOW}# Lancer le build iOS${NC}" echo "./ios-build-mac.sh" echo print_message "=========================================" echo print_message "Ou copiez-collez cette commande complète :" echo echo -e "${GREEN}ssh -t $MAC_USER@$MAC_MINI_IP \"cd /Users/pierre/dev/geosector/$DESTINATION_DIR && ./ios-build-mac.sh\"${NC}" fi echo print_success "Script terminé !"