web-dev-qa-db-fra.com

Script Gradle vers la version automatique et inclure le hachage de validation dans Android

J'ai besoin d'écrire un script gradle pour versionner automatiquement mon application à chaque commit. Je dois également inclure le hachage de validation comme référence dans l'application pour les testeurs.

Je ne sais pas comment fonctionnent les versions automatiques. Quelqu'un peut-il expliquer le processus d'autoversion?

43
Shatazone

J'ai rencontré un problème similaire, mais je ne voulais pas modifier le nom de version pour inclure le hachage git. Nous voulions garder cela comme quelque chose comme 1.2.2, mais nous avons toujours la possibilité d'afficher le hachage git dans l'interface utilisateur.

J'ai modifié le code de l'autre réponse ici pour utiliser la tâche buildConfigField pour générer une valeur BuildConfig.GitHash qui peut être référencée dans le code Java Java.

Ajoutez ceci au-dessus de la section Android du fichier build.gradle de votre module:

def getGitHash = { ->
    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git', 'rev-parse', '--short', 'HEAD'
        standardOutput = stdout
    }
    return stdout.toString().trim()
}

Ajoutez ensuite la ligne suivante à la section defaultConfig de la section Android du build.gradle, c'est-à-dire sous versionName:

buildConfigField "String", "GitHash", "\"${getGitHash()}\""

Cela génère la ligne suivante dans le fichier BuildConfig.Java généré automatiquement:

// Fields from default config.
public static final String GitHash = "e61af97";

Vous pouvez maintenant obtenir le hachage git dans votre Java avec BuildConfig.GitHash.

112
Paul

Une solution idéale pourrait être d'extraire la version de l'état git du projet. De cette façon, le contrôle de version ne dépend pas du fait que vous vous souvenez d'augmenter une variable ou de modifier le texte des fichiers gradle ou config. Un autre avantage est la traçabilité du nom de la version et du code à un statut de code spécifique.

Vous pouvez trouver un exemple descriptif dans http://ryanharter.com/blog/2013/07/30/automatic-versioning-with-git-and-gradle/

L'idée est d'obtenir les informations git avec la fonction getVersionName, et d'utiliser cette fonction dans le script gradle:

/*
 * Gets the version name from the latest Git tag
 */
def getVersionName = { ->
    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git', 'describe', '--tags'
        standardOutput = stdout
    }
    return stdout.toString().trim()
}

Bien sûr, vous devez disposer de git en ligne de commande (comme la commande git describe --tags sera exécuté pour générer les informations).

Une autre approche (basée également sur l'obtention des informations de version de git) pourrait être d'externaliser cette logique à un plugin gradle - comme: - https://github.com/moallemi/gradle-advanced-build-version = - https://github.com/infusionsoft/gradle-build-version-plugin - https://github.com/nemerosa/versioning

Celui à utiliser dépend du type de stratégie de version que vous souhaitez appliquer.

11
Adrián Moreno

J'ai créé un plugin Gradle pour le faire pour vous. Le projet et les instructions complètes sont à https://github.com/lessthanoptimal/gversion-plugin

Pour l'utiliser, ajoutez ce qui suit à votre fichier build.gradle

plugins {
  id "com.peterabeles.gversion" version "1.2.4"
}

gversion {
  srcDir = "src/main/Java/"
  classPackage = "com.your.package"
  className = "MyVersion"                   // optional. If not specified GVersion is used
  dateFormat   = "yyyy-MM-dd'T'HH:mm:ss'Z'" // optional. This is the default
  timeZone     = "UTC"                      // optional. UTC is default
}

Maintenant, il vous suffit d'exécuter la tâche gradle 'createVersionFile' pour créer le fichier. Vous pouvez envisager d'ajouter la ligne suivante à votre projet Gradle project.compileJava.dependsOn(createVersionFile) Cela entraînera la génération du fichier à chaque fois que Gradle construit le projet. Consultez le site Web ci-dessus pour les instructions Android.

Voici à quoi ressemble le fichier

/**
 * Automatically generated file containing build version information.
 */
public class MyVersion {
    public static final String MAVEN_GROUP = "com.your";
    public static final String MAVEN_NAME = "project_name";
    public static final String VERSION = "1.0-SNAPSHOT";
    public static final int GIT_REVISION = 56;
    public static final String GIT_SHA = "a0e41dd1a068d184009227083fa6ae276ef1846a";
    public static final String BUILD_DATE = "2018-04-11T12:19:03Z";
    public static final long BUILD_UNIX_TIME = 1523449143116L;
}

Vous pouvez également ajouter le fichier de version à votre .gitignore car il est généré automatiquement et vous ne le voulez pas dans git.

4
lessthanoptimal

Il convient également de regarder grgit - Groovy/Gradle Git , ce qui peut aider à simplifier l'extraction d'informations, y compris Git commit-hashes, dans un script Gradle.

2
javabrett