DevOps
L’approche packaging natif
ParisJUG 10 Janvier 2012
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
3,2,1 - Rocket Launched




Courtesy Steve Jurvetson
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
Jar, war, zip, tarball ?



Ce sont des archives simples, non opérables directement
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
Packaging Natif


Coeur de la pile applicative des OS
Gestion des dépendances
Mise à jour automatique ou sélective
Largement utilisé par les Ops
Packaging sous Unix


RPM (Redhat Package Manager) sous RHEL/CentOS/
Fedora, SLES/OpenSuse, Mandriva
DEB sous Debian/Ubuntu
PKG sous Solaris
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)
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
Un DSL pour les Ops


Simple
Quelques macros
SH powered
Construire un RPM


Des fichiers binaires - depuis l’entrepôt de livrables
Des sources - depuis le SCM
Un fichier de construction, le SPECFILE
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
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
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 || :
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
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
Hook de post-uninstall



%postun
%if 0%{?suse_version} > 1140
%service_del_postun %{myapp}.service
%endif
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
Historique


%changelog
* Sat Dev 03 2011 henri.gomez@gmail.com   1.0.3-1
- Adapt spec to OpenSuse 12.1
* Sun Nov 20 2011 henri.gomez@gmail.com   1.0.2-1
- Make use of OpenSuse 11.4 macros
* Sun Jun 19 2011 henri.gomez@gmail.com   1.0.1-1
- Update Application
* Sun Jun 19 2011 henri.gomez@gmail.com   1.0.0-2
- Add user account creation/deletion
* Sun May 22 2011 henri.gomez@gmail.com   1.0.0-1
- Initial RPM
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’
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
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
Types de RPMs

       RPMs OS
       RPMs OS
        RPMs OS
Fournis par votre distribution Linux


                                       RPMs Applicatif
                                       RPMs Applicatif
                                        RPMs Applicatif
RPMs Configuration
 RPMs Configuration                     Produits par les Devs & Ops
  RPMs Configuration
   RPMs Configuration
      Produits par les Ops
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)
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)
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)
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
De JeOS à instance


Inventaire des besoins
Pré-requis et dépendances
Spécificités applicatives
Les communs


Serveur SSH
Comptes administrateur
Monitoring (SNMP)
Firewall (port 22 et SNMP autorisés)
Ma petite FORGE


Subversion
Git
Jenkins
Nexus
Sonar
Subversion


Apache HTTPd server
Subversion
Viewvc
Comptes utilisateurs
GIT


Environnement Java (OpenJDK, Sun/Oracle ou IBM)
GitBlit
  Compte utilisateur spécifique
  Tomcat 7 powered & single webapp
Jenkins


Environnement Java (OpenJDK, Sun/Oracle ou IBM)
Jenkins
  Compte utilisateur spécifique
  Tomcat 7 powered & single webapp
Nexus


Environnement Java (OpenJDK, Sun/Oracle ou IBM)
Nexus
  Compte utilisateur spécifique
  Tomcat 7 powered & single webapp
SONAR


Environnement Java (OpenJDK, Sun/Oracle ou IBM)
Sonar
  Compte utilisateur spécifique
  Tomcat 7 powered & single webapp
  SQL backend (Derby ou MySQL)
Global FRONT-END

Apache HTTPd VHosts
 Subversion
 Git
 Jenkins
 Nexus
 Sonar
Conclusion

Une approche simple
Mise en oeuvre par étape
Adaptée à de petites infrastructures
Utilisable avec Puppet ou Chef
RPM DevOPS


http://code.google.com/p/devops-incubator/
  RPMs pour Subversion, GitBlit, Jenkins, Nexus, Sonar
  Pour OpenSuse 11.4 & 12.1
LIRE


http://www.rpm.org/max-rpm/

http://fedoraproject.org/wiki/Packaging/Guidelines

http://en.opensuse.org/openSUSE:Specfile_guidelines

Nexus : http://code.google.com/p/nexus-yum-plugin/

Artifactory : http://wiki.jfrog.org/confluence/display/RTF/YUM+Repositories
Des questions ?
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/

