Automatiser le déploiement des applications Java avec RPM

Quentin Vandekerckhove - mars 2015

comment installer une application java ?

  1. Vérifier les pré-requis
    Java, Tomcat sont-ils installés ? Sont-ils dans les versions requises ? Doit-on désinstaller une version antérieure de l'application ? Y'a t-il des services à arrêter ?
  2. Déployer l'application
    Quelles fichiers doit-on copier : jar/war ? Des fichiers de configurations sont-il attendus ? Peut-être des paramètres ou des variables d'environnement ? Y'a t-il de nouveaux paramètres ou des obsolètes ?
  3. Démarrer l'application
    Quels sont les services à relancer ? Où sont les logs pour vérifier le bon déroulement de l'application ?
     

Exemple de procédure pour une webapp

# Vérification des versions java
java -version | grep "1.7"

# Arrêt du serveur d'apps
service tomcat status
service tomcat stop

# Désinstallation de la version précédente
rm xxx/tomcat/webapps/myapp.war # version n-1
rm xxx/myapp.properties

# Installation de la nouvelle version
wget -O xxx/tomcat/webapps http://my_repository/myapp.war

# Mise à jour du fichier de configuration en fonction de l'environnement
vi xxx/myapp.properties
vi xxx/server.xml

# Redémarrage du serveur d'apps
service tomcat start

Exemple de procédure pour un batch

# Vérification des versions java
java -version | grep "1.7"

# Demander l'arrêt du batch s'il est en cours d'exécution
BATCH_PID=$( ps -ef | grep mybatch | awk '{print $2}' )
if [ -z "$BATCH_PID" ] ; then 
    kill -SIGTERM $BATCH_PID
fi

# Désinstallation de la version précédente
rm -rf /install_path/mybatch # version n-1

# Installation de la nouvelle version
wget -O /install_path/mybatch http://my_repository/myapp.jar

# Mise à jour du fichier de configuration en fonction de l'environnement
vi xxx/mybatch.properties

# Redémarrage du serveur d'apps
xxx/bin/mybatch param1 param2 param3 -Denvparam1=value1

Problèmatique

  • Connaissance de l'application indispensable pour réaliser l'installation
    Il faut savoir le serveur d'applications utilisés, l'emplacement des fichiers de configurations, les commandes d'arrêt/relance des services. Chaque application se retrouve avec un mode opératoire différent. 
  • Travail fastidieux
    Risque d'erreurs de saisie. Risque multiplié si l'installation se joue sur plusieurs instances.
  • Délégation de l'installation compliquée
    Passage aux équipes d'exploitation/run moins aisé. Besoin de former ces équipes à chaque changement de la procédure. 
  • Difficilement applicable dans un contexte Agile

ANTI-PATTERNS

configuration bird nest

Anti-pattern described as a network of circuitous indirections used to manage configuration and seem to intertwine like a labyrinth of straw in a bird nest.


https://code.google.com/p/devops-toolchain/wiki/ConfigurationBirdNest

Adhoc Release

The lack of standard practice and distribution mechanisms for releasing application changes.

 

https://code.google.com/p/devops-toolchain/wiki/AdhocRelease

Exemple de passage à l'exploitation d'une application non packagée

patterns

Packaged Artifact

A structured archive of files used for distributing any software release during the deployment process.

 

https://code.google.com/p/devops-toolchain/wiki/PackagedArtifact

Adaptive Deployment

Use data-driven automation and configuration management, that customizes software and configuration at deployment time.

 

https://code.google.com/p/devops-toolchain/wiki/AdaptiveDeployment

Code Data Split

Separate executable software files from environment specific deployment ones, identifying files that change during installation or operation, thereby facilitating cleaner upgrade process.

 

https://code.google.com/p/devops-toolchain/wiki/CodeDataSplit

Bénéfices

L'installation est standardisée, automatisée et plus sûre.
Pas de question à se poser: le rpm connaît les pré-requis et où il doit déposer l'application et ses configurations.

# Avec RPM en mode local
rpm -Uvh ./myapp-1.0.0.rpm
# Avec RPM en mode distant
rpm -Uvh http://my_repository/myapp-1.0.0.rpm

# Avec Yum en mode local
yum -y --nogpgcheck localinstall ./myapp-1.0.0.rpm 
# Avec Yum avec un référentiel RPM
yum -y install myapp-1.0.0.rpm

Bénefices

Le rollback est facile et rapide.
Il suffit de désinstaller la nouvelle version et d'installer à nouveau la précédente.

# Suppression de la version à rollbacker
rpm -e myapp-2.0.0

# Réinstallation de la version précédente
rpm -Uvh myapp-1.0.0.rpm

Bénéfices

Le déploiement est auditable pour des raisons de maintenance.
Quelle est la version de l'application? Des modifications manuelles ont-elles été réalisées sur l'application ou sur les configurations depuis la dernière installation ?

# Vérifier la version de l'application
$ rpm -qa | grep myapp
myapp-1.0.0.noarch.rpm

# Vérifier si l'application ou les configurations ont été altérée depuis son installation
$ rpm -Uvh hello-world-config-production-0.0.1-1.noarch.rpm hello-world-0.0.1-1.noarch.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:hello-world-config-production-0.0################################# [ 50%]
   2:hello-world-0.0.1-1.noarch.rpm################################# [100%]
$ rpm --verify hello-world-config-production hello-world   
       
$ rpm -ql hello-world-config-production
/etc/hello-world
/etc/hello-world/application.yml
$ echo "new.property=value" >> /etc/hello-world/application.yml 
$ rpm --verify hello-world-config-production            
S.5....T.  c /etc/hello-world/application.yml

Bénéfices

Le déploiement est auditable pour des raisons de sécurité.
Suite à une suspicion d'intrusion, RPM peut nous aider à savoir si une application a été altérée.

# Vérifier si l'application a été modifiée
$ rpm -V web-application
.M.......    /opt/apache-tomcat-8.0.18/webapps/hello-webapp.war

Légendes des indicateurs

S   size change
M   permissions change
5   MD5 changed
L   Symlink changed
D   Device change
U   User change
G   Group change
T   Date/Time change
missing   file is gone

Et la base de données alors ?

Un RPM peut embarquer les changelogs et les appliquer.

creation de rpm avec maven

Le plugin rpm-maven-plugin inclut la création du RPM dans le build de l'application.
http://mojo.codehaus.org/rpm-maven-plugin

Comme tous les plugins maven, il s'incorpore naturellement dans un outil d'intégration continue comme Jenkins.
L'hôte Jenkins doit cependant disposer de rpm-build.

https://github.com/nebula-plugins/gradle-ospackage-plugin

Un plugin similaire existe

aussi pour Gradle.

démo

mkdir ~/demo-workspace && cd ~/demo-workspace
git clone https://github.com/qvdk/salto-dojo-rpm-packaging.git
git clone https://github.com/qvdk/salto-dojo-rpm-packaging-settings.git

docker run -it -p 9001:9001 -p 8080:8080 -v ~/demo-workspace/workspaces qvdk/salto-dojo-rpm 

Automatiser le déploiement des applications Java avec RPM

By qvdk

Automatiser le déploiement des applications Java avec RPM

Ce document présente les intérêts à utiliser RPM pour installer des applications Java, sa mise en place dans un outil d'intégration continue. Ainsi que ses bénéfices dans les projets en mode Agile.

  • 635