Automatización de la versión de compilation de Android en Git

Solía ​​automatizar la versión de compilation en Subversion usando el siguiente script de Gradle:

import org.tmatesoft.svn.core.wc.* buildscript { dependencies { classpath 'com.neenbedankt.gradle.plugins:android-apt:1.2+' classpath 'com.android.tools.build:gradle:1.0.0' classpath group: 'org.tmatesoft.svnkit', name: 'svnkit', version: '1.7.11' } } def getSvnRevision() { //getting SVN revision # ISVNOptions options = SVNWCUtil.createDefaultOptions(true); SVNClientManager clientManager = SVNClientManager.newInstance(options); SVNStatusClient statusClient = clientManager.getStatusClient(); SVNStatus status = statusClient.doStatus(projectDir, false); SVNRevision revision = status.getRevision(); return revision.getNumber(); } android { compileSdkVersion 21 buildToolsVersion '21.1.2' defaultConfig { versionName = "1.0." + getSvnRevision() versionCode = 1000000 + getSvnRevision() } } 

Essense de esta secuencia de commands es get de revisión SVN repo current # y utilizarlo como la versión # para AndroidManifest.xml generado, como:

 <!-- Version number encoding: XXYYZZZ XX 2 digits - major version YY 2 digits - minor version ZZZ 3 digits - build (SVN revision) Example: 0123456 is version 1.23.456 --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="my.package" android:versionCode="1000650" android:versionName="1.0.650" > 

Hace mi vida mucho más fácil, por ejemplo, cuando recibo un informe de errores puedo localizar fácilmente la revisión con un problema. Realmente importa especialmente en el caso de que uno tenga varios probadores / puntos de distribución donde se cargan diferentes versiones.

Ahora pregunta:

¿Cómo puedo hacer algo similar con Git? En Git no hay un solo número de revisión, en cambio solo hay hash de twig, pero es alfanumérico. Android permite el uso solo de integers como código de versión.

Al final, he pensado cómo hacerlo. Aquí está el código:

 def getGitRevision = { -> try { def stdout = new ByteArrayOutputStream() exec { standardOutput = stdout commandLine 'git', 'rev-list', '--first-parent', '--count', 'master' } println("Building revision #"+stdout) return asInteger(stdout.toString("ASCII").trim()) } catch (Exception e) { e.printStackTrace(); return 0; } } android { /* Version number encoding: XXYYZZZB XX 2 digits - major version YY 2 digits - minor version ZZZ 3 digits - build (VCS revision) B 1 digit - build variation/patch Example: 01234561 is version 1.23.456a */ def char[] patches='abcdefghijklmnopqrstuwxyz'.toCharArray() def majorVersion=1 def minorVersion=3 def revision=getGitRevision() def patch=0 defaultConfig { applicationId "com.my.package" versionName = majorVersion + '.' + minorVersion + '.' + revision + patches[patch] versionCode = 10000000*majorVersion+10000*minorVersion + 10*revision+patch } 

Utilicé un script de shell para generar la versión e inyectarla como variables de entorno:


 # the build command (bash) in CI server # versionCode: number of commits that are reachable from here # *supposedly* monotonically increasing for each release build export ANDROID_VERSION_CODE="$(git rev-list HEAD --count)" # versionName: first 8 chars in commit SHA1 export ANDROID_VERSION_NAME="${GIT_COMMIT:0:8}" 

 // build.gradle // read env variable as string or integer def env = { System.getenv it } def envInt = { Integer.parseInt(env(it)) } android { defaultConfig { if (env("ANDROID_VERSION_CODE")) { versionCode envInt("ANDROID_VERSION_CODE") versionName env("ANDROID_VERSION_NAME") } else { // fallback versionCode 1 versionName "1.0" } } }