Automatiser le déploiement des applications Java avec RPM
Quentin Vandekerckhove - mars 2015
comment installer une application java ?
- 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 ? - 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 ? - 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