web-dev-qa-db-fra.com

Comment rechercher le dernier hachage git commit à partir d'un script de construction ant

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:

  • build.number = 12
  • build.gitcommit =

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.

53
mchr

J'ai écrit la cible fourmi suivante pour un projet sur github. Usage:

  • stocke la version dans la propriété "repository.version"
  • fonctionne si aucun git n'est installé ou si aucun répertoire .git n'est présent (repli)
  • les autres cibles doivent dépendre de cette cible si elles ont besoin de la version git
  • une seule commande git est exécutée (- toujours)

<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>
79
jmuc

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>
21
Gian Marco Gherardi

Est-ce que c'est ce que vous cherchez?

git rev-parse HEAD
8
Olivier Verdier

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>
4
mchr

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:

  • Toutes les modifications de version "jalons" (c'est-à-dire les 2 ou 3 premiers chiffres) sont définies manuellement via des balises sur la branche master.
  • Chaque validation ultérieure à la balise ajoute au numéro de construction. (Uniquement pour les balises sur master.)
  • Si vous créez à partir d'une branche distincte, son nom doit être inclus dans la version.

Code source et exemples: https://github.com/Hunternif/JGitVersion

2
Hunternif

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é.

1
Dustin

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 ...

0
Ed Randall