Python Madrid empaquetamiento deb aplicaciones Python

Post on 03-Jul-2015

2.547 views 6 download

description

Python Empaquetamiento Deb I Python Madrid 14/4/2011

Transcript of Python Madrid empaquetamiento deb aplicaciones Python

 Python Empaquetamiento Deb I

Python Madrid14/4/2011

Quién... 

eduardo.ferro.aldama@gmail.comeferro@alea-soluciones.com    http://www.eferro.net

eferroDrTrucho

Disclaimer online de contenido abierto, es decir, "no me responsabilizo del contenido" voluntaria de personas y grupos "lo que comento aquí

es mi experiencia" que desarrollan conjuntamente una fuente del conocimiento humano."debian/rules" Sus términos de uso permiten a cualquier persona navegador web, modificar "Soy notavo en paquetes deb" el contenido o páginas, por favor tenga presente que la información que encuentre  "Soy novato en conferencias" no  ha sido expertos profesionales que conozcan los temas "Se aceptan sugerencias de

mejora" de las diferentes materias necesaria para proporcionar aquí y ahora "Ni de lejos una información completa, precisa y fiable".

 Manos a la obra...

Indice...

• Introducción• Qué es (un paquete deb)• Cómo se genera (un paquete deb)• Empaquetando Python

odistutils/setup.pyoDirectorio debiano rules (CDBS/Debhelper)

• A construir• Conclusiones• Ejemplos y demos• Referencias

Introducción: Contexto...

• Sistemas GNU/Linux• Distros basadas en paquetes DEB (Debian, Ubuntu, etc)• Distribución / Deploy librerías y módulos creados en Python

Introducción: Por qué empaquetar...

• Control de dependencias• Inventario de software• Gestión común soft de base (distro) y soft propio• Instalador estandarizado• Sistema de repositorios• Utilidades (buscadores, índices, etc...)• Somos gente con estilo :)

Introducción: Qué empaquetar...

• Software de base / infraestructura• Versiones diferentes de software disponible en la distro usada (backports, nuevas versiones, etc...)• Software de aplicación y de librerías

Introducción: Cuánto cuesta empaquetar...

• Si es python y usa distutils (setup.py), casi nada• Hacerlo para un paquete oficial de distro, bastante (cumplir la debian/policy)• Hacerlo para nuestros paquetes, no tanto 

Paquetes DebAplicaciones PythonManos a la obra

Qué es: Anatomía de un Deb I

Un fichero deb simplemente son tres ficheros unidos en uno sólo mediante "ar". Ejemplo: 

ar -xv <paquete>.deb x - debian-binaryx - control.tar.gzx - data.tar.gz  

Qué es: Anatomía de un Deb II

• debian-binary Version del paquete deb (actualmente 2.0)• control.tar.gz

o ./config  o ./preinsto ./prermo ./conffileso ./md5sumso ./controlo ....

• data.tar.gz Ficheros incluidos en el paquete (binarios, librerias, etc...)

 

Cómo se genera: Herramientas I

Herramientas para contruir paquetes • python (incluye distutils)• dpkg-dev / dpkg-buildpackage• debhelper helper programs for debian/rules• fakeroot Gives a fake root environment• cdbs common build system for Debian packages• dh-make tool that converts source archives into Debian package source

Cómo se genera: Creación deb (app/lib Python)

• Partimos de fuentes con app/lib Python • Verificamos/Creamos setup.py (distutils)• Realizamos la debianización inicial• Ponemos a punto:

odebian/rulesodebian/controlodebian/changelogodebian/...

• Construcción del paquete binario

Empaquetando python: setup.py (distutils)

• Buena práctica• Solución estándard (y recomendación oficial de python)

Distribuye tu aplic/lib python con estilohttp://docs.python.org/install/index.htmlhttp://docs.python.org/distutils/index.html

Empaquetando python: setup.py (distutils) I#!/usr/bin/env pythonfrom setuptools import *import aptdaemonsetup(name="aptdaemon", ... packages=["aptdaemon"], scripts=["aptd", "aptdcon"], data_files=[("../etc/dbus-1/system.d/", ["data/org.debian.apt.conf"]), "doc/org.debian.apt.transaction.7"])], platforms = "posix")

Empaquetando python: setup.py (distutils) IIdistutils.core.setup( name='argparse', version=argparse.__version__, author='Steven Bethard', description='Python command-line parsing library', long_description = read_description(), license='Apache 2.0', classifiers=[ 'Topic :: Software Development', ... ], py_modules=['argparse'],)

