20111220 lyon jug-packaging-natif
-
Upload
henrigomez -
Category
Technology
-
view
1.030 -
download
0
description
Transcript of 20111220 lyon jug-packaging-natif
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 [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
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
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/