mardi 12 avril 2011

Automatiser l'installation d'applications - Partie 1

La procédure d'installation d'un système d'information complexe prend généralement des allures de cauchemard, avec un grand nombre d'actions relevant de l'utilisateur et une procédure d'installation à l'ergonomie douteuse. Dans cet article, nous verrons comment simplifier une installation à l'aide de l'outil IzPack.


Introduction

Nous disposons d'une application web baptisée hello-world-webapp-1.0.war. Elle doit être déployée dans un serveur Tomcat. Nous l'installons sur une machine dédiée, sur laquelle aucun composant n'est installé à l'exception de l'OS et de la machine virtuelle Java.

La procédure d'installation basique impliquerait les éléments suivants :

  • Copier l'archive zip de Tomcat sur le serveur
  • L'extraire dans un dossier donné
  • Créer un répertoire dans le dossier "webapps" de Tomcat
  • Copier l'application war sur le serveur
  • Extraire l'application dans le dossier nouvellement créé

Bien que les opérations à réaliser soient simples, nous remarquons tout de suite qu'elles sont déjà nombreuses pour un simple hello world.


Présentation de IzPack

IzPack est un logiciel Open-Source permettant de réaliser des installateurs (installers) à la manière d'un InstallShield, mais multi-plateformes.

IzPack fonctionne principalement grace à la compilation d'un installateur personnalisé grace à un fichier install.xml. Nous allons l'utiliser afin d'automatiser toutes les étapes listées précédemment.


Mise en place du projet Maven

Tout d'abord, nous créeons un projet Maven qui aura pour but de packager tout notre système, c'est à dire :

  • L'archive du serveur Tomcat
  • Notre application hello-world-webapp-1.0.war
  • Les fichiers requis par IzPack

Nous définissons les propriétés de notre projet (en particulier la version de IzPack et le dossier de travail) :

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <staging.dir>${project.build.directory}/staging</staging.dir>
    <izpack.standalone.compiler.version>4.3.2</izpack.standalone.compiler.version>
</properties>

Ensuite, il ne reste plus qu'à inclure le plugin izpack-maven-plugin dans le processus de build :

<!-- Used to configure IzPack installer -->
<plugin>
    <groupId>org.codehaus.izpack</groupId>
    <artifactId>izpack-maven-plugin</artifactId>
    <version>1.0-alpha-5</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>izpack</goal>
            </goals>
            <configuration>
                <izpackBasedir>${staging.dir}/izpack</izpackBasedir>
            </configuration>
        </execution>
    </executions>
    <dependencies>
        <dependency>
            <groupId>org.codehaus.izpack</groupId>
            <artifactId>izpack-standalone-compiler</artifactId>
            <version>${izpack.standalone.compiler.version}</version>
        </dependency>
    </dependencies>
</plugin>
<!-- Instead of working in the src/ folder, create a staging directory and copy every ressources in this folder -->
<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.4.2</version>
    <executions>
        <execution>
            <id>copy-resources</id>
            <phase>validate</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <encoding>UTF-8</encoding>
                <outputDirectory>${staging.dir}</outputDirectory>
                <resources>
                    <resource>
                        <directory>src/main/resources</directory>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>

Configuration d'IzPack

Bien qu'assez standard, nous allons décrire la configuration d'IzPack mise en oeuvre.

Les propriétés générales de l'application sont renseignées :

<info>
    <appname>pingtimeout-sample-installer</appname>
    <appversion>1.0</appversion>
    <authors>
        <author email="pierre@pingtimeout.fr" name="Pierre Laporte" />
    </authors>
    <url>http://www.pingtimeout.fr</url>
    <uninstaller write="no" />
    <javaversion>1.6</javaversion>
    <requiresjdk>yes</requiresjdk>
    <writeinstallationinformation>no</writeinstallationinformation>
    <pack200 />
</info>

