Gradle Play Publisher : Déploiement automatisé sur Google Play Store

Gradle Play Publisher

Bon nombre d’entre vous savent que déployer son application sur le Google Play Store et la gérer peut vite devenir fastidieux même si la console de Google est bien faite. La gestion de son application avec les textes des différentes langues, les descriptifs ainsi que les images devient vite lourde et un peu pénible via l'IHM. Grâce à Gradle Play Publisher, ces tâches deviennent beaucoup plus simples et surtout invisibles pour le développeur (et oui je suis feignant).

Gradle Play Publisher ?

Comme son nom l’indique, Gradle Play Publisher est un plugin gradle qui permet de pousser votre APK sur le Google Play Store. Il permet d'uploader les images, les descriptifs, le whatsnew, l’email de contact ….  depuis votre code source. Ce plugin dispose d'un dépôt GitHub et son MD est plutot bien fait : https://github.com/Triple-T/gradle-play-publisher

Configuration

Pour le mettre en place, rien de plus simple; il vous suffit d’ajouter la dépendance à votre build.gradle principal comme ci-dessous :

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        classpath 'com.google.gms:google-services:3.0.0'
        classpath "net.rdrei.android.buildtimetracker:gradle-plugin:0.10.0"
        classpath 'com.github.triplet.gradle:play-publisher:1.2.0'
    }
}

La ligne qui nous intéresse est la dernière au niveau des classpath mais je vous conseille d'installer buildtimetracker qui est un plugin permettant d'ajouter des infos sur les différents temps de build de manière visuelle dans la console.

Pour en revenir à notre sujet, vous devez également faire appel à votre plugin dans le build.graddle de votre application comme suit :

apply plugin: 'com.github.triplet.play'
    play {
        def Properties props = new Properties()
        def propFile = new File(project.property("AndroidProject.signing").toString())
        if (propFile.canRead()) {
            props.load(new FileInputStream(propFile))
        }
        serviceAccountEmail = props['SERVICE_ACCOUNT_EMAIL']
        pk12File = file(props['PK12_FILE'])
        track = 'production'
    }

Comme vous pouvez le constater, il vous suffit d’ajouter un bloc ‘play’ afin de venir configurer le tout.

Pour ma part, j’utilise des fichiers de properties afin d’éviter de pusher mes fichiers sensibles (properties de build d’apk et les informations de connexion au compte google play store). Vous pouvez également passer par des variables d'environnements.

Au tout début j'utilisais SnapCI qui permettait de déposer des fichiers sécurisés et accessibles seulement par l'outil mais cet outil n'est malheureusement plus actif 🙁

Properties

Dans mon fichier de properties, je me retouve donc avec ces informations :

STORE_FILE=/xx/xxx
STORE_PASSWORD=xxxxxx
KEY_ALIAS=xxxxx
KEY_PASSWORD=xxxxxx
SERVICE_ACCOUNT_EMAIL=xxxx
PK12_FILE=/xx/xxxx.p12

Les 4 premières valeurs sont relatives à la génération de l’apk (asembleRelease) et les deux dernières sont nécessaires à la publication sur le Google Play Store.

Paramétrage

Il suffit de venir paramétrer le tout dans votre build.gradle afin d’affecter les valeurs des properties du flavor pour le build de l’APK voulue.

Voici un script permettant de prendre en compte le paramétrage désiré :

buildTypes {
        def BOOLEAN = "boolean"
        def TRUE = "true"
        def FALSE = "false"
        def LOG_HTTP_REQUESTS = "LOG_HTTP_REQUESTS"
        def REPORT_CRASHES = "REPORT_CRASHES"
        debug {
            buildConfigField BOOLEAN, LOG_HTTP_REQUESTS, TRUE
            buildConfigField BOOLEAN, REPORT_CRASHES, TRUE
        }
        release {
            buildConfigField BOOLEAN, LOG_HTTP_REQUESTS, FALSE
            buildConfigField BOOLEAN, REPORT_CRASHES, TRUE
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }

    if (project.hasProperty("AndroidProject.signing") && new File(project.property("AndroidProject.signing").toString()).exists()) {
        def Properties props = new Properties()
        def propFile = new File(project.property("AndroidProject.signing").toString())
        if (propFile.canRead()) {
            props.load(new FileInputStream(propFile))
            // Signin properties
            if (props != null && props.containsKey('STORE_FILE') && props.containsKey('STORE_PASSWORD') && props.containsKey('KEY_ALIAS') && props.containsKey('KEY_PASSWORD')) {
                android.signingConfigs.release.storeFile = file(props['STORE_FILE'])
                android.signingConfigs.release.storePassword = props['STORE_PASSWORD']
                android.signingConfigs.release.keyAlias = props['KEY_ALIAS']
                android.signingConfigs.release.keyPassword = props['KEY_PASSWORD']
            } else {
                println 'androidproject.properties found but some entries of sigin are missing'
                android.buildTypes.release.signingConfig = null
            }
        } else {
            println 'androidproject.properties file not found'
            android.buildTypes.release.signingConfig = null
        }
    }

Dans mon exemple je n'ai prit en compte qu'un flavor de release. Pour builder l'application il vous suffira d'exécuter la tâche asembleRelease qui lancera donc le flavor release.

Publication

Tâches gradle

Le plugin définit 4 tâches principales :

  • publishApkRelease - Uploads de l'APK et du résumé des changements
  • publishListingRelease - Uploads des descriptions et des images pour le Play Store (fiche descriptive)
  • publishRelease - Uploads de la totale.
  • bootstrapReleasePlayResources - récupère toutes les données du Google Play Store pour initialiser les fichiers/dossiers nécessaires

Dans le cas où vous avez plusieurs product flavors vous aurez autant de tâches associées (ex: publishApkPaidRelease, publishListingPaidRelease...)

 

Metadatas

Voici la structure des metadatas; ceci est une liste exhaustive et vous n'êtes pas obligé de définir la totalité des informations :

Images

Voici la structure des images; ceci est bien évidement également une liste exhaustive :

Conclusion

Voici donc comment nous pouvons déployer une application vers le store de façon automatisée afin de n'avoir à gérer que la partie développement.

Vous pouvez très bien déclencher ces tâches dans des pipelines au niveau de votre CI préféré et ainsi vous affranchir de la gestion de votre appli à la mano depuis le playstore !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.