<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Git on Java &amp; Moi</title><link>https://javaetmoi.com/tags/git/</link><description>Recent content in Git on Java &amp; Moi</description><generator>Hugo</generator><language>fr</language><lastBuildDate>Tue, 06 Sep 2016 15:58:15 +0000</lastBuildDate><atom:link href="https://javaetmoi.com/tags/git/feed.xml" rel="self" type="application/rss+xml"/><item><title>Faire cohabiter merge Git et release Maven</title><link>https://javaetmoi.com/2016/09/merge-git-et-release-maven/</link><pubDate>Tue, 06 Sep 2016 15:58:15 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1630</guid><description>&lt;p&gt;L’utilisation conjointe de &lt;strong&gt;Maven&lt;/strong&gt; pour réaliser des release et de &lt;strong&gt;git-flow&lt;/strong&gt; peut s’avérer laborieuse.
En effet, lorsque vous travaillez avec des branches (quel que soit le SCM), une bonne pratique veut que chaque branche possède son propre numéro de version. Afin d’éviter des collisions de nommage, cette pratique devient indispensable lorsque vous utilisez un serveur d’intégration continue pour publier les artefacts construits dans un repo Maven.
Une fois une branche crée à partir d’une autre, chaque branche vit sa vie. Des releases Maven peuvent être réalisées de part et d’autre. Là où cela devient tendu, c’est lorsque vous devez reporter les commits d’une branche vers une autre. &lt;strong&gt;Des conflits de merge sur le numéro de version Maven apparaissent alors inévitablement&lt;/strong&gt;. Lorsque votre application multi-modules comporte 15 pom.xml, c’est 15 conflits qu’il va falloir gérer manuellement. Il est effectivement risqué de conserver aveuglément la version du pom.xml local ou distant, car d’autres changements (et vrais conflits) peuvent se produire dans d’autres sections du pom.xml.&lt;/p&gt;
&lt;p&gt;Comme cas d’études, prenons l’exemple du repo Git helloworld :&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="merge1"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/09/merge1.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="merge1"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2016/09/merge1.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Hook SVN et Git pour Maven sous Windows</title><link>https://javaetmoi.com/2015/01/hook-svn-git-maven-windows/</link><pubDate>Tue, 13 Jan 2015 06:29:47 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=1286</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2014/12/logo-maven.gif"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo-maven"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/12/logo-maven.gif"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Désormais ancrées dans le quotidien des développeurs, les plateformes d’ &lt;strong&gt;intégration continue&lt;/strong&gt; permettent de détecter rapidement tout problème de compilation, de tests en erreur ou même d’ &lt;a href="http://www.sonarqube.org/analysis-vs-preview-vs-incremental-preview-in-sonarqube/"&gt;ajout de défauts remontés par SonarQube&lt;/a&gt;. L’objectif fixé par le team leader est de ne pas faire échouer le build et, si c’est malheureusement le cas, tout arrêter pour le réparer. Sur certains projets, le gage donné au développeur ayant cassé le build est de ramener les viennoiseries le lendemain.
Pour être certain de ne pas faire chauffer sa carte de paiement, &lt;strong&gt;une bonne pratique consiste à exécuter une ligne de commande maven (ou gradle) avant chaque commit dans le gestionnaire de code source&lt;/strong&gt;. Cependant, sur certains changements que l’on juge mineur, il peut être tentant de passer outre. Aujourd’hui, les PC ou les Mac multi-coeurs avec SSD permettent de lancer un build sans freezer le poste de développement. C’est donc davantage par excès de confiance qu’à cause du temps d’attente qu’il arrive de casser Jenkins, Bamboo ou bien encore TeamCity.&lt;/p&gt;
&lt;p&gt;Pour contrer tout oubli, il est possible de systématiser l’exécution du build Maven avant de commiter. Les outils de gestion de configuration SVN et Git offrent un mécanisme de hook. Lors de la phase de pre-commit, on va demander au SCM d’exécuter un script de hook chargé de vérifier le code source. En cas d’erreur, le commit est refusé.
Ecrire de tels scripts n’est pas compliqué sous Linux car beaucoup d’exemples existent. Par contre, &lt;strong&gt;sous Windows&lt;/strong&gt;, c’est plus rare. &lt;strong&gt;L’objet d&lt;/strong&gt; &lt;strong&gt;e cet article est donc de vous donner des exemples de scripts de hook de pre-commit et de vous expliquer comment les configurer dans Tortoise SVN et Git.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo-maven"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2014/12/logo-maven.gif"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Ecraser une branche par une autre avec Git</title><link>https://javaetmoi.com/2013/08/ecraser-une-branche-par-une-autre-avec-git/</link><pubDate>Thu, 01 Aug 2013 18:13:55 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=735</guid><description>&lt;a href="wp-content/uploads/2013/07/git-logo.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Logo du SCM GIT"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2013/07/git-logo.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Dans le cycle de vie d’une application, il arrive parfois qu’ &lt;strong&gt;une branche prenne le pas sur une autre branche&lt;/strong&gt; et qu’il soit nécessaire d’écraser la seconde par la première. Prenons l’exemple d’une application où, par convention, le master (ou le trunk sous SVN) est considéré comme la branche de développement (axée vers le futur) et que l’utilisation du système de branches soit habituellement consacrée aux branches de maintenance. Dans certaines circonstances (ex : nouveaux développements à commencer pour la version N+2, migration technique à réaliser …), une branche peut prendre le dessus du master. Afin de retrouver la convention d’origine, une &lt;strong&gt;recopie de la branche sur le master&lt;/strong&gt; va, à termes, être nécessaire. Que ce soit avec Git ou git-svn, nous allons voir comment &lt;strong&gt;&lt;a href="http://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/strong&gt; peut nous y aider en &lt;strong&gt;quelques lignes de commande&lt;/strong&gt;.</description></item><item><title>Promotion de code en continue avec git-svn</title><link>https://javaetmoi.com/2013/03/promotion-code-continue-merge-git-svn/</link><pubDate>Tue, 19 Mar 2013 19:48:16 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=626</guid><description>&lt;p&gt;Dans le cadre d’un important &lt;strong&gt;chantier&lt;/strong&gt; de &lt;strong&gt;migration technique&lt;/strong&gt; d’une &lt;strong&gt;application&lt;/strong&gt;, j’ai eu l’occasion de pratiquer ce que j’appellerais la &lt;strong&gt;promotion de code en continue&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pour resituer le contexte, ce chantier dura plus de 6 mois. Entre le début et la fin de la migration, l’application a été livrée plusieurs fois en production, embarquant à chaque fois de nombreuses évolutions fonctionnelles. Nous avons donc dû nous organiser pour migrer l’application sans pénaliser l’avancement du reste de l’équipe.
Les changements techniques étant bien trop transverses à l’application, la stratégie de &lt;a href="http://martinfowler.com/bliki/FeatureToggle.html"&gt;Feature Toggle&lt;/a&gt; ne pouvait s’appliquer. Nous nous sommes donc dirigés vers une technique assimilable au &lt;a href="http://martinfowler.com/bliki/FeatureBranch.html"&gt;Feature Branch&lt;/a&gt; ; notre migration technique n’étant rien d’autre qu’une feature comme une autre. Logiquement, une branche dédiée à la migration a été créée.&lt;/p&gt;
&lt;p&gt;Notre stratégie fut de &lt;strong&gt;merger régulièrement dans cette branche le code issu de la branche de développement&lt;/strong&gt;. Une fois la migration terminée, la branche de migration a été à son tour mergée dans la branche de développement.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="Workflow de promotion en continue du trunk vers la branche"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2013/03/2013-03-promotion-continue-avec-git-svn.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Ma petite usine logicielle</title><link>https://javaetmoi.com/2012/12/ma-petite-usine-logicielle-github-cloudbees/</link><pubDate>Sat, 15 Dec 2012 09:08:10 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=436</guid><description>&lt;p&gt;Suite à &lt;a href="https://github.com/arey/maven-config-github-cloudbees/issues/1"&gt;une question&lt;/a&gt; qui m’a récemment été posée sur Github, j’ai réalisé que ce que j’avais mis en place pour des besoins personnels pouvait intéresser d’autres développeurs.&lt;/p&gt;
&lt;p&gt;Dans ce billet, je vais donc vous expliquer comment créer &lt;strong&gt;votre propre usine logicielle&lt;/strong&gt;. Déployée à cheval sur &lt;strong&gt;GitHub&lt;/strong&gt; et l’offre &lt;strong&gt;DEV@Cloud&lt;/strong&gt; de &lt;strong&gt;CloudBees&lt;/strong&gt;, vous y retrouverez les briques les plus classiques : SCM, intégration continue, dépôt de binaires, bug tracker, wiki …
Le gain : à chaque commit poussé dans GitHub, votre &lt;strong&gt;code&lt;/strong&gt; est &lt;strong&gt;compilé&lt;/strong&gt;, &lt;strong&gt;testé&lt;/strong&gt; unitairement puis &lt;strong&gt;déployé&lt;/strong&gt; dans un &lt;strong&gt;repository maven public&lt;/strong&gt; dédié aux Snapshots. Par ailleurs, vous pourrez effectuer des &lt;strong&gt;releases maven&lt;/strong&gt; en local depuis votre poste de développement ; les artefacts construits seront mis à disposition dans un repository maven dédié. Tout développeur pourra librement référencer l’un ou l’autre de ces repository et utiliser votre code.&lt;/p&gt;
&lt;p&gt;En bonus, si vous développez des projets open source, vous n’aurez même pas à sortir votre carte bancaire.
&lt;a href="wp-content/uploads/2012/12/cloudbees-github-jenkins.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="cloudbees-github-jenkins"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/12/cloudbees-github-jenkins.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="cloudbees-github-jenkins"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/12/cloudbees-github-jenkins.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item><item><title>Release Maven sous Windows d’un projet GitHub déployé sur CloudBees</title><link>https://javaetmoi.com/2012/04/release-maven-windows-github-deploy-cloudbees/</link><pubDate>Thu, 12 Apr 2012 19:42:24 +0000</pubDate><guid isPermaLink="false">http://javaetmoi.com/?p=81</guid><description>&lt;p&gt;&lt;a href="wp-content/uploads/2012/04/logo_github.png"&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo_github"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/04/logo_github.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/a&gt; Habitué aux releases maven avec SVN, j’ai rencontré quelques difficultés pour effectuer la première release du projet &lt;a href="https://github.com/arey/hibernate-hydrate"&gt;Hibernate Hydrate&lt;/a&gt; [1] hébergé sur GitHub et présenté dans un &lt;a href="http://javaetmoi.com/2012/03/hibernate-dites-adieu-aux-lazy-initialization-exception/"&gt;précédent billet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour rappel, lors d’une release, le plugin maven accède au gestionnaire de code source pour commiter les modifications effectuées sur les pom.xml et créer un tag. Il déploie ensuite les artefacts sur le repo maven distant.&lt;/p&gt;
&lt;p&gt;Mes contraintess techniques étaient les suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Plateforme de développement : &lt;strong&gt;Windows&lt;/strong&gt; 7, JDK 6, &lt;strong&gt;mSysGit&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Code source Java &lt;strong&gt;mavenisé&lt;/strong&gt; et hébergé sur &lt;strong&gt;GitHub&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Le repo maven sur lequel déployer les artefacts maven est hébergé par &lt;strong&gt;CloudBees&lt;/strong&gt; et accessible par le protocople &lt;a href="http://fr.wikipedia.org/wiki/WebDAV"&gt;Webdav&lt;/a&gt; [2]&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Les réponses apportées par ce billet sont :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Configuration maven pour GitHub&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Problème de passphrase SSH spécifique à Windows&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;**Configuration maven du repo CloudBees&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure&gt;
&lt;picture&gt;
&lt;img
loading="lazy"
decoding="async"
alt="logo_github"
class="image_figure image_internal image_unprocessed"
src="https://javaetmoi.com/wp-content/uploads/2012/04/logo_github.png"
/&gt;
&lt;/picture&gt;
&lt;/figure&gt;
&lt;/p&gt;</description></item></channel></rss>