# 🚀 Guide Fastlane - Déploiement automatisé iOS/Android **Date** : 22/10/2025 **Version actuelle** : 3.4.2 (Build 342) --- ## 📋 Objectif Automatiser 100% du déploiement iOS et Android depuis Debian, sans écran ni manipulation manuelle sur le Mac mini. **Avant** : Transfert manuel + Xcode GUI + 30 min de clics **Après** : 1 commande SSH + 0 supervision --- ## 🎯 Installation ### 1️⃣ Sur le Mac mini (192.168.1.34) - Runtime uniquement ```bash # Connexion SSH ssh pierre@192.168.1.34 # Installer fastlane via Homebrew (recommandé) brew install fastlane # Vérifier l'installation fastlane --version # Activer le partage SSH (si pas déjà fait) # Préférences Système > Partage > Session à distance ``` ### 2️⃣ Sur Debian - Configuration du projet ```bash # Installer Ruby (si pas déjà fait) sudo apt install ruby-full build-essential # Configurer Bundler pour installation locale cd /home/pierre/dev/geosector/app echo "source 'https://rubygems.org'" > Gemfile echo "gem 'fastlane'" >> Gemfile bundle config set --local path 'vendor/bundle' bundle install # Ajouter au .gitignore echo "vendor/bundle" >> .gitignore # Vérifier bundle exec fastlane --version ``` **Important** : Cette installation est à faire **une seule fois par projet Flutter**. Le dossier `fastlane/` est versionné dans Git et transféré avec le code. --- ## ⚙️ Configuration initiale ### 1️⃣ Initialiser fastlane dans le projet (sur Debian) ```bash cd /home/pierre/dev/geosector/app bundle exec fastlane init # Sélectionner : # iOS : Option 2 (Automate beta distribution to TestFlight) # Android : Option 2 (Automate deployment to Google Play) ``` ### 2️⃣ Configurer les credentials **Pour iOS (App Store Connect)** : - Apple ID : votre compte développeur - Team ID : `6WT84NWCTC` - App Identifier : `fr.geosector.app` **Pour Android (Google Play Console)** : - JSON API Key : télécharger depuis Google Play Console > API Access - Package name : `fr.geosector.app` - Keystore : utiliser votre keystore existant ### 3️⃣ Créer le Fastfile Créer `fastlane/Fastfile` avec les lanes iOS et Android : - Lane iOS : clean + build + archive + upload TestFlight - Lane Android : clean + build AAB + upload Play Store ### 4️⃣ Versionner dans Git ```bash # Commit la configuration fastlane git add Gemfile Gemfile.lock fastlane/ .gitignore git commit -m "chore: add fastlane configuration" git push ``` ### 5️⃣ Tester localement ```bash # Transférer vers Mac mini rsync -avz --exclude 'build' --exclude '.dart_tool' . pierre@192.168.1.34:/Users/pierre/dev/geosector/app_342/ # Test iOS sur Mac mini ssh pierre@192.168.1.34 "cd /Users/pierre/dev/geosector/app_342 && fastlane ios release" # Test Android sur Mac mini ssh pierre@192.168.1.34 "cd /Users/pierre/dev/geosector/app_342 && fastlane android release" ``` --- ## 🚀 Utilisation depuis Debian ### Workflow simple ```bash # 1. Transférer le code vers le Mac mini (crée app_342/) cd /home/pierre/dev/geosector/app rsync -avz --exclude 'build' --exclude '.dart_tool' --exclude 'vendor/bundle' . pierre@192.168.1.34:/Users/pierre/dev/geosector/app_342/ # 2. Lancer le build iOS à distance ssh pierre@192.168.1.34 "cd /Users/pierre/dev/geosector/app_342 && fastlane ios release" # 3. Lancer le build Android à distance ssh pierre@192.168.1.34 "cd /Users/pierre/dev/geosector/app_342 && fastlane android release" # 4. Archiver la version après succès ssh pierre@192.168.1.34 "cd /Users/pierre/dev/geosector && zip -r app_342.zip app_342" ``` ### Workflow parallèle (iOS + Android simultané) ```bash # Transfert vers dossier versionné rsync -avz --exclude 'build' --exclude 'vendor/bundle' . pierre@192.168.1.34:/Users/pierre/dev/geosector/app_342/ # Build iOS et Android en parallèle ssh pierre@192.168.1.34 "cd /Users/pierre/dev/geosector/app_342 && fastlane ios release & fastlane android release" ``` ### Créer un script de déploiement Créer `deploy-all.sh` dans le projet : - Étape 1 : rsync vers Mac mini - Étape 2 : fastlane ios release - Étape 3 : fastlane android release - Étape 4 : notification de fin Usage : `./deploy-all.sh` --- ## ⚡ CI/CD avec Gitea Actions ### Objectif Automatiser le déploiement à chaque `git push` sur la branche `main` ou `release`. ### Architecture ``` Gitea (gitea.d6soft.fr) ↓ git push Gitea Actions (workflow) ↓ SSH Mac mini (self-hosted runner) ↓ fastlane App Store Connect + Google Play Console ``` ### Configuration **1. Activer Gitea Actions** - Gitea > Settings > Actions > Enable Actions - Créer un runner sur le Mac mini **2. Installer le runner sur le Mac mini** - Télécharger act_runner depuis Gitea - Enregistrer le runner avec le token Gitea - Lancer le runner en service (launchd) **3. Créer le workflow `.gitea/workflows/deploy.yml`** - Trigger : `push` sur branche `main` ou tag `v*` - Steps : checkout + flutter pub get + fastlane ios release + fastlane android release - Runner : `runs-on: self-hosted` **4. Sécuriser les secrets** - Gitea > Settings > Secrets - Ajouter : APPLE_ID, FASTLANE_PASSWORD, GOOGLE_PLAY_JSON_KEY - Utiliser `${{ secrets.APPLE_ID }}` dans le workflow ### Résultat ```bash # Sur Debian cd /home/pierre/dev/geosector/app git add . git commit -m "feat: nouvelle fonctionnalité" git push origin main # 🤖 Gitea Actions détecte le push # 🏗️ Mac mini build automatiquement # 📤 Upload vers TestFlight + Play Store # ✅ Notification par email/Slack ``` **Zéro action manuelle, déploiement automatique 24/7.** --- ## 📊 Checklist de migration ### Phase 1 : Installation de base - [ ] Fastlane installé sur Mac mini - [ ] Fastfile créé et testé pour iOS - [ ] Fastfile créé et testé pour Android - [ ] Credentials configurés (Apple ID, Google Play) - [ ] Test manuel réussi : `fastlane ios release` - [ ] Test manuel réussi : `fastlane android release` ### Phase 2 : Déploiement distant - [ ] SSH sans mot de passe configuré (clé SSH) - [ ] Script `deploy-all.sh` créé et testé - [ ] Test de déploiement complet depuis Debian - [ ] Validation sur TestFlight + Play Store ### Phase 3 : CI/CD (optionnel mais recommandé) - [ ] Gitea Actions activé sur le dépôt - [ ] Runner installé sur Mac mini - [ ] Workflow `.gitea/workflows/deploy.yml` créé - [ ] Secrets configurés dans Gitea - [ ] Test de déploiement automatique sur `git push` - [ ] Notifications configurées (email/Slack) --- ## 🎯 Gains de productivité | Action | Avant | Après | |--------|-------|-------| | Build iOS | 30 min (manuel + VNC) | 1 commande SSH | | Build Android | 20 min (manuel) | 1 commande SSH | | Upload stores | 10 min (formulaires) | Automatique | | Présence requise | 60 min | 0 min | | Mac mini | Écran + clavier | Headless | | Déploiement | À la demande | Automatique sur git push | **Temps gagné par release : ~60 minutes → 0 minute** --- ## 📚 Ressources - **Fastlane** : https://fastlane.tools - **Gitea Actions** : https://docs.gitea.com/usage/actions/overview - **App Store Connect** : https://appstoreconnect.apple.com - **Google Play Console** : https://play.google.com/console --- ## 🔧 Troubleshooting **Erreur "Could not find action"** → Vérifier que fastlane est dans le PATH du Mac mini **Erreur de signature iOS** → Vérifier que les certificats sont bien installés sur le Mac mini (Xcode > Preferences > Accounts) **Erreur Google Play API** → Vérifier que le JSON key a les bonnes permissions (Admin/Release Manager) **Runner Gitea ne démarre pas** → Vérifier les logs : `journalctl -u gitea-runner -f` --- ✅ **Mac mini headless opérationnel !** 🎉