usar - git push tag
Cómo buscar el último hash de commit de git desde un script de compilación de ant (7)
¿Cómo puedo buscar el último hash de commit de git desde un script de construcción ant?
Actualmente estoy trabajando en un nuevo proyecto de código abierto que almaceno en github. Me gustaría extender mi archivo de compilación ANT existente para permitirme crear compilaciones numeradas. Estoy imaginando que lanzaría la compilación con algo como "Ant buildnum -Dnum = 12".
Me gustaría que el contenedor resultante tenga dos bits de información cruciales en su archivo de manifiesto:
- build.number = 12
- build.gitcommit =
Sé cómo crear la línea build.number. Sin embargo, no estoy seguro de cuál es la mejor fontanería para buscar el último hash de commit de git, que es el valor que quiero completar.
Este comando devuelve siempre la última confirmación SHA1 de la carpeta de trabajo, útil cuando no siempre se genera desde HEAD. El comando debe ejecutarse tanto en sistemas Windows como * nix
<exec executable="git" outputproperty="git.revision">
<arg value="log" />
<arg value="-1" />
<arg value="--pretty=format:%H" />
</exec>
¿Sería eso lo que estás buscando?
git rev-parse HEAD
Debe etiquetar una versión (comenzando con 0.1 o similar) y luego simplemente usar git describe
.
Esto le dará identificadores únicos legibles como puntos de referencia de su etiqueta. Cuando lo suelte, este número de versión será el que haya especificado.
En realidad usé ambas respuestas. El código de la hormiga que escribí fue el siguiente.
<target name="getgitdetails" >
<exec executable="git" outputproperty="git.tagstring">
<arg value="describe"/>
</exec>
<exec executable="git" outputproperty="git.revision">
<arg value="rev-parse"/>
<arg value="HEAD"/>
</exec>
<if>
<contains string="${git.tagstring}" substring="cannot"/>
<then>
<property name="git.tag" value="none"/>
</then>
<else>
<property name="git.tag" value="${git.tagstring}"/>
</else>
</if>
</target>
Escribí el siguiente objetivo ant para un proyecto en github. Uso:
- almacena la versión en la propiedad "repository.version"
- funciona si no hay git instalado o si no está presente el directorio .git (repliegue)
- otros objetivos deben depender de este objetivo si necesitan la versión de Git
- solo se ejecuta un comando git (- siempre)
<available file=".git" type="dir" property="git.present"/>
<target name="git.revision" description="Store git revision in ${repository.version}" if="git.present">
<exec executable="git" outputproperty="git.revision" failifexecutionfails="false" errorproperty="">
<arg value="describe"/>
<arg value="--tags"/>
<arg value="--always"/>
<arg value="HEAD"/>
</exec>
<condition property="repository.version" value="${git.revision}" else="unknown">
<and>
<isset property="git.revision"/>
<length string="${git.revision}" trim="yes" length="0" when="greater"/>
</and>
</condition>
</target>
Por ejemplo, se puede usar para expandir el token @repository.version@
en un archivo de plantilla:
<target name="index.html" depends="git.revision" description="build index.html from template">
<copy file="index.html.template" tofile="index.html" overwrite="yes">
<filterchain>
<replacetokens>
<token key="repository.version" value="${repository.version}" />
</replacetokens>
</filterchain>
</copy>
</target>
Escribí una tarea Ant para determinar la versión de compilación sin llamar explícitamente al comando Git, por lo que no necesito tenerlo instalado (en Windows también tendría que incluirlo en PATH
). El flujo de trabajo de versiones:
- Cualquier cambio de versión de "hito" (es decir, los primeros 2 o 3 números) se establece manualmente a través de etiquetas en la rama
master
. - Cada confirmación posterior a la etiqueta agrega al número de compilación. (Solo para etiquetas en
master
) - Si se construye desde una rama separada, su nombre debe incluirse en la versión.
Código fuente y ejemplos: https://github.com/Hunternif/JGitVersion
En una compañía grande encontré que la <exec> git command-line
se topó rápidamente con problemas, algunos desarrolladores usaron una GUI, algunos tenían diferentes versiones de línea de comandos instaladas en diferentes lugares, algunos tenían otros problemas. Me di cuenta de que el camino a seguir era una solución pura de Java con las dependencias como parte del sistema de compilación del proyecto, tal como lo habíamos usado anteriormente con Svnkit para Subversion.
Una condición era que solo se permitían las dependencias de la biblioteca "convencionales". Podríamos usar la biblioteca JGit, pero se excluyeron los muchos proyectos de tareas generadoras distribuidos alrededor de github y similares.
La solución fue usar una combinación de las bibliotecas build.xml y JGit.
TODO: pegar código ...