Gradle Script para automatizar las versiones de Android mediante tags git

Me quedé atrapado en un problema con este script. Quiero lograr 3 cosas:

  1. busca la última label de git y divide la cadena en 3 valores (Major, Mino, Patch): cada label tendrá ese formatting. Guarde los datos obtenidos en las properties ext.versionMajor, etc.
  2. generar un código de versión
  3. generar un versionNumber

Mi objective es nunca preocuparme por las versiones de mis comstackciones manualmente. Simplemente siga configurando tags a través de git, este script de gradle debería actualizar automáticamente el código de versión y el número de versión.

El problema Cuando dejo que Gradle compile ese script, falla con un error en la línea 77 y el error simplemente dice 0 .

ext.versionMajor = Integer.parseInt(v[0]); 

No lo entiendo, ¿por qué falla allí? ¿Estoy asignando el valor incorrecto a las properties?

No soy un profesional de Gradle, estaría muy feliz si alguien tiene una idea de lo que estoy haciendo mal.

Enlace al script 1 enlace al script 2

Aquí está el código del file build.gradle en la carpeta de la aplicación de mi Proyecto Adnroid.

 apply plugin: 'com.android.application' ext.versionMajor = 0 ext.versionMinor = 0 ext.versionPatch = 0 ext.versionClassifier = null ext.isSnapshot = true ext.minimumSdkVersion = 21 //fetch version tag setVersionNumberByTag() android { compileSdkVersion 25 buildToolsVersion "25.0.3" defaultConfig { applicationId "com.webdesign.crf.eins" minSdkVersion minimumSdkVersion targetSdkVersion 25 versionCode generateVersionCode() versionName generateVersionName() testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' compile 'com.android.support:design:25.3.1' compile 'com.android.support:cardview-v7:25.3.1' compile 'com.android.support:support-v4:25.3.1' compile 'com.android.volley:volley:1.0.0' testCompile 'junit:junit:4.12' } private Integer generateVersionCode() { return minimumSdkVersion * 10000000 + versionMajor; } private String generateVersionName() { String versionName = "${versionMajor}.${versionMinor}.${versionPatch}" if (ext.versionClassifier == null) { if (isSnapshot) { versionClassifier = "SNAPSHOT" } } if (ext.versionClassifier != null) { versionName += "-" + versionClassifier } return versionName; } private String setVersionNumberByTag() { /* * Gets the version name from the latest Git tag */ def stdout = new ByteArrayOutputStream() exec { commandLine 'git', 'describe', '--tags' standardOutput = stdout } String verByGit = stdout.toString().trim() String[] v = new String[3]; v = verByGit.split("."); ext.versionMajor = Integer.parseInt(v[0]); ext.versionMinor = Integer.parseInt(v[1]); ext.versionPatch = Integer.parseInt(v[2]); } 

encontró una solución

 apply plugin: 'com.android.application' ext.versionMajor = null ext.versionMinor = 0 ext.versionPatch = 1 ext.versionClassifier = null ext.isSnapshot = true ext.minimumSdkVersion = 21 android { //fetch version tag setVersionNumberByTag() compileSdkVersion 25 buildToolsVersion "25.0.3" defaultConfig { applicationId "com.webdesign.crf.eins" minSdkVersion minimumSdkVersion targetSdkVersion 25 versionCode generateVersionCode() versionName generateVersionName() testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' compile 'com.android.support:design:25.3.1' compile 'com.android.support:cardview-v7:25.3.1' compile 'com.android.support:support-v4:25.3.1' compile 'com.android.volley:volley:1.0.0' testCompile 'junit:junit:4.12' } private Integer generateVersionCode() { return ext.minimumSdkVersion * 10000000 + ext.versionMajor * 10000 + ext.versionMinor * 100 + ext.versionPatch } private String generateVersionName() { String versionName = "${versionMajor}.${versionMinor}.${versionPatch}" if (ext.versionClassifier == null) { if (isSnapshot) { versionClassifier = "SNAPSHOT" } } if (ext.versionClassifier != null) { versionName += "-" + versionClassifier } return versionName; } private String setVersionNumberByTag() { /* * Gets the version name from the latest Git tag */ def stdout = new ByteArrayOutputStream() exec { commandLine 'git', 'describe', '--tags' standardOutput = stdout } def String verByGit = stdout.toString().trim() def (major, minor, patch) = verByGit.tokenize("."); ext.versionMajor = Integer.parseInt(major); ext.versionMinor = Integer.parseInt(minor); ext.versionPatch = Integer.parseInt(patch); } 

En los files gradle se usa groovy . Eso significa que no es posible usar someString.split("."); como normal en java. Descubrí que def (major, minor, patch) = verByGit.tokenize("."); Hizo el truco.