Cómo obtener el siguiente número de compilación en Gradle


¿Hay alguna forma de obtener la siguiente versión cuando se publica en un repositorio en gradle?

Por ejemplo, si tengo la versión 3.0.1 en mi repositorio, quiero que la versión publicada sea 3.0.2.

ivy tiene una tarea para ant nombre buildnumber que hace exactamente eso:

<project xmlns:ivy="antlib:org.apache.ivy.ant"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<target name="ivyBuildNumber" description="Use ivy get the next build number">
    <ivy:buildnumber
        resolver="url-chain"
        organisation="${ivy.organisation}"
        module="${ivy.module}"
        revision="${version.base}"/>

    <echoproperties prefix="ivy.new."/>
</target>

Hay una manera de hacerlo en gradle? si no, ¿cómo puedo acceder a las tareas ivy desde ant de gradle?

En mi build.gradle Llamo al ant

ant.importBuild 'build.xml'
Author: Daniel Taub, 2017-11-19

5 answers

No creo que haya soporte en Gradle, pero puedes intentar usar la tarea Ant. https://docs.gradle.org/current/userguide/ant.html#sec:import_ant_build

Otra forma de hacer esto es usar algún tipo de plugin, o tarea personalizada para administrar la versión.

 9
Author: chenrui,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-21 00:29:55

Sí, puede acceder a las tareas de ivy desde el script ant importando la compilación de ant.archivo xml para la compilación de gradle.archivo gradle. A continuación se muestra la sintaxis para hacerlo.

Ant.importBuild ' build.xml "

Por favor refiérase: https://docs.gradle.org/current/userguide/ant.html#sec:import_ant_build

 7
Author: sricheta ruj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-27 08:31:01

Te recomiendo que uses el complemento de liberación de ResearchGate https://github.com/researchgate/gradle-release Tiene una bonita documentación. Fácil de leer. Además, echa un vistazo a cómo lo usé en mi proyecto personal. https://github.com/vatolinrp/bitcoin-esb/blob/master/build.gradle Sería un buen ejemplo para ti.

 5
Author: rastaman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-27 09:18:15

Después de un largo trabajo, me las arreglé para hacer eso.

En mi build.gradle He añadido el siguiente código

ant.importBuild 'build.xml'

task getNextBuild(dependsOn : ivyBuildNumber) {
    doLast{
        def nextVersion = ant.properties['ivy.new.revision']
        println nextVersion
    }
}

Importé mi archivo de compilación ant y creé una tarea que llama al ivy buildnumber tarea.

Ahí está mi construcción.xml

<project xmlns:ivy="antlib:org.apache.ivy.ant">

    <target name="ivyBuildNumber">
        <path id="ivy.classpath" path="lib/ivy.jar" />
        <typedef resource="org/apache/ivy/ant/antlib.xml" uri="antlib:org.apache.ivy.ant" classpathref="ivy.classpath" />
        <ivy:buildnumber
            organisation="daniel"
            module="hello"/>
        <echoproperties prefix="ivy.new."/>
    </target>
</project>

Porque mi IDE (Intellij), no tenía ivy.jar en el contenido,
Importé el ivy.jar de mi directorio raíz (lib/ivy.jar)

 4
Author: Daniel Taub,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-20 11:59:57
  • Para este comportamiento exacto , se puede invocar la tarea Ivy buildnumber usando pure Gradle sin importar la compilación Ant:
configurations {
    antTasks // define a new configuration
}

repositories {
    mavenCentral()
}

dependencies {
    antTasks("org.apache.ivy:ivy:2.4.0") // add Ivy library to it
}

ext {
    // define the Ivy task, using the extra configuration as classpath extension
    ant.taskdef(name: "ivyBuildNumber", 
                classname: "org.apache.ivy.ant.IvyBuildNumber", 
                classpath: configurations.antTasks.asPath) 

    ant.ivyBuildNumber(organisation: "daniel", module: "hello")
    nextVersion = ant.properties["ivy.new.revision"]
}

task demo {
    doLast {
        println nextVersion
    }
}
  • En general , Gradle no tiene ningún complemento equivalente a Maven Release, por lo que uno tiene que confiar en los complementos. Un complemento sólido es gradle-release de ResearchGate, el otro es axion de Allegro Tech. El primero es el estilo clásico de versiones Maven, el segundo toma a SCM como la única fuente de verdad, eliminando el control de versiones en los archivos de compilación. Pero ninguno de estos plugins proporciona el comportamiento exacto solicitado.

  • Mi opinión personal sobre el problema del control de versiones fue inicialmente usar algunos complementos. Dado que uso Bamboo como servidor CI en el trabajo, literalmente todo lo que hice con los complementos de liberación usando Gradle se bloqueó en el servidor CI tarde o temprano. Podría haber funcionado durante algunas semanas, pero cada actualización del servidor trajo algunos problemas. Terminé usando el enfoque sin SCM con una convención simple: use el nombre de la rama como versión base, concaténelo con el número de compilación (ambos valores son proporcionados por el servidor CI):

ext {
    branch = System.getProperty("branch", "develop")
    buildNumber = System.getProperty("buildNumber", "latest")
    isRelease = System.getProperty("isRelease", "false").toBoolean()
    artifactVersion = "${branch}${(isRelease ? ".$buildNumber" : "-SNAPSHOT")}"
}

Se puede configurar el servidor CI para ejecutar el siguiente comando

./gradlew -DisRelease=true -Dbranch=${git.branch} -DbuildNumber=${build.number} mavenPublish

Cuando se presiona el botón 'Soltar'. Por ejemplo, la compilación 12 de la rama 3.0 producirá la versión 3.0.12 en el repositorio binario.

Las ventajas son:
+ la versión viene gratis, asumiendo que las ramas son nombradas en consecuencia
+ el número de compilación auto-incrementado también viene gratis
+ uno puede publicar fácilmente revisiones personalizadas
+ sin plugins significa que no hay problemas con las actualizaciones de la versión de Gradle
+ este enfoque es muy simple y siempre funciona

Las desventajas son:
- sin etiquetas (sin cambios en absoluto en SCM - sin ramas de liberación, etc.), pero dado que el número de compilación siempre se conoce, se puede ver la revisión en el historial de compilaciones de CI
- algunos números de construcción se omitirán, obviamente (por ejemplo, la siguiente versión después de 3.5.76 puede ser 3.5.84)

 1
Author: jihor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-26 19:06:01