20111220 lyon jug-packaging-natif

Preview:

DESCRIPTION

Présentation DevOps au LyonJUG.Approche Packaging Natif

Citation preview

DevOpsL’approche packaging natifLyonJUG 20 Décembre 2011

Henri Gomez+20 ans dans l’industrie logicielle

Architecte Java, CI et direction de production

Dev, QA et Ops

OpenSource Activist

Apache Tomcat

JPackage

openjdk-osx-build

Packaging Natif

Coeur de la pile applicative des OS

Gestion des dépendances

Mise à jour automatique ou sélective

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 MavenConstruction 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: myappVersion: 1.0.0Release: 1Summary: MyApp powered by Apache TomcatGroup: Applications/CommunicationsURL: http://www.mycorp.org/Vendor: MyCorpPackager: MyPackagerLicense: AGPLv1BuildArch: 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.gzSource1: myapp.war

%descriptionMyApp 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%endifif [ "$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%endifif [ "$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 OSRPMs OSRPMs OSFournis par votre distribution Linux

RPMs ApplicatifRPMs ApplicatifRPMs ApplicatifProduits par les Devs & OpsRPMs ConfigurationRPMs ConfigurationRPMs ConfigurationRPMs 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)

MySQL BACKEND

MySQL

Comptes utilisateurs

Configuration InnoDB

Global FRONT-END

Apache HTTPd VHosts

Subversion

Git

Jenkins

Nexus

Sonar

Conclusion

Une approche simpleMise en oeuvre par étapeAdaptée à de petites infrastructuresUtilisable avec Puppet ou Chef pour de grosses infrastructure

RPM DevOPS

http://code.google.com/p/devops-incubator/

RPMs pour Subversion, GitBlit, Jenkins, Nexus, Sonar

Pour OpenSuse 11.4 & 12.1

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/