Upgrade to Pro — share decks privately, control downloads, hide ads and more …

L’approche packaging natif

L’approche packaging natif

Présentation en français au ParisJUG sur l'utilisation du packaging natif (RPM) pour faciliter les déploiements

Avatar for Henri Gomez

Henri Gomez

January 10, 2012
Tweet

More Decks by Henri Gomez

Other Decks in Technology

Transcript

  1. Henri Gomez CI Architect @ Axway +20 ans dans l’industrie

    logicielle Architecte Java, CI et Direction de production OpenSource Activist Apache Tomcat JPackage openjdk-osx-build
  2. Définition d’un livrable C’est un artefact utilisable par les équipes

    up-stream Pour un Dev ce sont donc les équipes QA et/ou Ops
  3. Les questions à se poser Gestion des pré-requis Cycle de

    vie (mise à jour, suppression) Quid du déploiement (qui, quoi, comment) Localisation dans le FileSystem (FHS rules) Les droits d'exécutions et accès dans le FileSystem
  4. Packaging Natif Coeur de la pile applicative des OS Gestion

    des dépendances Mise à jour automatique ou sélective Largement utilisé par les Ops
  5. Packaging sous Unix RPM (Redhat Package Manager) sous RHEL/CentOS/ Fedora,

    SLES/OpenSuse, Mandriva DEB sous Debian/Ubuntu PKG sous Solaris
  6. Qu’est-ce qu’un package ? Un fichier (.rpm, .deb) Des données

    (fichiers et programmes) Du code exécuté lors de l’installation, la mise à jour ou la suppression du package Lié à une architecture (Intel, ARM, PowerPC en 32 ou 64bits) ou neutre (exemple: une application Java)
  7. Points communs avec Maven Construction par DSL Quelques commandes pour

    les manipuler (rpm, apt-get) Gestion des dépendances pour la construction mais aussi pour l’exécution Dépôts de packages, accessible en local ou via HTTP Nexus et Artifactory peuvent servir de dépôts RPM Mises à jour automatiques ou contrôlées
  8. Construire un RPM Des fichiers binaires - depuis l’entrepôt de

    livrables Des sources - depuis le SCM Un fichier de construction, le SPECFILE
  9. Entête déclaratif Name: myapp Version: 1.0.0 Release: 1 Summary: MyApp

    powered by Apache Tomcat Group: Applications/Communications URL: http://www.mycorp.org/ Vendor: MyCorp Packager: MyPackager License: AGPLv1 BuildArch: noarch %define tomcat_rel 7.0.22 %define myapp myapp %define myappusername myuser %define myappuserid 1234 %define myappgroupid 1234 Requires: java = 1.6.0 Source0: apache-tomcat-%{tomcat_rel}.tar.gz Source1: myapp.war %description MyApp powered by Apache Tomcat
  10. Construction %prep %setup -q -c %build %install # Prep the

    install location. rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT%{_initrddir} mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
  11. Hook de pré-install %pre %if 0%{?suse_version} > 1140 %service_add_pre %{myapp}.service

    %endif # add user and group %{_sbindir}/groupadd -r -g %{myappgroupid} %{myappusername} 2>/dev/null || : %{_sbindir}/useradd -s /sbin/nologin -c "%{myapp} user" -g %{myappusername} -r -d % {myappdir} -u %{myappuserid} %{myappusername} 2>/dev/null || :
  12. Hook de post-install %post %if 0%{?suse_version} > 1140 %service_add_post %{myapp}.service

    %endif if [ "$1" == "1" ]; then # register app as service systemctl enable %{myapp}.service >/dev/null 2>&1 # Generated random password for RO and RW accounts RANDOMVAL=`echo $RANDOM | md5sum | sed "s| -||g" | tr -d " "` sed -i "s|@@SKEL_RO_PWD@@|$RANDOMVAL|g" %{_sysconfdir}/sysconfig/%{myapp} RANDOMVAL=`echo $RANDOM | md5sum | sed "s| -||g" | tr -d " "` sed -i "s|@@SKEL_RW_PWD@@|$RANDOMVAL|g" %{_sysconfdir}/sysconfig/%{myapp} pushd %{myappdir} >/dev/null ln -s %{myapplogdir} logs ln -s %{myapptempdir} temp ln -s %{myappworkdir} work popd >/dev/null fi
  13. Hook de pre-uninstall %preun %if 0%{?suse_version} > 1140 %service_del_preun %{myapp}.service

    %endif if [ "$1" == "0" ]; then # Uninstall time, stop App and cleanup # stop Application [ -x "/etc/init.d/%{myapp}" ] && /etc/init.d/%{myapp} stop %{_sbindir}/userdel %{myappusername} %{_sbindir}/groupdel %{myappusername} rm -rf %{myappworkdir}/* %{myapptempdir}/* # unregister app from services systemctl disable %{myapp}.service >/dev/null 2>&1 # finalize housekeeping rm -rf %{myappdir} rm -rf %{myapplogdir} rm -rf %{myapptempdir} rm -rf %{myappworkdir} fi
  14. Déclaration du contenu %files %defattr(-,root,root) %attr(0755,%{myappusername},%{myappusername}) %dir %{myapplogdir} %attr(0755, root,root)

    %{_initrddir}/%{myapp} %attr(0644,root,root) %{_systemdir}/%{myapp}.service %config(noreplace) %{_sysconfdir}/sysconfig/%{myapp} %config %{_sysconfdir}/logrotate.d/%{myapp} %config %{_sysconfdir}/security/limits.d/%{myapp} %{myappdir}/bin %{myappdir}/conf %{myappdir}/lib %attr(-,%{myappusername}, %{myappusername}) %{myappdir}/webapps %attr(0755,%{myappusername},%{myappusername}) %dir %{myappdatadir} %attr(0755,%{myappusername},%{myappusername}) %dir %{myapptempdir} %attr(0755,%{myappusername},%{myappusername}) %dir %{myappworkdir} %doc %{myappdir}/NOTICE %doc %{myappdir}/RUNNING.txt %doc %{myappdir}/LICENSE %doc %{myappdir}/RELEASE-NOTES
  15. Historique %changelog * Sat Dev 03 2011 [email protected] 1.0.3-1 -

    Adapt spec to OpenSuse 12.1 * Sun Nov 20 2011 [email protected] 1.0.2-1 - Make use of OpenSuse 11.4 macros * Sun Jun 19 2011 [email protected] 1.0.1-1 - Update Application * Sun Jun 19 2011 [email protected] 1.0.0-2 - Add user account creation/deletion * Sun May 22 2011 [email protected] 1.0.0-1 - Initial RPM
  16. AUTONOME Un package est auto-suffisant Programmes principaux et annexes (ex:

    logrotate) Données Comptes utilisateurs d’exécution Contrôle total sur le cycle de vie ‘en situation’
  17. CYCLE DE VIE IN SITU Contrôle total sur le cycle

    de vie ‘en situation’ Hooks pre/post installation Hook lors de la mise à jour Hooks pre/post désintallation Hooks sur opération sur autres packages
  18. ET ENCORE Un processus déterministe et donc réplicable Peut être

    utilisé par Puppet ou Chef Des artifacts centralisables comme pour Maven Une approche composant d’exécution
  19. Types de RPMs RPMs OS RPMs OS RPMs OS Fournis

    par votre distribution Linux RPMs Applicatif RPMs Applicatif RPMs Applicatif Produits par les Devs & Ops RPMs Configuration RPMs Configuration RPMs Configuration RPMs Configuration Produits par les Ops
  20. L’ASSEMBLAGE Installer une usine à packages (Jenkins) Créer un dépôt

    de packages Apache HTTPd Nexus/Artifactory Préparer des images Linux (exemple: JeOS)
  21. Usine a packages Jenkins (what else ?) Un agent Jenkins

    par distribution cible Déployer les outils de construction packages sur l’agent rpm-build, make, autoconf (RPM) build-essential, devscripts, ubuntu-dev-tools (DEB)
  22. dépôt de packages Serveur Apache HTTPd Installer createrepo (RPM), dpkg-dev

    (DEB) Upload via web-dav ou ssh (plus simple) Nexus/Artifactory Installer createrepo (RPM), dpkg-dev (DEB) Upload via web-dav (par Maven par exemple)
  23. JeOS Juste les composants essentiels de l’OS Moins de packages

    installés Taux de mise à jour plus faible Réduction des risques de failles de sécurité Une empreinte mémoire et disque réduite
  24. SONAR Environnement Java (OpenJDK, Sun/Oracle ou IBM) Sonar Compte utilisateur

    spécifique Tomcat 7 powered & single webapp SQL backend (Derby ou MySQL)
  25. Conclusion Une approche simple Mise en oeuvre par étape Adaptée

    à de petites infrastructures Utilisable avec Puppet ou Chef
  26. Licences et copyright Photos et logos appartiennent à leur auteurs/

    propriétaires respectifs. Contenu sous Creative Commons 3.0 http://creativecommons.org/licenses/by-nc-sa/3.0/us/