Nous disposons de 6 écrans au total, parmi lesquels les écrans d'accueil, d'information et d'affichage de la licence :

<panels>
    <panel classname="HelloPanel" />
    <panel classname="InfoPanel" />
    <panel classname="LicencePanel" />
    <panel classname="TargetPanel" />
    <panel classname="InstallPanel" />
    <panel classname="SimpleFinishPanel" />
</panels>

Nous pouvons maintenant nous intéresser au coeur de l'installateur : les paquets (packs). Premièrement, nous avons un "pack" contenant l'archive du serveur zip Tomcat. Nous la copions dans un dossier de travail.

<pack name="Copy Apache Tomcat package" preselected="yes" required="yes">
    <description>Copy Apache Tomcat package in $INSTALL_PATH/work/</description>
    <file override="true"
          src="../tomcat/apache-tomcat-7.0.12.zip"
          targetdir="$INSTALL_PATH/work/">
        <os family="Unix" />
    </file>
</pack>

Ensuite, nous copions les scripts qui automatiseront l'installation dans ce même dossier de travail. Durant cette phase, nous exécutons le script "unzip-tomcat.sh" qui permet d'extraire le serveur d'applications.

<pack name="Unzip Apache Tomcat" preselected="yes" required="yes">
    <description>Unzip Apache Tomcat in $INSTALL_PATH/work/</description>
    <depends packname="Copy Apache Tomcat package" />
    <file override="true"
          src="../scripts"
          targetdir="$INSTALL_PATH/work/">
        <os family="Unix" />
    </file>
    <executable failure="abort"
                keep="true"
                stage="postinstall"
                targetfile="$INSTALL_PATH/work/scripts/unzip-tomcat.sh">
        <args>
            <arg value="$INSTALL_PATH" />
        </args>
    </executable>
</pack>

Enfin, nous déployons l'application "hello-world" dans un répertoire dédié du serveur Tomcat par le biais du script deploy-helloworld.sh.

<pack name="Install Hello World application" preselected="yes" required="yes">
    <description>Copy the Hello World WAR in Tomcat webapp directory</description>
    <depends packname="Unzip Apache Tomcat" />
    <file override="true"
          src="../applications/hello-world-webapp-1.0.war"
          targetdir="$INSTALL_PATH/work/">
        <os family="Unix" />
    </file>
    <executable failure="abort"
                keep="true"
                stage="postinstall"
                targetfile="$INSTALL_PATH/work/scripts/deploy-helloworld.sh">
        <args>
            <arg value="$INSTALL_PATH" />
        </args>
    </executable>
</pack>

Compilation de l'installateur

C'est terminé. Il ne nous reste qu'à exécuter la commande mvn clean install dans le dossier de notre projet pour que l'installateur soit généré.

Voici les captures d'écran de l'installateur ainsi créé.

Ecran 1 - Accueil

Ecran 2 - Informations générales

Ecran 3 - Licence

Ecran 4 - Dossier de destination

Ecran 5 - Avancement de l'installation

Ecran 6 - Fin de l'installation


Après l'installation, il ne reste plus qu'à exécuter le programme startup.sh de Tomcat pour pouvoir accéder à l'application déployée à l'adresse http://localhost:8080/hello-world/


Conclusion

IzPack permet de faciliter grandement le déploiement de systèmes d'informations. Ceci fera l'objet de quelques tutoriels supplémentaires sur PingTimeout.

Nous venons de réaliser un installateur capable d'installer un serveur d'application ainsi que de déployer une application dans ce serveur nouvellement créé. En procédant ainsi, nous réduisons les risques d'erreur liés à une mauvaise saisie et nous donnons un look beaucoup plus agréable à notre phase d'installation


Ressources

Les ressources utilisées dans ce tutoriel sont les suivantes :

Des astuces sur IzPack ? D'autres méthodes pour installer des applications ? Exprimez-vous dans les commentaires :)

Aucun commentaire:

Enregistrer un commentaire