Créer un tag svn en utilisant Ant

Publié le 04/08/2011

Comme beaucoup d’informaticiens, je n’aime pas spécialement effectuer des tâches répétitives. Si une tâche l’est, alors il vaut mieux la remplacer par un script automatique. Le gain est d’ailleurs double. On ne se lasse pas à cause d’un processus un peu long ou ennuyeux, et surtout on évite les bourdes dues au facteur humain.

Alors comme aujourd’hui, j’en avais plus qu’assez de faire toujours mes tags de livraison sur le SVN de la boîte de façon manuelle, je me suis créé un petit script Ant pour ça. L’article va donc présenter les différentes étapes pour mettre en place ce système.

Récupérer les bibliothèques utiles

Tout d’abord, commençons par récupérer les bibliothèques utiles. Ne connaissant pas spécialement les bibliothèques permettant de manipuler un dépôt svn via ant, j’ai décidé arbitrairement de prendre celle fournie par le projet Subclipse. Vous pouvez directement télécharger le contenu de la bibliothèque à l’adresse suivante. Accéder à svnant.

Téléchargement direct des bibliothèques :

Créer un script de tags

On va commencer sous Eclipse par créer un projet Java simple. Personnellement, je l’ai nommé fr.jabbytechs.ant.svnutilities.

creer un tag svn en utilisant ant pic 1

Une fois le projet créé vous obtenez normalement ceci :

creer un tag svn en utilisant ant pic 2

On ajoute un répertoire lib pour nos futures bibliothèques, ainsi que deux fichiers. Le premier est un fichier xml et le second un .properties. On peut par exemple les nommer svn-utilities.xml et svn-utilities.properties.

Ajouter les bibliothèques suivantes dans le dossier lib de notre projet. Elles sont disponibles dans l’archive de svnant.

  • jna.jar

  • svnant.jar

  • svnClientAdapter.jar

  • svnjavahl.jar

  • svnkit.jar

Vous devriez obtenir quelque chose semblable à l’arborescence suivante. A noter que l’on a pas besoin de ganymed.jar pour la suite. D’ailleurs, je n’ai pas non plus vérifié à quoi il servait puisque cela fonctionne sans.

creer un tag svn en utilisant ant pic 3

Commençons maintenant par ajouter les lignes suivantes à notre fichier xml. Ensuite rafraîchir le projet Java afin qu’Eclipse prennent en compte le fait que notre fichier est de type Ant. Ce sera plus pratique pour la suite.

<?xml version="1.0"?>
<project name="fr.jabbytechs.ant.svnutilities" basedir=".">
    <property file="svn-utilities.properties" />
</project>

On ajoute maintenant la configuration pour faire fonctionner svnant.

<?xml version="1.0"?>
<project name="fr.jabbytechs.ant.svnutilities" basedir=".">

    <property file="svn-utilities.properties" />

    <path id="path.svnant">
        <pathelement location="${basedir}/lib/svnant.jar" />
        <pathelement location="${basedir}/lib/svnClientAdapter.jar" />
        <pathelement location="${basedir}/lib/svnkit.jar" />
        <pathelement location="${basedir}/lib/svnjavahl.jar" />
        <pathelement location="${basedir}/lib/jne.jar" />
    </path>

    <typedef resource="org/tigris/subversion/svnant/svnantlib.xml" classpathref="path.svnant" />

    <!-- ****************************************************************** -->
    <!-- svn.settings : correspond aux différentes réglages pour les       -->
    <!--         tâches svnant. Les données d'entrées se situes dans le     -->
    <!--         fichiers svn-utilities.properties                    -->
    <!-- ****************************************************************** -->
    <svnSetting
        javahl="${svnant.javahl}"
        svnkit="${svnant.svnkit}"
        username="${svn.username}"
        password="${svn.password}"
        failonerror="false"
        id="svn.settings"
        />
</project>

La première balise ajoutée est « path ». Elle permet d’enrichir le classpath d’exécution de ant. On y liste les bibliothèques que l’on a ajouté au projet java. La seconde balise que l’on ajoute, correspond à la recherche dans le classpath des implémentations des fonctions que nous utiliserons. Sans ça, svnant ne fonctionnera pas. Enfin la dernière correspond à la configuration de antsvn. J’y ai listé les différentes informations dont nous aurons besoin. Comme vous pouvez le remarquer, je n’ai pas mis directement les valeur mais des variables de la forme ${XXX}. Nous y reviendrons.

La configuration est maintenant terminé. On va pouvoir s’atteler à notre tâche Ant de création d’un tag. Vous allez voir c’est vraiment très simple.

<!-- ****************************************************************** -->
<!-- svntag: cree un TAG pour le projet                                 -->
<!-- ****************************************************************** -->
<target name="svn-tag" description="creation d'un tag d'un projet sur le svn">

    <property name="src.url" value="${svn.repository.url}/${project.name}/trunk/" />
    <property name="dest.url" value="${svn.repository.url}/${project.name}/tags/${tag.name}" />

    <echo message="${src.url}" />
    <echo message="${dest.url}" />
    <echo message="${svn.tag.message}" />

    <svn refid="svn.settings" >
        <copy srcUrl="${src.url}" destUrl="${dest.url}" message="${svn.tag.message}" />
    </svn>