20120110 paris jug-packaging-natif

  • 1.
  • 2.
    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
  • 3.
    3,2,1 - RocketLaunched Courtesy Steve Jurvetson
  • 4.
    Définition d’un livrable C’estun artefact utilisable par les équipes up-stream Pour un Dev ce sont donc les équipes QA et/ou Ops
  • 5.
    Jar, war, zip,tarball ? Ce sont des archives simples, non opérables directement
  • 6.
    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
  • 7.
    Packaging Natif Coeur dela pile applicative des OS Gestion des dépendances Mise à jour automatique ou sélective Largement utilisé par les Ops
  • 8.
    Packaging sous Unix RPM(Redhat Package Manager) sous RHEL/CentOS/ Fedora, SLES/OpenSuse, Mandriva DEB sous Debian/Ubuntu PKG sous Solaris
  • 9.
    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)
  • 10.
    Points communs avec Maven Constructionpar 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
  • 11.
    Un DSL pourles Ops Simple Quelques macros SH powered
  • 12.
    Construire un RPM Desfichiers binaires - depuis l’entrepôt de livrables Des sources - depuis le SCM Un fichier de construction, le SPECFILE
  • 13.
    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
  • 14.
    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
  • 15.
    Hook de pré-install %pre %if0%{?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 || :
  • 16.
    Hook de post-install %post %if0%{?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
  • 17.
    Hook de pre-uninstall %preun %if0%{?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
  • 18.
    Hook de post-uninstall %postun %if0%{?suse_version} > 1140 %service_del_postun %{myapp}.service %endif
  • 19.
    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
  • 20.
    Historique %changelog * Sat Dev03 2011 henri.gomez@gmail.com 1.0.3-1 - Adapt spec to OpenSuse 12.1 * Sun Nov 20 2011 henri.gomez@gmail.com 1.0.2-1 - Make use of OpenSuse 11.4 macros * Sun Jun 19 2011 henri.gomez@gmail.com 1.0.1-1 - Update Application * Sun Jun 19 2011 henri.gomez@gmail.com 1.0.0-2 - Add user account creation/deletion * Sun May 22 2011 henri.gomez@gmail.com 1.0.0-1 - Initial RPM
  • 21.
    AUTONOME Un package estauto-suffisant Programmes principaux et annexes (ex: logrotate) Données Comptes utilisateurs d’exécution Contrôle total sur le cycle de vie ‘en situation’
  • 22.
    CYCLE DE VIEIN 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
  • 23.
    ET ENCORE Un processusdéterministe et donc réplicable Peut être utilisé par Puppet ou Chef Des artifacts centralisables comme pour Maven Une approche composant d’exécution
  • 24.
    Types de RPMs RPMs OS RPMs OS RPMs OS Fournis par votre distribution Linux RPMs Applicatif RPMs Applicatif RPMs Applicatif RPMs Configuration RPMs Configuration Produits par les Devs & Ops RPMs Configuration RPMs Configuration Produits par les Ops
  • 25.
    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)
  • 26.
    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)
  • 27.
    dépôt de packages ServeurApache 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)
  • 28.
    JeOS Juste les composantsessentiels 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
  • 29.
    De JeOS àinstance Inventaire des besoins Pré-requis et dépendances Spécificités applicatives
  • 30.
    Les communs Serveur SSH Comptesadministrateur Monitoring (SNMP) Firewall (port 22 et SNMP autorisés)
  • 31.
  • 32.
  • 33.
    GIT Environnement Java (OpenJDK,Sun/Oracle ou IBM) GitBlit Compte utilisateur spécifique Tomcat 7 powered & single webapp
  • 34.
    Jenkins Environnement Java (OpenJDK,Sun/Oracle ou IBM) Jenkins Compte utilisateur spécifique Tomcat 7 powered & single webapp
  • 35.
    Nexus Environnement Java (OpenJDK,Sun/Oracle ou IBM) Nexus Compte utilisateur spécifique Tomcat 7 powered & single webapp
  • 36.
    SONAR Environnement Java (OpenJDK,Sun/Oracle ou IBM) Sonar Compte utilisateur spécifique Tomcat 7 powered & single webapp SQL backend (Derby ou MySQL)
  • 37.
    Global FRONT-END Apache HTTPdVHosts Subversion Git Jenkins Nexus Sonar
  • 38.
    Conclusion Une approche simple Miseen oeuvre par étape Adaptée à de petites infrastructures Utilisable avec Puppet ou Chef
  • 39.
    RPM DevOPS http://code.google.com/p/devops-incubator/ RPMs pour Subversion, GitBlit, Jenkins, Nexus, Sonar Pour OpenSuse 11.4 & 12.1
  • 40.
  • 41.
  • 42.
    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/