Pascalleclercq's Blog

28/02/2010

Versionning et compatibilité ascendante

Filed under: architecture,OSGi — pascalleclercq @ 11:22
Tags: , , , ,

Je rencontre encore trop souvent des personnes qui bloquent inutilement les évolutions de leur système d’information par crainte de dysfonctionnement ou d’effort d’intégration trop important. Le métier lui,  souhaite que l’informatique s’adapte rapidement à de nouvelles exigences pour un coût raisonnable (Le fameux “Time to market”).

Il existe pourtant quelques bonnes pratiques permettant de satisfaire cette exigence. Celles-ci sont trop souvent méconnues. Commencez par réfléchir à l’architecture applicative de votre SI afin de dégager des contrats de services pérennes et gérez la compatibilité ascendante en vous appuyant sur une politique de versionning lisible. Enfin, garantissez la compatibilité ascendante en exécutant différents tests d’intégrations sur les différentes versions concernées

Architecture applicative.

Inutile d’ espérer répondre de manière satisfaisante aux défis cités ci-dessus sans avoir réfléchi à l’architecture applicative. Il s’agit ici d’organiser les données et traitement d’un Système d’information en ensembles cohérents.

Prenons un exemple basique, un système d’information constitué de 3 briques  :

- Une brique « connaissance du client »

- Une brique de référencement de produit.

- Une brique de commande client.

Dans les SI d’informations « réels », il existe bien plus de briques fonctionnelles. Ce qui rend l’objet de cet article encore plus pertinent.

Programmation par contrat.

La programmation par contrat permet de définir les points de jonctions  de vos briques applicatives.

Pour les amateurs de webservices, un contrat de service se définit à l’aide d’un WSDL.

Au minimum, un contrat de service se concrétise par une interface (ici IClientService) auquel il faut ajouter les objets échangés au travers de ce service.

image

Gestion de la compatibilité ascendante.

Cette notion est trop souvent éludée ou méconnue. Pourtant elle est fondamentale si vous souhaitez répondre rapidement et efficacement à de nouvelles exigences.

Par exemple, si vous souhaitez ajouter un support de communication avec votre client (ici une adresse de Facturation). Sans la gestion de la compatibilité ascendante, soit vous gérez plusieurs versions de la brique « connaissance du client », soit vous obligez la brique « commande client » à être re-livrée. Avec le temps et les nouvelles demandes, l’effort de maintenance peut évoluer de manière exponentielle. La solution passe inévitablement par la gestion de la compatibilité ascendante.

image

La fonctionnalité supplémentaire (ajout d’une adresse de facturation) ne pose pas de problème au code client déjà compilé, recetté et livré. La montée de version peut se faire très facilement sans risque de perturber le système existant.

Il existe de nombreux avantages à gérer la compatibilité ascendante :

  • Les autres briques du SI peuvent monter de version à leur rythme.
  • Cela permet de limiter le nombre de branches à maintenir.
  • Cela permet d’accélérer sensiblement le rythme des livraisons.

Politique de versionning.

Vous me direz : la gestion de la compatibilité ascendante, c’est très bien, mais il arrive parfois qu’il ne soit pas souhaitable de poursuivre la compatibilité ascendante et que le code obsolète ou déprécié doive être retiré.

C’est tout à fait vrai et il faut que cela reste possible. La question qui se pose alors est comment identifier une version qui supporte la compatibilité ascendante d’une version qui ne la supporte plus.

Tout simplement en utilisant une politique de versionning claire et facilement identifiable basée sur 3 nombres:

majeur.mineur.patch

où :

- Majeur, un changement nécessitant la mise à niveau du consommateur de service et de l’implémentation.

- Mineur, un changement nécessitant la mise à niveau du l’implémentation, mais pas du client.

- Patch, n’est  utile que pour la livraison d’implémentations, c’est à dire pour la correction de Bugs ou l’amélioration de fonctionnalité (performances).

Tests d’intégration.

Afin de garantir la compatibilité ascendante, il vous faudra également rédiger des tests d’intégrations dans un projet séparé et exécuter les tests prévus pour la version précédente sur la nouvelle version.

image

Liens et références.

Eclipse Version Numbering

Backward Compatibility (Excellent article qui m’a beaucoup aidé).

Portable Runtime Project (Apache)

Moving forward with Web services backward compatibility

14/02/2010

Construire ses plugins Eclipse RCP avec Maven ? C’est plus facile maintenant avec Maven 3 et Tycho !

Filed under: Eclipse RCP,Maven,OSGi — pascalleclercq @ 9:48

Il y a de cela un peu plus d’un an, lorsque je cherchais un moyen de construire un plugin Eclipse avec Maven, je tombais presque par hasard sur une réponse laconique de Jason Van Zyl (le papa de maven): « Tycho ».
Mais, me diriez-vous : On ne pouvait pas contruire de plugin Eclipse avec Maven avant ???

Eh bien, en pratique, on pouvait parvenir à compiler des sources, à générer des fichiers manifest.mf voire à construire des « product » mais à quel prix ! A titre d’illustration, je vous invite à lire l’excellent article de Cyril Lakech et vous aurez une mince idée de la sueur et des larmes qu’il fallait accepter de verser pour mettre en place Maven sur des plugins avant d’apercevoir le graal.

Une autre alternative consistait à développer et maintenir ses propres « Mojo »; Grégory Levilain a ces dernières années ainsi développé et déployé sur de nombreux projets un ensemble de plugins Maven permettant d’adopter une optique « POM-FIRST ». Cette approche laisse à Maven le soin de gérer les versions des éléments du projet (plugins, fragments, features, update-sites, products), et de leurs dépendances. Ces travaux ont été initiés en 2006 lors de la mise en open-source du projet Wazaabi.

