diff --git a/.github/workflows/build-apk.yml b/.github/workflows/build-apk.yml index 69e4840..0a699d0 100644 --- a/.github/workflows/build-apk.yml +++ b/.github/workflows/build-apk.yml @@ -37,6 +37,30 @@ jobs: - run: flutter pub get + # Keystore fixe injecté via secrets : sans lui, Gradle signerait avec une + # clé debug générée sur le runner (différente à chaque build) et l'APK ne + # s'installerait pas par-dessus une version déjà présente sur l'appareil. + - name: Set up release signing + env: + KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }} + KEYSTORE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }} + KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }} + KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }} + run: | + for v in KEYSTORE_BASE64 KEYSTORE_PASSWORD KEY_ALIAS KEY_PASSWORD; do + if [ -z "${!v}" ]; then + echo "::error::Secret ANDROID_$v manquant — impossible de signer l'APK avec une clé stable." + exit 1 + fi + done + echo "$KEYSTORE_BASE64" | base64 -d > android/app/release.jks + { + echo "storeFile=release.jks" + echo "storePassword=$KEYSTORE_PASSWORD" + echo "keyAlias=$KEY_ALIAS" + echo "keyPassword=$KEY_PASSWORD" + } > android/key.properties + - name: Build release APK run: flutter build apk --release diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index a8a12b0..874f518 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -1,3 +1,5 @@ +import java.util.Properties + plugins { id("com.android.application") id("kotlin-android") @@ -5,6 +7,18 @@ plugins { id("dev.flutter.flutter-gradle-plugin") } +// Signature release stable : android/key.properties (ignoré par git) pointe vers +// un keystore fixe. Sans ce fichier, on retombe sur la clé debug locale pour que +// `flutter run --release` continue de marcher. La CI DOIT fournir key.properties, +// sinon chaque build serait signé avec une clé debug aléatoire et l'APK ne +// s'installerait pas par-dessus une version existante. +val keystoreProperties = Properties() +val keystorePropertiesFile = rootProject.file("key.properties") +val hasReleaseKeystore = keystorePropertiesFile.exists() +if (hasReleaseKeystore) { + keystorePropertiesFile.inputStream().use { keystoreProperties.load(it) } +} + android { namespace = "com.example.xtremflow" compileSdk = flutter.compileSdkVersion @@ -30,11 +44,24 @@ android { versionName = flutter.versionName } + signingConfigs { + if (hasReleaseKeystore) { + create("release") { + storeFile = file(keystoreProperties.getProperty("storeFile")) + storePassword = keystoreProperties.getProperty("storePassword") + keyAlias = keystoreProperties.getProperty("keyAlias") + keyPassword = keystoreProperties.getProperty("keyPassword") + } + } + } + buildTypes { release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig = signingConfigs.getByName("debug") + signingConfig = if (hasReleaseKeystore) { + signingConfigs.getByName("release") + } else { + signingConfigs.getByName("debug") + } } } }