Cet article fait partie d’une sĂ©rie de 4. L’objectif est de dĂ©crire comment faire pour optimiser un maximum le dĂ©ploiement d’une application Android en automatisant les Ă©tapes đŸ€–.

  1. 1 – 📩 Builder et signer son application Android
  2. 2 – 🚀 Automatiser les builds avec Fastlane
  3. (1) – đŸ”„ DĂ©ployer son application sur Firebase
  4. (2) – 🛳 DĂ©ployer son application sur le Play Store
  5. – đŸ€– Utiliser Gitlab pour dĂ©ployer son application lors d’un tag de release sur git.

Dans la troisiĂšme partie de cette sĂ©rie, nous allons voir comment utiliser fastlane pour dĂ©ployer notre application sur Firebase đŸ”„ et la rendre dispo Ă  nos testeurs.

Cet article est looooong, alors prĂ©parez vos cafĂ©s et thĂ©s, on en a pour un moment ☕

⏰ Un petit rĂ©cap ?

Dans les 2 précédents articles, nous avons vu comment

Soit 50% de notre automatisation en 2 Ă©tapes

Aujourd’hui, on va donc s’attaquer Ă  la deuxiĂšme Ă©tape: le dĂ©ploiement 📹 !

Vous le savez bien, la distribution d’une application en bĂȘta-test est une Ă©tape importante dans la vie d’un projet. En effet, elle permet aux testeurs/clients/po de l’utiliser et de faire des retours aux Ă©quipes.

Dans le monde Android, il existe plusieurs de moyens de faire ça:

Ce qu’on va faire c’est se concentrer sur l’utilisation de Firebase đŸ”„.

Nous allons donc voir, ensemble, comment déployer notre application avec Firebase App Distribution.

đŸ”„ Configuration de Firebase

La premiĂšre Ă©tape de notre parcours, c’est de configurer Firebase pour utiliser son service avec notre application.

Pour faire cela, nous allons réaliser 3 choses

Si vous avez déjà une application dans firebase, vous pouvez passer cette étape en cliquant ici

🚒 CrĂ©ation de l’application dans Firebase

Pour créer notre application dans Firebase, cela se fait en 2 phases:

  1. La création du projet
  2. Dans ce projet, la crĂ©ation de l’application (1 projet peut avoir plusieurs apps)

☄ CrĂ©ation du projet

Bouton ajouter un projet sur Firebase

Rendez-vous sur votre console firebase et ajoutez un projet

Rentrez un nom de projet, puis activez (ou pas) Google Analytics (et créez un compte ou pas en fonction de).

Laissez Firebase đŸ”„ travailler, et vous voilĂ  sur le dashboard de votre projet.

đŸ“Č CrĂ©ation de l’application

Dashboard Firebase, ajouter une application

La premiĂšre Ă©tape Ă  faire dans notre projet Firebase đŸ”„ est d’ajouter notre application Android.

Pour cela, on va cliquer sur l’icîne Android.

Commencons par Enregistrer notre application.

Dashboard firebase

Suivez les différentes demandes de Firebase pour créer votre projet.

Pour ce qui est du certificat de signature de débogage, si vous vous souvenez bien, on en parle dans la partie 1 builder et signer son application en release.

Par défaut, ce certificat de signature de débogage, est situé dans ~/.android/debug.keystore

Pour obtenir la clé SHA-1, utilisez la commande suivante:

keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android 

Le résultat du keytool list

Copiez collez la ligne SHA-1 dans le champ de Firebase et cliquez sur Enregister l’application.

👆 Les empreintes de certificats

Téléchargement du google-services.json

ArrivĂ©s lĂ , il vous propose de tĂ©lĂ©charger le fichier google-services.json et de l’ajouter Ă  votre projet.

Vous pouvez le faire et terminer le tuto avec l’Ajout du SDK Firebase et le premier lancement.

Ils utilisent Android Studio avec un thÚme clair, je soupsone que ça soit le marketing qui ait donné les images à intégrer.

Configurer notre application sur Firebase

Revenons à notre dashboard de projet, désormais vous avez votre application qui est listée.

Cliquez sur la roue dentée de configuration

Vous devez ĂȘtre redirigĂ©s vers la page de configuration du projet.

En bas de page vous verrez qu’il y a une option pour rajouter d’autres empreintes de certificat.

Ajouter des empreintes de certificat

Vous allez me dire Ă  quoi cela sert ? Et bien Ă  plusieurs choses. Si votre application utilise Firebase pour certains services

Firebase đŸ”„ va se baser sur ces clĂ©s de certificats pour autoriser ou non l’accĂšs Ă  l’API.

