Ajout de l'environnement de build Docker pour générer l'APK Android
- Dockerfile.android avec Android SDK et Capacitor - docker-compose.build.yml pour le build - Scripts automatisés build-apk.sh et generate-apk.sh - Configuration Capacitor pour Android - Documentation BUILD_APK.md
This commit is contained in:
@ -1,4 +1,5 @@
|
||||
Dockerfile
|
||||
Dockerfile.android
|
||||
.dockerignore
|
||||
node_modules
|
||||
npm-debug.log
|
||||
@ -12,4 +13,9 @@ README.md
|
||||
*.md
|
||||
.vscode
|
||||
.idea
|
||||
android
|
||||
ios
|
||||
dist
|
||||
*.log
|
||||
.DS_Store
|
||||
|
||||
|
||||
154
BUILD_APK.md
Normal file
154
BUILD_APK.md
Normal file
@ -0,0 +1,154 @@
|
||||
# Guide de build APK avec Docker
|
||||
|
||||
Ce guide explique comment générer un APK Android pour l'application Compagnon Admin en utilisant Docker.
|
||||
|
||||
## Prérequis
|
||||
|
||||
- Docker installé
|
||||
- docker-compose installé
|
||||
- Au moins 10 Go d'espace disque libre (pour le SDK Android)
|
||||
|
||||
## Étapes de build
|
||||
|
||||
### 1. Build initial (première fois)
|
||||
|
||||
Cette étape construit l'image Docker, installe Capacitor, et prépare le projet Android :
|
||||
|
||||
```bash
|
||||
./scripts/build-apk.sh
|
||||
```
|
||||
|
||||
Cette commande va :
|
||||
- Construire l'image Docker avec Android SDK
|
||||
- Installer les dépendances Capacitor
|
||||
- Build l'application Next.js en production
|
||||
- Initialiser Capacitor (si nécessaire)
|
||||
- Ajouter la plateforme Android
|
||||
- Synchroniser les fichiers
|
||||
|
||||
**Durée estimée :** 15-30 minutes (première fois, à cause du téléchargement du SDK Android)
|
||||
|
||||
### 2. Générer l'APK
|
||||
|
||||
Une fois le build initial terminé, générez l'APK :
|
||||
|
||||
```bash
|
||||
./scripts/generate-apk.sh
|
||||
```
|
||||
|
||||
L'APK sera généré dans `dist/compagnon-admin-debug.apk`
|
||||
|
||||
**Durée estimée :** 5-10 minutes
|
||||
|
||||
## Utilisation manuelle
|
||||
|
||||
Si vous préférez exécuter les commandes manuellement :
|
||||
|
||||
### Entrer dans le conteneur Docker
|
||||
|
||||
```bash
|
||||
docker-compose -f docker-compose.build.yml run --rm android-builder /bin/bash
|
||||
```
|
||||
|
||||
### Commandes dans le conteneur
|
||||
|
||||
```bash
|
||||
# Installer Capacitor (si pas déjà fait)
|
||||
npm install @capacitor/core @capacitor/cli @capacitor/android
|
||||
|
||||
# Build Next.js
|
||||
npm run build
|
||||
|
||||
# Initialiser Capacitor (première fois seulement)
|
||||
npx cap init 'Compagnon Admin' com.pensionmarama.admin --web-dir=.next
|
||||
|
||||
# Ajouter Android
|
||||
npx cap add android
|
||||
|
||||
# Synchroniser
|
||||
npx cap sync android
|
||||
|
||||
# Générer l'APK
|
||||
cd android
|
||||
./gradlew assembleDebug
|
||||
```
|
||||
|
||||
L'APK sera dans : `android/app/build/outputs/apk/debug/app-debug.apk`
|
||||
|
||||
## Structure des fichiers
|
||||
|
||||
- `Dockerfile.android` : Image Docker avec Android SDK
|
||||
- `docker-compose.build.yml` : Configuration Docker Compose pour le build
|
||||
- `scripts/build-apk.sh` : Script automatisé pour le build initial
|
||||
- `scripts/generate-apk.sh` : Script automatisé pour générer l'APK
|
||||
- `capacitor.config.ts` : Configuration Capacitor
|
||||
|
||||
## Volumes Docker
|
||||
|
||||
Les volumes suivants sont créés pour optimiser les builds suivants :
|
||||
- `android-sdk-cache` : Cache du SDK Android
|
||||
- `gradle-cache` : Cache Gradle
|
||||
- `node-modules` : Modules Node.js
|
||||
|
||||
## Dépannage
|
||||
|
||||
### Erreur : "SDK not found"
|
||||
|
||||
Vérifiez que les licences Android sont acceptées dans le conteneur :
|
||||
```bash
|
||||
docker-compose -f docker-compose.build.yml run --rm android-builder sdkmanager --licenses
|
||||
```
|
||||
|
||||
### Erreur : "Gradle build failed"
|
||||
|
||||
Vérifiez les logs dans le conteneur :
|
||||
```bash
|
||||
docker-compose -f docker-compose.build.yml run --rm android-builder /bin/bash
|
||||
cd android
|
||||
./gradlew assembleDebug --stacktrace
|
||||
```
|
||||
|
||||
### Nettoyer et recommencer
|
||||
|
||||
```bash
|
||||
# Supprimer les volumes
|
||||
docker-compose -f docker-compose.build.yml down -v
|
||||
|
||||
# Reconstruire l'image
|
||||
docker-compose -f docker-compose.build.yml build --no-cache
|
||||
```
|
||||
|
||||
## Distribution de l'APK
|
||||
|
||||
L'APK généré (`dist/compagnon-admin-debug.apk`) peut être distribué directement à vos bêta-testeurs.
|
||||
|
||||
**Note importante :** C'est un APK de debug. Pour une version de production, vous devrez :
|
||||
1. Créer un keystore
|
||||
2. Configurer la signature dans `capacitor.config.ts`
|
||||
3. Générer un APK release avec `./gradlew assembleRelease`
|
||||
|
||||
## Limitations avec les API Routes
|
||||
|
||||
⚠️ **Attention :** Avec `output: 'export'` dans Next.js, les API routes (`/api/*`) ne fonctionneront pas car elles nécessitent un serveur Node.js.
|
||||
|
||||
Pour que l'application admin fonctionne complètement dans l'APK, vous avez deux options :
|
||||
|
||||
### Option 1 : Héberger les API routes séparément
|
||||
|
||||
Déployez les API routes sur un serveur (Vercel, Railway, etc.) et modifiez les appels API dans l'application pour pointer vers cette URL.
|
||||
|
||||
### Option 2 : Utiliser un serveur embarqué (avancé)
|
||||
|
||||
Intégrer un serveur Node.js dans l'APK (plus complexe, nécessite des modifications supplémentaires).
|
||||
|
||||
### Option 3 : Version statique sans API routes
|
||||
|
||||
Créer une version simplifiée de l'admin qui utilise uniquement le localStorage (limité aux fonctionnalités de base).
|
||||
|
||||
## Support
|
||||
|
||||
En cas de problème, vérifiez :
|
||||
- Les logs Docker : `docker-compose -f docker-compose.build.yml logs`
|
||||
- L'espace disque disponible
|
||||
- La version de Docker (minimum 20.10)
|
||||
|
||||
48
Dockerfile.android
Normal file
48
Dockerfile.android
Normal file
@ -0,0 +1,48 @@
|
||||
FROM node:20-slim
|
||||
|
||||
# Installer les dépendances système nécessaires
|
||||
RUN apt-get update && apt-get install -y \
|
||||
openjdk-17-jdk \
|
||||
wget \
|
||||
unzip \
|
||||
git \
|
||||
curl \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Variables d'environnement Android
|
||||
ENV ANDROID_HOME=/opt/android-sdk
|
||||
ENV PATH=${PATH}:${ANDROID_HOME}/tools:${ANDROID_HOME}/platform-tools:${ANDROID_HOME}/cmdline-tools/latest/bin
|
||||
|
||||
# Installer Android SDK
|
||||
RUN mkdir -p ${ANDROID_HOME}/cmdline-tools && \
|
||||
cd ${ANDROID_HOME}/cmdline-tools && \
|
||||
wget -q https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip && \
|
||||
unzip commandlinetools-linux-9477386_latest.zip && \
|
||||
mv cmdline-tools latest && \
|
||||
rm commandlinetools-linux-9477386_latest.zip
|
||||
|
||||
# Accepter les licences et installer les composants nécessaires
|
||||
RUN yes | sdkmanager --licenses || true && \
|
||||
sdkmanager "platform-tools" "platforms;android-34" "build-tools;34.0.0" "cmdline-tools;latest"
|
||||
|
||||
# Installer Capacitor CLI globalement
|
||||
RUN npm install -g @capacitor/cli
|
||||
|
||||
# Définir le répertoire de travail
|
||||
WORKDIR /app
|
||||
|
||||
# Copier les fichiers de dépendances
|
||||
COPY package*.json ./
|
||||
|
||||
# Installer les dépendances Node.js
|
||||
RUN npm install
|
||||
|
||||
# Copier le reste du code
|
||||
COPY . .
|
||||
|
||||
# Exposer le port pour le serveur de dev (optionnel)
|
||||
EXPOSE 3000
|
||||
|
||||
# Commande par défaut
|
||||
CMD ["/bin/bash"]
|
||||
|
||||
24
capacitor.config.ts
Normal file
24
capacitor.config.ts
Normal file
@ -0,0 +1,24 @@
|
||||
import { CapacitorConfig } from '@capacitor/cli';
|
||||
|
||||
const config: CapacitorConfig = {
|
||||
appId: 'com.pensionmarama.admin',
|
||||
appName: 'Compagnon Admin',
|
||||
webDir: 'out',
|
||||
server: {
|
||||
androidScheme: 'https',
|
||||
// Pour le développement, vous pouvez utiliser localhost
|
||||
// url: 'http://localhost:3000',
|
||||
// cleartext: true
|
||||
},
|
||||
android: {
|
||||
buildOptions: {
|
||||
keystorePath: undefined,
|
||||
keystorePassword: undefined,
|
||||
keystoreAlias: undefined,
|
||||
keystoreAliasPassword: undefined
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export default config;
|
||||
|
||||
30
docker-compose.build.yml
Normal file
30
docker-compose.build.yml
Normal file
@ -0,0 +1,30 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
android-builder:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.android
|
||||
volumes:
|
||||
- .:/app
|
||||
- android-sdk-cache:/opt/android-sdk
|
||||
- gradle-cache:/root/.gradle
|
||||
- node-modules:/app/node_modules
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
working_dir: /app
|
||||
command: /bin/bash
|
||||
stdin_open: true
|
||||
tty: true
|
||||
networks:
|
||||
- build-network
|
||||
|
||||
volumes:
|
||||
android-sdk-cache:
|
||||
gradle-cache:
|
||||
node-modules:
|
||||
|
||||
networks:
|
||||
build-network:
|
||||
driver: bridge
|
||||
|
||||
67
scripts/build-apk.sh
Executable file
67
scripts/build-apk.sh
Executable file
@ -0,0 +1,67 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 Démarrage du build APK..."
|
||||
|
||||
# Vérifier que Docker est installé
|
||||
if ! command -v docker &> /dev/null; then
|
||||
echo "❌ Docker n'est pas installé. Veuillez l'installer d'abord."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Vérifier que docker-compose est installé
|
||||
if ! command -v docker-compose &> /dev/null; then
|
||||
echo "❌ docker-compose n'est pas installé. Veuillez l'installer d'abord."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Construire l'image Docker
|
||||
echo "📦 Construction de l'image Docker..."
|
||||
docker-compose -f docker-compose.build.yml build
|
||||
|
||||
# Démarrer le conteneur et exécuter les commandes de build
|
||||
echo "🔨 Build de l'application Next.js..."
|
||||
docker-compose -f docker-compose.build.yml run --rm android-builder sh -c "
|
||||
echo '📦 Installation des dépendances Capacitor...' &&
|
||||
npm install @capacitor/core @capacitor/cli @capacitor/android &&
|
||||
|
||||
echo '⚙️ Sauvegarde de la configuration Next.js...' &&
|
||||
cp next.config.js next.config.js.backup &&
|
||||
|
||||
echo '⚙️ Configuration Next.js pour export statique...' &&
|
||||
if grep -q '\"output\": \"standalone\"' next.config.js; then
|
||||
sed -i 's/\"output\": \"standalone\"/\"output\": \"export\"/' next.config.js
|
||||
echo '✅ Configuration modifiée pour export statique'
|
||||
fi &&
|
||||
|
||||
echo '🏗️ Build de production Next.js...' &&
|
||||
npm run build &&
|
||||
|
||||
echo '⚙️ Restauration de la configuration Next.js...' &&
|
||||
mv next.config.js.backup next.config.js &&
|
||||
|
||||
echo '⚙️ Initialisation Capacitor (si nécessaire)...' &&
|
||||
if [ ! -f capacitor.config.ts ]; then
|
||||
npx cap init 'Compagnon Admin' com.pensionmarama.admin --web-dir=out
|
||||
fi &&
|
||||
|
||||
echo '📱 Ajout de la plateforme Android...' &&
|
||||
npx cap add android || true &&
|
||||
|
||||
echo '🔄 Synchronisation Capacitor...' &&
|
||||
npx cap sync android &&
|
||||
|
||||
echo '✅ Build terminé !'
|
||||
"
|
||||
|
||||
echo "📱 Ouverture du projet Android dans le conteneur..."
|
||||
echo "Pour générer l'APK, exécutez dans le conteneur :"
|
||||
echo " cd android && ./gradlew assembleDebug"
|
||||
echo ""
|
||||
echo "Ou utilisez Android Studio :"
|
||||
echo " npx cap open android"
|
||||
echo ""
|
||||
echo "Pour entrer dans le conteneur :"
|
||||
echo " docker-compose -f docker-compose.build.yml run --rm android-builder /bin/bash"
|
||||
|
||||
28
scripts/generate-apk.sh
Executable file
28
scripts/generate-apk.sh
Executable file
@ -0,0 +1,28 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 Génération de l'APK..."
|
||||
|
||||
# Vérifier que le build Android existe
|
||||
if [ ! -d "android" ]; then
|
||||
echo "❌ Le répertoire android n'existe pas. Exécutez d'abord ./scripts/build-apk.sh"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Générer l'APK dans le conteneur
|
||||
docker-compose -f docker-compose.build.yml run --rm android-builder sh -c "
|
||||
cd android &&
|
||||
./gradlew assembleDebug
|
||||
"
|
||||
|
||||
# Copier l'APK généré
|
||||
if [ -f "android/app/build/outputs/apk/debug/app-debug.apk" ]; then
|
||||
mkdir -p dist
|
||||
cp android/app/build/outputs/apk/debug/app-debug.apk dist/compagnon-admin-debug.apk
|
||||
echo "✅ APK généré : dist/compagnon-admin-debug.apk"
|
||||
else
|
||||
echo "❌ L'APK n'a pas été généré. Vérifiez les erreurs ci-dessus."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user