Mais alors que fournit Tycho de si merveilleux ?

Tout d’abord, Tycho fournit un mécanisme de résolution de dépendances s’appuyant sur le fichier MANIFEST.MF du plugin. Cela présente un double intérêt :

  • Les bundles OSGi (dont les plugins Eclipse font partie) disposent d’un mécanisme de résolution de dépendances plus abouti que celui fourni par maven (dépendances non-transitives, possibilité de préserver tout ou partie des paquetages d’un bundle,…).
  • De cette façon, le développeur n’a pas à se préoccuper de l’utilisation de Maven : il peut se concentrer sur le manifest.mf comme il est censé le faire normalement dans le PDE sans se soucier du pom.xml.
  • Par ailleurs, le PDE résout les dépendances incroyablement plus rapidement que ne le feraient q4e ou m2e en s’appuyant sur les informations du pom.xml.

Au final, un pom.xml minimal permettant de construire un plugin Eclipse se réduit pratiquement toujours à :

<project>
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.mycompany.mygroup</groupId>
		<artifactId>parent</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<artifactId>com.mycompany.myplugin</artifactId>
	<packaging>eclipse-plugin</packaging>
</project>

Frugal n’est ce pas ?
Bien entendu, nous allons mettre des choses un peu plus intéressantes dans le pom.xml parent.

Le PDE et la notion de target platform

Avant d’aller plus loin, il est temps à présent de fournir un petit rappel concernant la façon d’utiliser le PDE (Plugin Development Environment). Par défaut, lorsque vous développez des plugins sous Eclipse vous utilisez la « target platform » courante. C’est à dire l’ensemble des plugins qui vous ont permis de démarrer votre IDE. C’est une très bonne pratique que de définir sa propre target platform:

  • Cela permet de travailler éventuellement sur une version différente des plugins Eclipse.
  • Cela permet de travailler sur un sous-ensemble des plugins (quelques dizaines suffisent la plupart du temps).
  • Cela permet d’ajouter vos propres plugins déjà construits sans polluer votre IDE.

Vous trouverez l’ensemble des target platform sous Eclipse dans « Windows–> preferences ->Plug-in Development -> Target Platform »

En somme, la target platform fournit les mêmes fonctionnalités qu’un repository Maven.

Il est donc tout à fait naturel de retrouver cette notion dans la résolution de dépendances de builds Tycho. Tycho propose actuellement 2 façons de résoudre la target platform utilisée pour ses builds.

  1. Par le biais du filesystem
  2. mvn  clean install -Dtycho.targetPlatform=c:/eclipse3.5
  3. De façon beaucoup plus élégante, par le biais de repository P2 et maven combiné
  4. <project>
      <modelVersion>4.0.0</modelVersion>
      <groupId>org.dynaresume</groupId>
      <artifactId>parent</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>pom</packaging>
      <modules>
        <module>infrastructure</module>
        <module>bundles-api</module>
        <module>bundles-impl</module>
        <module>bundles-ui</module>
      </modules>
      <build>
      <plugins>
            <plugin>
            <groupId>org.sonatype.tycho</groupId>
            <artifactId>tycho-maven-plugin</artifactId>
            <version>0.6.0</version>
            <extensions>true</extensions>
            </plugin>
            <plugin>
            <groupId>org.sonatype.tycho</groupId>
            <artifactId>target-platform-configuration</artifactId>
            <version>0.6.0</version>
            <configuration>
                <resolver>p2</resolver>
                <pomDependencies>consider</pomDependencies>
            </configuration>
            </plugin>
        </plugins>
       </build>
    
     <repositories>
           <repository>
            <id>gallileo</id>
            <layout>p2</layout>
     <url>http://download.eclipse.org/releases/galileo</url>
            </repository>
    
            <repository>
             <id>com.springsource.bundles.release</id>
             <name>SpringSource Bundle Releases</name>
             <url>http://repo.spring.com/release</url>
            </repository>
    
            <repository>
               <id>com.springsource.bundles.external</id>
               <name>External Bundle	Releases</name>
               <url>http://repo.spring.com/external</url>
            </repository>
    
        </repositories>
    </project>
    

Conclusion

Cela laisse présager des jours heureux pour tous les développeurs RCP. A titre individuel, je commence fortement à songer à l’utilisation de Tycho pour construire et assembler en headless non seulement des plugins RCP mais aussi tous les bundles OSGi qui se présentent.

Mais alors, vous allez me dire pourquoi n’ai je pas utilisé Tycho plus tôt ?

Principalement parce que Tycho ne fonctionne qu’avec Maven 3 dont les pseudo release alpha-x sont à peine sorties. Toutefois, rassurez vous, vos pom.xml actuels sont censés être parfaitement portables vers Maven 3. Des centaines de tests unitaires sont utilisés pour vérifier cela et actuellement il ne semble pas y avoir de défection.

Il subsiste un point sur lequel Tycho n’apporte pas à ce jour de réponse satisfaisante à ceux qui sont habitués aux cycles de développements fournis par Maven : la synchronisation pom.xml/manifest.mf lors de la phase de release. Ceci est en passe d’être corrigé dans la version 0.7.0.

Pour aller plus loin :

Thème Rubric. Créez un site Web ou un blog gratuitement sur WordPress.com.

Suivre

Recevez les nouvelles publications par mail.