A vous la 403 si jamais votre clĂ© de debug ne figure pas dans la liste
 
Mais aussi si votre clĂ© de release n’y figure pas !! đŸ’€đŸ˜±

2 choses Ă  faire donc:

  1. Si vous ĂȘtes plusieurs sur le projet, ajoutez toutes les clĂ©s de debug des dĂ©veloppeurs
  2. Ajoutez la clé de certificat de release

Pour cela, utilisez la mĂȘme commande qu’au-dessus mais sur votre certificat de release, en utilisant bien

si vous avez suivi la [premiĂšre partie de ces articles](/2020/10/24/builder-et-signer-son-application-android-en-release/), toutes ces infos sont dans le fichier key.properties
keytool -list -v -keystore STORE_FILE -alias KEY_ALIAS -storepass STORE_PASSWORD -keypass KEY_PASSWORD 

Et ajoutez la SHA-1 qui sort en réponse à cette commande.

Une fois que cela est fait, tĂ©lĂ©chargez et mettez Ă  jour votre google-services.json (mĂȘme si pas grand-chose n’a dĂ» changer).

Vous voilĂ  prĂȘt pour un premier dĂ©ploiement ! 🎉

🧳 Anatomie d’un dĂ©ploiement

Pour activer l’App distribution dans Firebase, rendez-vous dans le menu gauche QualitĂ© puis App Distribution.

De lĂ  validez les conditions et cliquez sur commencer.

Nous voilĂ  prĂȘts Ă  dĂ©ployer !

📩 Une version = Un APK

Pour commencer, on remarque que (Ă  date) Firebase App Distribution fonctionne avec des APK.

Dans le monde Android aujourd’hui, on fonctionne plus avec des App Bundle. Un format plus adaptĂ© Ă  la rĂ©duction de taille des APK tĂ©lĂ©chargĂ©s par nos utilisateurs.

Oui mais pour que cela fonctionne, en fait, le Play Store va gĂ©nĂ©rer autant d’APK que de possibilitĂ©s (langues, rĂ©solution, architecture, etc
).

Firebase n’a ni le temps, ni le besoin de faire ce genre de choses. En effet, c’est consommateur de ressources et en plus on cible de la bĂȘta-test, alors ils peuvent bien se taper un APK de 150Mo non ?

1ere remarque: Nous devrons builder nos APK avec gradle assemble et pas bundle

🎳 Les groupes de test

Pour faire installer notre application et la partager à nos testeurs, il existe 2 possibilités

Commençons par le groupe de test.

Le groupe de test est un moyen simple d’ajouter des personnes Ă  vos tests, crĂ©ez un groupe, nommez le et enregistez.

Je vous déconseille de mettre des testeurs hors groupe.

De lĂ  vous pouvez ajouter des emails dans ce groupe, ces personnes seront informĂ©es qu’ils sont invitĂ©s Ă  participer aux tests et pourront tĂ©lĂ©charger l’app d’installation de firebase pour tĂ©lĂ©charger nos versions.

Groupe de testeurs sur firebase Les testeurs dans leurs groupes

Vous pouvez avoir plusieurs groupes, pour donner accÚs à certaines fonctionnalités ou pas (ou par exemple avoir un Alpha test, un Beta test, ou gérer vos flavors)

Liste des testeurs de la version

Une fois qu'un testeur est ajoutĂ©, il a automatiquement accĂšs Ă  la derniĂšre bĂȘta disponnible pour son groupe

Un point intĂ©ressant dans la crĂ©ation de groupes, c’est que vous pouvez le laisser vide et le remplir plus tard.

En effet, parlons maintenant du* lien d’invitation*, vous pouvez gĂ©nĂ©rer un lien que vous partagez autour de vous, et pour toutes les personnes qui vont rejoindre via ce lien, les affecter dans un groupe particulier.

On pourrait imaginer un groupe Testeurs externes uniquement par invitation d’un lien et un groupe Testeurs internes directement en email entrĂ©s dans la console.

D’ailleurs, vous pouvez voir qu’on peut restreindre au domaine mail (ce qu’il y a aprĂšs l’@). Pratique si on ne veut pas que son application fuite, mais qu’on veut quand mĂȘme pouvoir partager un lien !

2eme remarque: Pour ajouter des testeurs, on les ajoute dans un groupe, il faut retenir le nom du groupe

📝 Les notes de version

Lorsque vous déployez un APK sur Firebase, vous pouvez ajouter 2 choses

Changelog de la version

Quand on va uploader un APK, on peut spécifier un changelog mais ce n'est pas obligatoire

Alors pourquoi est-ce que j’insiste sur le sujet ?

