fix: Récupérer l'opération active depuis la table operations
- Corrige l'erreur SQL 'Unknown column fk_operation in users' - L'opération active est récupérée depuis operations.chk_active = 1 - Jointure avec users pour filtrer par entité de l'admin créateur - Query: SELECT o.id FROM operations o INNER JOIN users u ON u.fk_entite = o.fk_entite WHERE u.id = ? AND o.chk_active = 1
This commit is contained in:
294
app/android.sh
294
app/android.sh
@@ -39,25 +39,19 @@ handle_error() {
|
||||
# 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
|
||||
# Variables pour IN1 (compilation distante)
|
||||
IN1_HOST="IN1"
|
||||
IN1_PROJECT_PATH="/home/pierre/dev/geosector/app"
|
||||
|
||||
print_message "🖥️ Compilation distante sur IN1:${IN1_PROJECT_PATH}"
|
||||
echo
|
||||
|
||||
print_message "========================================="
|
||||
print_message " GEOSECTOR - Génération Bundle Android"
|
||||
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 0 : Synchroniser la version depuis ../VERSION
|
||||
# Étape 0 : Synchroniser la version depuis ../VERSION (lecture locale via SSHFS)
|
||||
print_message "Étape 0/5 : Synchronisation de la version..."
|
||||
echo
|
||||
|
||||
@@ -230,88 +224,89 @@ if [ "$USE_R8" = true ]; then
|
||||
echo
|
||||
fi
|
||||
|
||||
# Étape 1 : Nettoyer le projet
|
||||
print_message "Étape 1/5 : Nettoyage du projet..."
|
||||
flutter clean
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Projet nettoyé"
|
||||
else
|
||||
print_error "Échec du nettoyage du projet"
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
|
||||
# Étape 2 : Récupérer les dépendances
|
||||
print_message "Étape 2/5 : Récupération des dépendances..."
|
||||
flutter pub get
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Dépendances récupérées"
|
||||
else
|
||||
print_error "Échec de la récupération des dépendances"
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
|
||||
# Étape 2.5 : Patcher nfc_manager pour AGP 8+
|
||||
print_message "Étape 2.5/5 : Patch nfc_manager pour Android Gradle Plugin 8+..."
|
||||
NFC_PATCH_SCRIPT="./fastlane/scripts/commun/fix-nfc-manager.sh"
|
||||
if [ -f "$NFC_PATCH_SCRIPT" ]; then
|
||||
bash "$NFC_PATCH_SCRIPT"
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Patch nfc_manager appliqué"
|
||||
else
|
||||
print_warning "Le patch nfc_manager a échoué (peut être déjà appliqué)"
|
||||
fi
|
||||
else
|
||||
print_warning "Script de patch nfc_manager introuvable : $NFC_PATCH_SCRIPT"
|
||||
fi
|
||||
echo
|
||||
|
||||
# Étape 3 : Analyser le code (optionnel mais recommandé)
|
||||
print_message "Étape 3/5 : Analyse du code Dart..."
|
||||
flutter analyze --no-fatal-infos --no-fatal-warnings || {
|
||||
print_warning "Des avertissements ont été détectés dans le code"
|
||||
read -p "Voulez-vous continuer malgré les avertissements ? (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
print_message "Génération annulée par l'utilisateur"
|
||||
exit 0
|
||||
fi
|
||||
}
|
||||
print_success "Analyse du code terminée"
|
||||
echo
|
||||
|
||||
# Étape 4 : Générer le bundle
|
||||
print_message "Étape 4/5 : Génération du bundle Android..."
|
||||
# Lancer le build sur IN1 via SSH
|
||||
print_message "🚀 Lancement du build Android sur IN1..."
|
||||
print_message "Cette opération peut prendre plusieurs minutes..."
|
||||
flutter build appbundle $BUILD_MODE_FLAG
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Bundle généré avec succès"
|
||||
else
|
||||
print_error "Échec de la génération du bundle"
|
||||
exit 1
|
||||
fi
|
||||
echo
|
||||
|
||||
# Restaurer le build.gradle.kts original si modifié
|
||||
if [ "$USE_R8" = true ] && [ -f "$GRADLE_BACKUP" ]; then
|
||||
print_message "Restauration du build.gradle.kts original..."
|
||||
mv "$GRADLE_BACKUP" "$GRADLE_FILE"
|
||||
print_success "Fichier restauré"
|
||||
echo
|
||||
ssh ${IN1_HOST} "bash -l -s" <<REMOTE_SCRIPT || { print_error "Remote build failed on IN1"; exit 1; }
|
||||
set -euo pipefail
|
||||
|
||||
# Charger le profil utilisateur pour avoir Flutter dans le PATH
|
||||
if [ -f ~/.bashrc ]; then
|
||||
source ~/.bashrc
|
||||
fi
|
||||
if [ -f ~/.profile ]; then
|
||||
source ~/.profile
|
||||
fi
|
||||
|
||||
# Vérifier que le bundle a été créé
|
||||
cd ${IN1_PROJECT_PATH}
|
||||
|
||||
echo "[IN1] Starting Android build process..."
|
||||
|
||||
# Variables transmises
|
||||
VERSION_NUMBER="${VERSION_NUMBER}"
|
||||
VERSION_CODE="${VERSION_CODE}"
|
||||
BUILD_MODE_FLAG="${BUILD_MODE_FLAG}"
|
||||
MODE_SUFFIX="${MODE_SUFFIX}"
|
||||
USE_R8="${USE_R8}"
|
||||
GRADLE_FILE="android/app/build.gradle.kts"
|
||||
GRADLE_BACKUP="android/app/build.gradle.kts.backup"
|
||||
|
||||
# Mise à jour de pubspec.yaml
|
||||
echo "[IN1] Updating pubspec.yaml to version \${VERSION_NUMBER}+\${VERSION_CODE}..."
|
||||
sed -i.bak "s/^version:.*/version: \${VERSION_NUMBER}+\${VERSION_CODE}/" pubspec.yaml
|
||||
|
||||
# Activer R8 si demandé
|
||||
if [ "\$USE_R8" = "true" ]; then
|
||||
echo "[IN1] Enabling R8/ProGuard..."
|
||||
cp "\$GRADLE_FILE" "\$GRADLE_BACKUP"
|
||||
sed -i.tmp 's/isMinifyEnabled = false/isMinifyEnabled = true/' "\$GRADLE_FILE"
|
||||
sed -i.tmp 's/isShrinkResources = false/isShrinkResources = true/' "\$GRADLE_FILE"
|
||||
rm -f "\${GRADLE_FILE}.tmp"
|
||||
fi
|
||||
|
||||
# Étape 1 : Nettoyer
|
||||
echo "[IN1] Step 1/5: Cleaning project..."
|
||||
flutter clean
|
||||
|
||||
# Étape 2 : Dépendances
|
||||
echo "[IN1] Step 2/5: Getting dependencies..."
|
||||
flutter pub get
|
||||
|
||||
# Étape 2.5 : Patch nfc_manager
|
||||
echo "[IN1] Step 2.5/5: Patching nfc_manager..."
|
||||
./fastlane/scripts/commun/fix-nfc-manager.sh || echo "[IN1] Warning: nfc_manager patch failed"
|
||||
|
||||
# Étape 3 : Analyse (optionnel)
|
||||
echo "[IN1] Step 3/5: Analyzing code..."
|
||||
flutter analyze --no-fatal-infos --no-fatal-warnings || echo "[IN1] Warning: Code analysis had warnings"
|
||||
|
||||
# Étape 4 : Build bundle
|
||||
echo "[IN1] Step 4/5: Building Android App Bundle..."
|
||||
flutter build appbundle \$BUILD_MODE_FLAG
|
||||
|
||||
# Restaurer gradle si modifié
|
||||
if [ "\$USE_R8" = "true" ] && [ -f "\$GRADLE_BACKUP" ]; then
|
||||
echo "[IN1] Restoring original build.gradle.kts..."
|
||||
mv "\$GRADLE_BACKUP" "\$GRADLE_FILE"
|
||||
fi
|
||||
|
||||
echo "[IN1] Build completed successfully!"
|
||||
REMOTE_SCRIPT
|
||||
|
||||
print_success "Build Android terminé sur IN1"
|
||||
echo
|
||||
|
||||
# Télécharger le bundle depuis IN1
|
||||
BUNDLE_PATH="build/app/outputs/bundle/$MODE_SUFFIX/app-$MODE_SUFFIX.aab"
|
||||
if [ ! -f "$BUNDLE_PATH" ]; then
|
||||
print_error "Bundle introuvable à l'emplacement attendu : $BUNDLE_PATH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Copier le bundle à la racine avec le nouveau nom
|
||||
FINAL_NAME="geosector-$VERSION_CODE-$MODE_SUFFIX.aab"
|
||||
print_message "Copie du bundle vers : $FINAL_NAME"
|
||||
cp "$BUNDLE_PATH" "$FINAL_NAME"
|
||||
|
||||
print_message "📥 Téléchargement du bundle depuis IN1..."
|
||||
scp ${IN1_HOST}:${IN1_PROJECT_PATH}/${BUNDLE_PATH} "$FINAL_NAME" || {
|
||||
print_error "Failed to download bundle from IN1"
|
||||
exit 1
|
||||
}
|
||||
|
||||
if [ -f "$FINAL_NAME" ]; then
|
||||
print_success "Bundle copié avec succès"
|
||||
@@ -324,10 +319,10 @@ else
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Copier les fichiers de débogage si Option A sélectionnée
|
||||
# Télécharger les fichiers de débogage si Option A sélectionnée
|
||||
if [ "$COPY_DEBUG_FILES" = true ]; then
|
||||
echo
|
||||
print_message "Copie des fichiers de débogage pour Google Play Console..."
|
||||
print_message "📥 Téléchargement des fichiers de débogage depuis IN1..."
|
||||
|
||||
# Créer un dossier de release
|
||||
RELEASE_DIR="release-$VERSION_CODE"
|
||||
@@ -336,28 +331,31 @@ if [ "$COPY_DEBUG_FILES" = true ]; then
|
||||
# Copier le bundle
|
||||
cp "$FINAL_NAME" "$RELEASE_DIR/"
|
||||
|
||||
# Copier le fichier mapping.txt (R8/ProGuard)
|
||||
# Télécharger le fichier mapping.txt (R8/ProGuard)
|
||||
MAPPING_FILE="build/app/outputs/mapping/release/mapping.txt"
|
||||
if [ -f "$MAPPING_FILE" ]; then
|
||||
cp "$MAPPING_FILE" "$RELEASE_DIR/mapping.txt"
|
||||
print_success "Fichier mapping.txt copié"
|
||||
else
|
||||
print_warning "Fichier mapping.txt introuvable (peut être normal)"
|
||||
fi
|
||||
print_message "Downloading mapping.txt..."
|
||||
scp ${IN1_HOST}:${IN1_PROJECT_PATH}/${MAPPING_FILE} "$RELEASE_DIR/mapping.txt" 2>/dev/null && {
|
||||
print_success "Fichier mapping.txt téléchargé"
|
||||
} || {
|
||||
print_warning "Fichier mapping.txt introuvable sur IN1 (peut être normal)"
|
||||
}
|
||||
|
||||
# Copier les symboles natifs
|
||||
SYMBOLS_ZIP="build/app/intermediates/merged_native_libs/release/out/lib"
|
||||
if [ -d "$SYMBOLS_ZIP" ]; then
|
||||
# Créer une archive des symboles
|
||||
cd build/app/intermediates/merged_native_libs/release/out
|
||||
zip -r "../../../../../../$RELEASE_DIR/native-symbols.zip" lib/
|
||||
cd - > /dev/null
|
||||
print_success "Symboles natifs archivés"
|
||||
else
|
||||
# Créer l'archive des symboles natifs sur IN1 et la télécharger
|
||||
print_message "Creating and downloading native symbols..."
|
||||
ssh ${IN1_HOST} "bash -l -c '
|
||||
cd ${IN1_PROJECT_PATH}/build/app/intermediates/merged_native_libs/release/out 2>/dev/null &&
|
||||
zip -r /tmp/native-symbols-$VERSION_CODE.zip lib/ &&
|
||||
echo \"Symbols archived\"
|
||||
'" 2>/dev/null && {
|
||||
scp ${IN1_HOST}:/tmp/native-symbols-$VERSION_CODE.zip "$RELEASE_DIR/native-symbols.zip" && {
|
||||
print_success "Symboles natifs téléchargés"
|
||||
ssh ${IN1_HOST} "rm -f /tmp/native-symbols-$VERSION_CODE.zip"
|
||||
}
|
||||
} || {
|
||||
print_warning "Symboles natifs introuvables (peut être normal)"
|
||||
fi
|
||||
}
|
||||
|
||||
print_success "Fichiers de débogage copiés dans : $RELEASE_DIR/"
|
||||
print_success "Fichiers de débogage dans : $RELEASE_DIR/"
|
||||
echo
|
||||
print_message "Pour uploader sur Google Play Console :"
|
||||
print_message "1. Bundle : $RELEASE_DIR/$FINAL_NAME"
|
||||
@@ -410,48 +408,80 @@ echo
|
||||
read -p "Voulez-vous aussi générer l'APK pour des tests ? (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
print_message "Génération de l'APK..."
|
||||
flutter build apk $BUILD_MODE_FLAG
|
||||
print_message "Génération de l'APK sur IN1..."
|
||||
|
||||
ssh ${IN1_HOST} "bash -l -s" <<REMOTE_APK_SCRIPT || { print_error "Remote APK build failed"; }
|
||||
set -euo pipefail
|
||||
if [ -f ~/.bashrc ]; then source ~/.bashrc; fi
|
||||
if [ -f ~/.profile ]; then source ~/.profile; fi
|
||||
cd ${IN1_PROJECT_PATH}
|
||||
echo "[IN1] Building APK..."
|
||||
flutter build apk ${BUILD_MODE_FLAG}
|
||||
REMOTE_APK_SCRIPT
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
APK_PATH="build/app/outputs/flutter-apk/app-$MODE_SUFFIX.apk"
|
||||
if [ -f "$APK_PATH" ]; then
|
||||
APK_NAME="geosector-$VERSION_CODE-$MODE_SUFFIX.apk"
|
||||
cp "$APK_PATH" "$APK_NAME"
|
||||
print_success "APK généré : $APK_NAME"
|
||||
APK_NAME="geosector-$VERSION_CODE-$MODE_SUFFIX.apk"
|
||||
|
||||
print_message "📥 Téléchargement de l'APK depuis IN1..."
|
||||
scp ${IN1_HOST}:${IN1_PROJECT_PATH}/${APK_PATH} "$APK_NAME" || {
|
||||
print_error "Failed to download APK from IN1"
|
||||
}
|
||||
|
||||
if [ -f "$APK_NAME" ]; then
|
||||
print_success "APK téléchargé : $APK_NAME"
|
||||
|
||||
# Afficher la taille de l'APK
|
||||
APK_SIZE=$(du -h "$APK_NAME" | cut -f1)
|
||||
print_message "Taille de l'APK : $APK_SIZE"
|
||||
|
||||
# Si mode Debug, proposer installation automatique
|
||||
# Si mode Debug, proposer installation automatique (sur machine locale)
|
||||
if [ "$BUILD_MODE_FLAG" = "--debug" ]; then
|
||||
echo
|
||||
read -p "Installer l'APK debug sur l'appareil connecté ? (y/n) " -n 1 -r
|
||||
print_message "💡 L'APK est maintenant disponible localement : $APK_NAME"
|
||||
read -p "Installer l'APK debug sur l'appareil connecté à CE poste ? (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
print_message "Désinstallation de l'ancienne version..."
|
||||
adb uninstall fr.geosector.app3 2>/dev/null || print_warning "Aucune version précédente trouvée"
|
||||
print_message "Installation sur l'appareil..."
|
||||
adb install "$APK_NAME"
|
||||
# Vérifier qu'ADB est disponible localement
|
||||
if ! command -v adb &> /dev/null; then
|
||||
print_error "ADB n'est pas installé sur ce poste"
|
||||
print_message "Installez Android SDK Platform Tools"
|
||||
else
|
||||
# Vérifier qu'un appareil est connecté
|
||||
print_message "Vérification des appareils connectés..."
|
||||
DEVICES=$(adb devices | grep -v "List" | grep "device$" | wc -l)
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "APK installé avec succès"
|
||||
if [ "$DEVICES" -eq 0 ]; then
|
||||
print_error "Aucun appareil Android détecté en USB sur ce poste"
|
||||
print_message "Vérifiez la connexion USB et activez le débogage USB"
|
||||
print_message "Commande : adb devices"
|
||||
else
|
||||
print_success "$DEVICES appareil(s) détecté(s)"
|
||||
print_message "Désinstallation de l'ancienne version..."
|
||||
adb uninstall fr.geosector.app3 2>/dev/null || print_warning "Aucune version précédente trouvée"
|
||||
|
||||
print_message "Installation sur l'appareil..."
|
||||
adb install "$APK_NAME"
|
||||
|
||||
# Proposer de lancer l'app
|
||||
read -p "Lancer l'application ? (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
adb shell am start -n fr.geosector.app3/.MainActivity
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Application lancée"
|
||||
print_success "APK installé avec succès sur l'appareil connecté"
|
||||
|
||||
# Proposer de lancer l'app
|
||||
read -p "Lancer l'application ? (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
adb shell am start -n fr.geosector.app3/.MainActivity
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Application lancée"
|
||||
else
|
||||
print_warning "Impossible de lancer l'application"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
print_warning "Impossible de lancer l'application"
|
||||
print_error "Échec de l'installation"
|
||||
print_message "Commande : adb install $APK_NAME"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
print_error "Échec de l'installation"
|
||||
print_message "Vérifiez qu'un appareil est bien connecté : adb devices"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user