Feature-flipping avec Firebase Remote Config

Feature-flipping avec Firebase Remote Config

Sécurisez le déploiement de vos fonctionnalités mobiles critiques grâce à Firebase Remote Config et au feature-flipping

Le déploiement d'applications mobiles présente plusieurs challenges par rapport à une mise en exploitation de site Web : les apps doivent être validées par les stores (App Store et Google Play Store), la propagation met ensuite quelques heures, et une action sur les appareils des clients est nécessaire pour récupérer la dernière version de l'application.

Ces contraintes ne sont par exemple pas compatibles avec une deadline métier imposant une ouverture de service à une date précise : c'est ici que Firebase Remote Config entre en jeu.

Firebase

Firebase est le nom marketing de la suite d'outils de Google à destination des développeurs. Certains de ces outils sont bien connus des développeurs, notamment Firebase Crashlytics, bien pratique pour monitorer les plantages d'applications en production, ou Firebase Analytics qui reste la référence en matière de remontée de données d'Analytics (en attendant le couperet de la CNIL sur sa légalité et sa conformité RGPD). Il existe en revanche beaucoup d'outils moins souvent utilisés, mais qui peuvent rendre bien des services, et Remote Config en fait partie.

Firebase Remote Config

Mise en place

La première étape est de créer un compte Firebase ainsi que les applications associées si ce n'est pas déjà fait dans votre app. La console Firebase est accessible à l'adresse suivante :

https://console.firebase.google.com

Une fois votre compte créé, il faut alors créer les applications associées : dans l'onglet Paramètres généraux, section Vos applications, ajoutez les applications nécessaires (iOS et Android).

Création des apps

Une bonne pratique est de créer des enveloppes Firebase pour vos applications hors-production indépendantes des enveloppes de production. Dans ce cas, il vous faudra des package name/bundle identifier distincts.

Lorsqu'une app est créée, Firebase génère automatiquement un fichier de configuration à intégrer au projet, et détaille les étapes à suivre pour intégrer le SDK et l'initialiser. Sur iOS, le SDK est distribié via Swift Package Manager, CocoaPods, ou en Zip à inclure dans le projet. Sur Android, il est distribué sous forme de dépendance Gradle.

Abstraction

Firebase Remote Config est un outil parmi beaucoup d'autres au fonctionnement similaire (on peut notamment citer la suite Adobe Experience Cloud, les outils ABTasty etc...). En cas de changement d'outil, il est important de limiter la dépendance de votre code au maximum. Pour ce faire, il est recommandé d'implémenter une couche d'abstraction pour faciliter le changement d'outil en cas de besoin. L'intérêt d'ajouter une abstraction est également d'améliorer la lisibilité du code :

RemoteConfig
    .remoteConfig()
    .configValue(forKey: "feature_is_enabled")
    .boolValue

est moins lisible et plus verbeux que :

ConfigManager.shared.featureIsEnabled

Ainsi, l'ensemble du code spécifique à Firebase est situé dans une unique classe isolée, et pour les besoins de tests unitaires, le SDK Firebase peut être remplacé par un mock.

Exemple en Swift via un Singleton :

import Firebase
import FirebaseRemoteConfig

class ConfigManager {

    public static let shared = ConfigManager()

    let remoteConfig: RemoteConfig

    private override init() {
        FirebaseApp.configure()
        remoteConfig = RemoteConfig.remoteConfig()
        super.init()
    }

    public var featureIsEnabled: Bool {
        return remoteConfig.configValue(forKey: "feature_is_enabled").boolValue
    }

}

Utilisation

Une fois cette couche d'abstraction mise en place, l'intégration au sein de votre app est enfantine : il suffit alors de consommer les valeurs remontées par Remote Config via un simple if. Vous pouvez alors piloter les valeurs gérées dans votre code mobile depuis la console Firebase. Plusieurs avantages : vérifier que vos backends tiendront la charge après l'ouverture de service, vous assurer qu'aucun crash ou bug bloquant n'est détecté, et désactiver la fonctionnalité le cas échéant sans nécessiter de rollback et de republication de votre app.

Activation/Désactivation à chaud de fonctionnalité

Configuration

L'ajout de clés dans Firebase Remote Config se fait directement via la console Firebase. Des API sont également disponibles. 3 types de clés existent : des booléens, des types primitifs (chaînes de caractères et nombres), et des payloads JSON complets. En fonction de vos besoins (toggle feature simple, ou A/B test au ciblage plus complexe), vous pouvez donc choisir le type qui convient le mieux.

Création clé dans Remote Config

Des valeurs par défaut peuvent être fournies au moment du build de l'app pour permettre au SDK de retourner une valeur même en cas d'échec lors de la récupération de la configuration distante (dans le cas d'une app utilisée en mode avion par exemple).

Autres usages

Comme on l'a vu, Firebase Remote Config permet via un outil très simple d'utilisation de piloter des valeurs au sein d'un client lourd déployé sur les appareils des clients. On peut donc l'utiliser pour variabiliser tout un ensemble de constantes présentes dans les apps et en modifier simplement les valeurs : timeout sur les Webservices, clés d'API, URLs statiques etc...

Associé à un outil d'Analytics, Firebase Remote Config peut également permettre de gérer des A/B Test afin de déterminer parmi plusieurs variantes laquelle performera le mieux via des conversions monitorées.

Limites

Firebase Remote Config est un outil très puissant, mais à l'usage, il peut vite devenir très complexe à gérer : il est important de respecter des conventions de nommage pour les clés (snake_case vs camelCase, préfixer les clés par un univers fonctionnel associé : config.ws.apiKey, account.photoUploadIsEnabled, abtest.tabbarItemsOrder...), et de faire du ménage régulièrement sur les clés qui ne sont plus utilisées.

Temps de propagation

Remote Config n'est pas un outil temps réel : ses valeurs sont mises à jour à intervalle régulier, avec une limite maximale afin de limiter la charge sur les serveurs de Google. Pour des changements plus fréquenrs que ça, il est alors nécessaire de passer via des ressources sur un backend custom dédié.

Mise à jour fichiers de conf embarqués

A chaque modification des clés côté console Firebase, il faut penser à modifier les clés pré-embarquées dans les builds pour éviter de déployer des apps avec une configuration initiale obsolète. Remote Config propose une API REST permettant de récupérer les différentes valeurs renseignées dans la console : si les valeurs des clés sont modifiées régulièrement, il peut alors être une bonne idée d'utiliser ces API afin de créer une étape dans votre CI pour générer un fichier de conf embarquée qui soit à jour et éviter ainsi les delta sans pour autant nécessiter d'action manuelle.

firebase.google.com/docs/reference/remote-c..