Les notes de version, c’est quelque chose de vraiment important.

Quand vous achetez un produit alimentaire, n’ĂȘtes-vous pas intĂ©ressĂ©s d’ĂȘtre informĂ©s si la recette a changĂ© ?!

Lorsqu’on sera en prod, les utilisateurs auront accùs à ce changelog.

Cela sera mĂȘme Ă©crit en gros et vert dans un encart sur le fiche du store !

De lĂ , vous aurez 2 options,

3Ăšme remarque: quand on dĂ©ploie une application, c’est mieux de fournir un changelog


Pour rĂ©sumer, ce qu’on peut dire sur un dĂ©ploiement avec Firebase App Distribution

Voyons maintenant comment modifier nos lanes pour réaliser tout cela.

Canon pirate. Image de déploiement de l'application comme un boulet de canon

🔀 DĂ©ployer avec Fastlane

Je vous propose la chose suivante :

Pour déployer notre APK nous allons avoir besoin de 3 lanes différentes

  1. La premiĂšre se chargera de gĂ©nĂ©rer l’APK 📩
  2. Ensuite, une seconde pour gĂ©nĂ©rer un changelog 📝
  3. Enfin, une derniĂšre pour envoyer le rĂ©sultat sur Firebase 🚀

📩 GĂ©nĂ©ration de l’APK

Commençons par gĂ©nĂ©rer l’APK.

Pour la gĂ©nĂ©ration des APK en automatique, je vous invite Ă  suivre la partie 2 de cette sĂ©rie: l’automatisation des builds avec Fastlane.

Le principe reste simple, on va partir du postulat que nous n’avons qu’une flavor Ă  gĂ©rer.

desc "Build our App in Release"
lane :build_release do
    # Code qui génÚre l'APK
end

📝 GĂ©nĂ©ration du changelog

La deuxiÚme information à récupérer est le changelog.

Le changelog est optionnel et avant j'avais un gros pavé ici pour expliquer comment faire.
AprĂšs relecture, je me suis rendu compte que cela polluait l'article de base, je l'ai donc extrait dans un article Ă  part

Rendez vous sur ce nouvel article pour voir “Comment automatiser la gĂ©nĂ©ration de changelog avec fastlane”

Pour la suite, on va considérer une lane

desc "Generate Changelog since last release (release number given in options[version_code])"
lane :get_changelog do |options|
    # Code qui génÚre le changelog
end

🚀 DĂ©ployer sur Firebase

Pour finir, nous allons Ă©crire une lane pour dĂ©ployer sur Firebase đŸ”„.

Pour cela, on va s’appuyer sur un plugin dĂ©jĂ  disponible firebase_app_distribution.

đŸ“Č Installer le plugin

Lorsqu’on suit le tutoriel officiel sur la documentation de Firebase, on voit que pour utiliser le plugin, il faut commencer par l’installer.

Pour cela, on va exécuter la commande suivante

bundle exec fastlane add_plugin firebase_app_distribution

Par la suite, il faut s’authentifier sur firebase (normal, sinon n’importe qui pourrait uploader une app par-dessus la nître).

đŸ€ Authentifier Fastlane 🚀 sur Firebase đŸ”„

On voit qu’on a 3 options possibles

On va prendre la 2nd option, le compte de service.

  1. Rendez-vous sur la Console Google Cloud
  2. SĂ©lectionnez votre projet
  3. Dans la rubrique de Gauche, sélectionnez Comptes de Service
  4. Utilisez ou créez un compte de service

    Dans le cas d’une crĂ©ation, remplissez les infos suivantes

    Google cloud, création d'un compte de service

    Au niveau des rĂŽles, ajoutez bien le rĂŽle admin de distribution

    Google cloud compte de service ajout de rĂŽle

    Si jamais vous utilisez un agent existant, privilégiez le* firebase-adminsdk*

  5. SĂ©lectionnez le compte de service (ici on va partir sur le firebase-app-distribution)</li>

    Google cloud et la liste des comptes de service

  6. Créez une clé sur ce compte

    Google Cloud: Créer une clé sur le compte de service

    Google Cloud: Création de la clé JSON

  7. Une fois cette clé créée, téléchargez là (un fichier json)
  8. Renommez-la firebase-app-distribution-key.json et copiez-la dans votre projet dans le dossier fastlane (Ă  cĂŽtĂ© du Fastfile et de l’Appfile)
  9. ⚠ Ajoutez cette clĂ© Ă  votre .gitignore, elle n’a rien Ă  faire sur un dĂ©pĂŽt !!

    Notre dossier ressemble maintenant Ă 

    • projet
      • app
      • fastlane
        • Appfile
        • Fastfile
        • firebase-app-distribution-key.json