Empaquetando python: setup.py (distutils) III#!/usr/bin/env pythonfrom distutils.core import setupimport globimport os.pathsetup( name='Boscli-oss', ... package_dir = { '' : 'src' }, packages = ['boscli', ], scripts = ['src/bin/boscli', ], data_files = [ ( '/usr/lib/boscli/', glob.glob( 'src/lib/*.py') ) ],)

Empaquetando python: setup.py (distutils) IV#!/usr/bin/env pythonfrom distutils.core import setup

setup(name = "amqplib", description = "AMQP Client Library", version = "0.6", license = "LGPL", author = "Barry Pederson", author_email = "bp@barryp.org", url = "http://barryp.org/software/py-amqplib/", packages = ['amqplib', 'amqplib.client_0_8'] )

Empaquetando python: Debianización inicial I

• Se crea el directorio debian:oUsando dh_make

• Se adaptan ficheros del directorio debian

Si el código es nuestro: • Si usamos distutils / setup.py tenemos el 

95% del trabajo hecho.

Empaquetando python:  Debianización inicial II

dh_make [options]  -c, --copyright  -e, --email <address>   -f, --file <file>         -r, --createorig      -s, --single / -i, --indep / -m, --multi / ...  -b, --cdbs                -p, --packagename <name>   ...

Empaquetando python: Debianización inicial III

Opciones típicas:• dh_make -r -f ../<programa>.tar.gz -p <nombre>_<version> -s• dh_make -r -f ../<programa>.tar.gz -p <nombre>_<version> --cdbs

Empaquetando python: Debianización inicial IV