</target>

Pour ceux qui débute juste avec Ant, quelques petites explication s’imposent. La balise property permet de déclarer une nouvelle propriété. D’ailleurs un peu après j’utilise les deux créées en début de tâche. Ensuite, la balise echo permet d’afficher un message. Là, ça nous permettra d’afficher dans la console Eclipse les données que l’on a en entrée. Enfin, la dernière balise permet de faire le tag en lui même. Elle prend peu de paramètre. La configuration créée précédemment, le chemin de la source, le chemin de destination et le message du tag. Tout le reste du travail se fera automatiquement.

Maintenant, revenons vers nos différentes variables ${XXX} utilisées dans le script. Elles sont au nombre de 11.

  • ${basedir} : répertoire de départ par rapport auquel on construit les chemins relatifs nécessaire

  • ${svnant.javahl} : permet de dire si nous utiliserons javahl pour lire/modifier le dépôt SVN

  • ${svnant.svnkit} : permet de dire si nous utiliserons svnkit pour lire/modifier le dépôt SVN

  • ${svn.username} : nom d’un utilisateur du dépôt. En l’occurence, il faut les droits de modification pour notre cas

  • ${svn.password} : mot de passe de l’utilisateur

  • ${svn.repository.url} : url vers le dépôt SVN

  • ${project.name} : nom du projet sous le dépôt. Ceci permettra dans mon cas de réutiliser le script pour d’autres projets.

  • ${tag.name} : nom du tag que l’on veut créer

  • ${src.url} : url à partir de laquelle on va copier nos données pour créer le tag

  • ${dest.url} : url dans laquelle on va copier les données

  • ${svn.tag.message} : message qui sera mis sur le dépôt SVN au niveau du tag

Nous allons les déclarer et indiquer leur valeur dans le fichier svn-utilities.properties que nous avons créé au tout départ. Toutes ne seront pas listé dans le fichier. En effet, ${basedir} a déjà été déclaré à la seconde ligne du fichier Ant et pour ${src.url} et ${dest.url}, elles sont construite dans la tâche Ant. Voici le contenu du fichier.

svn.repository.url=svn://localhost/MON_DEPOT
project.name=monprojet
tag.name=1.0
svn.tag.message=Creation du tag ${tag.name} pour le projet ${project.name} a partir du trunk
svnant.javahl=false
svnant.svnkit=true
svn.username=jabberwock
svn.password=jabby

Il ne vous reste plus qu’à paramétrer le script selon vos besoins et à le lancer via Eclipse. Clic droit sur le fichier Ant > Run as… > Ant build

Quelques autres scripts de manipulation du svn utiles

Création d’une branche

Le système est similaire à la création d’un tag.

<!-- ****************************************************************** -->
<!-- svn-branch: creation d'une branche de travail pour le projet        -->
<!-- ****************************************************************** -->
<target name="svn-branch" description="Creation d'une nouvelle branche de travail pour un projet">

    <property name="src.url"  value="${svn.repository.url}/${project.name}/${branch.source}"/>
    <property name="dest.url" value="${svn.repository.url}/${project.name}/branches/${svn.branch.name}"/>

    <echo message="${svn.branch.message}"/>
    <echo message="${src.url}"/>
    <echo message="${dest.url}"/>

    <svn refid="svn.settings">
        <copy srcUrl="${src.url}" destUrl="${dest.url}" message="${svn.branch.message}"/>
    </svn>
</target>

Exporter un projet

<!-- ****************************************************************** -->
<!-- svn-export: cree un export d'un projet                             -->
<!-- ****************************************************************** -->
<target name="svn-export" description="Permet d'exporter un projet">

    <property name="src.url"  value="${svn.repository.url}/${project.name}/tags/${tag.name}"/>
    <property name="dest.url" value="${svn.export.dest.url}"/>

    <echo message="${svn.export.message}"/>

    <svn refid="svn.settings">
        <export srcUrl="${src.url}" destPath="${dest.url}/${project.name}"/>
    </svn>
</target>

Faire un checkout d’un projet

<!-- ****************************************************************** -->
<!-- svn-checkout-latest: daire le checkout d'un projet                    -->
<!-- ****************************************************************** -->
<target name="svn-checkout">
    <property name="src.url"  value="${svn.repository.url}/${project.name}/trunk"/>
    <property name="dest.url" value="${svn.checkout.dest.url}"/>

    <svn refid="svn.settings">
        <checkout url="${src.url}" revision="${svn.checkout.revision}" destPath="${dest.url}" />
    </svn>
</target>

Conclusion

Voilà pour les quelques exemples d’utilisation de svnant pour manipuler son dépôt SVN. Bien entendu, ce n’est pas les seuls scripts qui peuvent être créé et je vous invite à consulter la documentation officielle de svnant pour améliorer/enrichir ces scripts.

Vous trouverez sur le lien suivant un projet Eclipse pret à l’emploi. Il contient les Ant postés dans cet article. fr.jabbytechs.ant.svnutilities