🚚 Distribuer notre APK via firebase_app_distribution

Pour finir, il ne nous reste plus qu’à utiliser firebase_app_distribution pour dĂ©ployer notre APK avec une lane.

Pour faire ça nous aurons besoin de 2 choses en plus de ce que nous avons déjà

desc "Distribute APK to firebase"
lane :distribute_to_firebase do |options|
    UI.message("📩 Let's send the package to Firebase đŸ”„")
    apk_path = options[:apk_path]
    changelog = options[:changelog]
    firebase_app_distribution(
      app: "VOTRE_IDENTIFIANT_FIREBASE",
      groups: "LISTE DES GROUPES SÉPARÉS PAR UNE VIRGULE", # exemple "Testeurs Internes, Testeurs Externes, Potes, CODIR"
      apk_path: apk_path,
      service_credentials_file: "./fastlane/firebase-app-distribution-key.json",
      release_notes: changelog
    )
    UI.success("📩 Package sent")
end

Que faisons-nous lĂ -dessus ?

Déjà notre lane prend en entrée 2 paramÚtres

Ensuite,

  1. il met Ă  jour la version de l’app dont l’id est spĂ©cifiĂ©,
  2. s’authentifie avec notre fichier firebase-app-distribution-key.json via service_credentials_file et
  3. envoie l’APK spĂ©cifiĂ© au chemin en paramĂštre apk_path
  4. Update les releases_notes avec notre changelog
  5. Notifie les testeurs dans groups

đŸČ Tout mettre ensemble

Pour finir, notre derniùre lane est celle qui regroupe tout ce petit monde et fait les actions dans l’ordre

desc "Buil &amp; Deploy the current version 🚀"
lane :deploy_app do
    build_release
    version_code = get_version_code()
    changelog = get_changelog(version_code: version_code)
    distribute_to_firebase(
        apk_path: "app/build/outputs/apk/release/app-release.apk",
        changelog: changelog
    )
end

Et si on met tout ensemble, on obtient ce Fastfile

default_platform(:android)

platform :android do

    desc "Build our App in Release"
    lane :build_release do
        UI.message("Let's build our app in Release")
        gradle(task: 'assemble', build_type: 'Release')
        UI.success("✅ Release is packaged.")
    end

    desc "Get the current version code of the app by reading gradle.properties"
    lane :get_version_code do
        version_code = -1
        File.open('../gradle.properties', 'r') do |properties_file|
            properties_file.read.each_line do |line|
                line.strip!
                i = line.index('=')
                vc = line.index('version_code')
                if (i &amp;&amp; vc)
                    version_code = line[i + 1..-1].strip
                end
            end
        end
        version_code
    end

    desc "Read the specified changelog from a version code"
    lane :get_changelog do |options|
        version_code = options[:version_code]
        changelog = ""
        File.open("./changelogs/#{version_code}.txt", 'r') do |changelog_file|
            changelog_file.read.each_line do |line|
                changelog += line
            end
        end
        changelog
    end

    desc "Distribute APK to firebase"
    lane :distribute_to_firebase do |options|
        UI.message("📩 Let's send the package to Firebase đŸ”„")
        apk_path = options[:apk_path]
        changelog = options[:changelog]
        firebase_app_distribution(
          app: "VOTRE_IDENTIFIANT_FIREBASE",
          # exemple "Testeurs Internes, Testeurs Externes, Potes, CODIR"
          groups: "LISTE DES GROUPES SÉPARÉS PAR UNE VIRGULE", 
          apk_path: apk_path,
          service_credentials_file: "./fastlane/firebase-app-distribution-key.json",
          release_notes: changelog
        )
        UI.success("📩 Package sent")
    end

    desc "Buil &amp; Deploy the current version 🚀"
    lane :deploy_app do
        build_release
        version_code = get_version_code()
        changelog = get_changelog(version_code: version_code)
        distribute_to_firebase(
            apk_path: "app/build/outputs/apk/release/app-release.apk",
            changelog: changelog
        )
    end

end

Et on peut tester que tout fonctionne en une commande

bundle exec fastlane android deploy_app

🎉🎉🎉🎉🎉🎉🎉

đŸ€Ż En rĂ©sumĂ©

Bon ! Ca fait combien de temps qu’on y est ?

Il Ă©tait particuliĂšrement long cet article, mais en mĂȘme temps, quel morceau non ?

On a appris Ă ;

Ce n’est quand mĂȘme pas rien !

Plus d’excuses pour passer l’aprĂšs-midi Ă  faire un dĂ©ploiement (ni mĂȘme 1h) đŸ€Ą

Images