El directorio debian creado con dh_make contiene los siguientes ficheros: debian/control debian/changelog debian/rulesdebian/docsdebian/compatdebian/copyrightdebian/*.ex y debian/*.EX debian/README.*

Empaquetando python: Fichero Control ISource: python-amqplibSection: bifPriority: extraBuild-Depends: python-support (>= 0.6), debhelper(>= 5)Maintainer: Eduardo Ferro <eferro@alea-soluciones.com>

Package: python-amqplibArchitecture: allDepends: ${python:Depends}Provides: ${python:Provides}Description: amqplib support amqplib support .

Empaquetando python: Fichero Control IISource: gnupginterfaceSection: pythonPriority: optionalMaintainer: ... Build-Depends: cdbs, debhelper (>= 5.0.37.1), python, python-support

Package: python-gnupginterfaceArchitecture: allDepends: ${python:Depends}, gnupg (>= 1.2.1)Provides: ${python:Provides}Description: Python interface to GnuPG (GPG) ...

Empaquetando python: Fichero Changelog I

• Contiene versiones y descripción de los cambios.• Tiene formato definido y se crean entradas con dch (devscripts)

 Formato de cada cambio: 

[nombre] ([version]) [distro]; urgency=[nivel urg]  * [descripción cambio]

 -- [nombre] <[email]>  [fecha modificación]

Empaquetando python: Fichero Rules I

• aka "La madre del cordero"• Se suelen general con el dh_make• Se suelen hacer con dos estilos:

oUsando dh_* (debhelpers)oUsando cdbs

• Además para python:o dh_python2 (recomendado / muy reciente)o python-support / dh_pysupport (+)o python-central / dh_pycentral

Empaquetando python: Fichero Rules II

• Makefile que dirige la construcción del paquete deb• Tiene diversos objetivos:

o cleanobinaryobinary-archobinary-indepobuild

Empaquetando python: Fichero Rules III python-support /dh_pysupport

• ${python:Depends}• ${python:Versions}• ${python:Provides}• Usa debian/pyversion Ej: 2.5- 2.5,2.6• Crea scripts compilación y registro módulos

Empaquetando python: Fichero Rules (dh I)

Existen gran cantidad de "helpers" para realizar cada una de las tareas necesarias en el rules.... dh_builddeb, dh_clean, dh_compress, dh_fixperms, dh_gencontrol, dh_install,dh_installchangelogs, dh_installcron, dh_installdeb, dh_installdebconf, dh_installdirs, dh_installdocs, dh_installemacsen, dh_installexamples, dh_installinfo ... 

Empaquetando python: Fichero Rules (dh II)#!/usr/bin/make -f

export DH_PYCENTRAL=include-links

%:dh --with=python-central $@

override_dh_auto_clean:dh_auto_cleanrm -rf build *.egg-info po/aptdaemon.pot

Empaquetando python: Fichero Rules (dh III)#!/usr/bin/make -fconfigure: configure-stampconfigure-stamp:dh_testdirtouch configure-stampbuild: build-stamppython setup.py build...install: builddh_testdirdh_clean -k python setup.py install --root=$(CURDIR)/debian/python-amqplib...

Empaquetando python: Fichero Rules (cdbs I)Estilo CDBS :• Intenta simplificar el debian/rules• Puede gestionar sin esfuerzo los casos típicos más comunes• Intenta eliminar tareas repetitivas realizadas en los debian/rules• Usa clases (extensibles), que son como partes de Makefile especializadas• Estas clases están bien probadas

Empaquetando python: Fichero Rules (cdbs II)#!/usr/bin/make -fDEB_PYTHON_SYSTEM = pysupportDEB_PYTHON_COMPILE_VERSION = $(shell pyversions -vd 2>/dev/null)

include /usr/share/cdbs/1/rules/debhelper.mkinclude /usr/share/cdbs/1/class/python-distutils.mkinclude /usr/share/cdbs/1/rules/utils.mk

Empaquetando python: Fichero Rules (cdbs III)#!/usr/bin/make -f# -*- mode: makefile; coding: utf-8 -*-

DEB_PYTHON_SYSTEM=pysupport

include /usr/share/cdbs/1/rules/debhelper.mkinclude /usr/share/cdbs/1/rules/simple-patchsys.mkinclude /usr/share/cdbs/1/class/python-distutils.mk

build/python-gnupginterface::pydoc -w ./GnuPGInterface.py

clean::-rm *.pyc *.html

Empaquetando python: Fichero Rules (cdbs IV)#!/usr/bin/make -f

include /usr/share/cdbs/1/rules/debhelper.mkinclude /usr/share/cdbs/1/class/makefile.mk

# Add here any variable or target overrides you need.DEB_MAKE_CLEAN_TARGET = cleanDEB_MAKE_BUILD_TARGET = allDEB_MAKE_INSTALL_TARGET = install DESTDIR=$(CURDIR)/debian/lsm/# no check for this softwareDEB_MAKE_CHECK_TARGET =

Empaquetando python: Otros ficheros en debian/•  maintainer scripts:

oprermopostrmopreinstopostinst

• <programa>.1 (manpage)• <programa>.cron.* • <programa>.init.*• menu (entrada para menus gráficos) • compat• ... 

A construir...

Construcción I

Recordemos: • Directorio de fuentes (con setup.py)• Directorio debian

odebian/controlodebian/rulesodebian/changelog

 En el directorio debian suele haber muchos más ficheros, pero los indicados son los mínimos... 

Construcción II

cd dir-paquetedpkg-buildpackage -us -uc -rfakeroot -sa -us, -uc es para indicar que no queremos firmar el paquete ni los fuentes. -rfakeroot es para que se construya simulando que somos root (usará un directorio interno)-sa para que genere los ficheros de paquete fuente

Construcción III

Si queremos probar alguno de los targets del debian/rules podemos ejecutar: fakeroot debian/rules binaryfakeroot debian/rules build fakeroot debian/rules clean

Conclusiones: 

• En GNU/linux, empaquetar es lo normal• Usa distutils / setup .py tu vida será mejor• Debs oficiales requiere esfuerzo• Debs para consumo propio muy fácil

Ejemplos y Demos

Referencias I:Empaquetamiento Deb Python

Debian Python Policyhttp://www.debian.org/doc/packaging-manuals/python-policy/

Debian Python FAQhttp://wiki.debian.org/Python/FAQ

Ubuntu Python Packaging Guidehttps://wiki.ubuntu.com/PackagingGuide/Python

Referencias II: Generales Empaquetamiento DebGuía del nuevo desarrollador de Debian http://www.debian.org/doc/manuals/maint-guide/index.es.html

Debian Policy http://www.debian.org/doc/debian-policy/index.html

Ubuntu Packaging Guidehttps://wiki.ubuntu.com/PackagingGuide Manuales del DDP para desarrolladoreshttp://www.debian.org/doc/devel-manuals.es.html

CDBS Documentation http://cdbs-doc.duckcorp.org/en/cdbs-doc.xhtml

Game Over!!!

Hasta aquí hemos llegado¿Preguntas?¿Sugerencias?¿Quejas?¿Insultos?...

Eduardo Ferroeduardo.ferro.aldama@gmail.com