Comment puis-je rechercher le dernier hachage git commit à partir d'un script de construction ant
Je travaille actuellement sur un nouveau projet open source que je stocke sur github. Je souhaite étendre mon fichier de génération ANT existant pour me permettre de créer des versions numérotées. J'imagine que je lancerais la construction avec quelque chose comme "ant buildnum -Dnum = 12".
Je voudrais que le pot résultant ait deux informations cruciales dans son fichier manifeste:
Je sais comment créer la ligne build.number. Cependant, je ne suis pas sûr de la meilleure plomberie pour trouver le dernier hashtag de git commit, qui est la valeur que je veux remplacer.
J'ai écrit la cible fourmi suivante pour un projet sur github. Usage:
<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>
Il par exemple être utilisé pour développer le jeton @repository.version@
dans un fichier de modèle:
<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>
Cette commande renvoie toujours le dernier commit SHA1 du dossier de travail, utile lorsque vous ne générez pas toujours à partir de HEAD. La commande doit être exécutée sur les systèmes Windows et * nix.
<exec executable="git" outputproperty="git.revision">
<arg value="log" />
<arg value="-1" />
<arg value="--pretty=format:%H" />
</exec>
Est-ce que c'est ce que vous cherchez?
git rev-parse HEAD
J'ai effectivement utilisé les deux réponses. Le code de fourmi que j'ai écrit était le suivant.
<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>
J'ai écrit une tâche Ant pour déterminer la version de construction sans appeler explicitement la commande Git, de sorte que je n'ai pas besoin de l'installer (sous Windows, je devrais également l'inclure dans PATH
). Le flux de travail de gestion des versions:
master
.master
.)Code source et exemples: https://github.com/Hunternif/JGitVersion
Vous devriez étiqueter une version (commençant par 0.1 ou similaire), puis utiliser simplement git describe
.
Cela vous donnera des identifiants uniques lisibles comme points de référence de votre tag. Lorsque vous publiez, ce numéro de version sera celui que vous avez spécifié.
Dans une grande entreprise, j'ai trouvé que <exec> git command-line
avait rapidement rencontré des problèmes. Certains développeurs utilisaient une interface graphique, certaines versions de lignes de commande étaient installées à des endroits différents, d'autres avaient d'autres problèmes. Je me suis rendu compte que le chemin à parcourir était une solution purement Java avec les dépendances faisant partie du système de construction du projet, comme nous l'avions utilisé auparavant avec Svnkit pour Subversion.
Une des conditions était que seules les dépendances «classiques» de la bibliothèque étaient autorisées. Nous pourrions utiliser la bibliothèque JGit mais les nombreux git ant task projets dispersés autour de github et autres ont été exclus.
La solution consistait à utiliser une combinaison de build.xml et de la bibliothèque JGit.
TODO: coller le code ...