in debian shell ~ read.

Como crear paquetes Debian

Al titulo le falta "... y no morir en el intento". Hay muchas cosas en Debian que enamoran por su simpleza y efectividad, pero hay otras que son tan enrevesadas que te hacen preguntarte como mantienen el ecosistema Debian sin perderse o liarse en el camino. Uno de estos casos es la creación de paquetes .deb, si te da por leer la documentación oficial acabas desistiendo antes de empezar, pero me he encontrado con fpm por casualidad y ahora todo es mucho mas fácil.

Fpm es un programa escrito en ruby con el que es posible crear paquetes deb, rpm, pacman y muchos mas, de forma simple. De hecho el lema del autor del programa es: si FPM no te ayuda a crear paquetes de forma fácil, es que hay un bug en FPM. Fpm se ejecuta desde la linea de comandos y tiene mil y una opciones para personalizar nuestros paquetes. Son tantas las opciones que puedes llegar a perderte un poco, por eso he preferido crearme una especie de plantilla para simplificar, si se puede aun más, el proceso de empaquetado.

Empecemos por instalar Fpm:

sudo apt install rubygems  
sudo gem install fpm  

A continuación creamos una estructura de carpetas con todo lo necesario:

NOMBRE_DEL_PAQUETE/  
   | 
   |---> files/
   |---> systemd/
   |---> build.sh

Creamos una carpeta con el nombre de nuestro software a empaquetar y dentro de esta creamos otras dos carpetas: files y systemd. Por ultimo creamos un archivo build.sh vacío que mas adelante contendrá el comando fpm con todas las opciones.

La carpeta files

Aquí es donde tendremos que meter el contenido que deseamos empaquetar, pero no de cualquier forma. Deberemos de recrear el path completo de la ubicación en la que deseamos que apt o dpkg instale nuestro software. Por ejemplo, si queremos que se almacene en /opt/mi_programa/ y sus archivos de configuración en /etc/mi_programa, deberíamos de recrear esta estructura de carpetas dentro de files:

NOMBRE_DEL_PAQUETE/  
   |
   |---> files/
   |       |--> opt/mi_programa/ "Nuestro software"
   |       |--> etc/mi_programa/ "archivo de configuración"
   |
   |---> systemd/
   |---> build.sh

La carpeta systemd

Puede que el programa que vayamos a empaquetar necesite también de algún servicio para auto-arrancar al inicio del sistema. Pues en esta carpeta deberemos crear un archivo .service con el servicio que apt o dpkg se encargaran de instalar y iniciar automáticamente. Es importante el nombre que le pongamos, ya que sera el nombre del servicio cuando lo queramos llamar mediante service o systemctl. Aquí tenéis un ejemplo simple:

[Unit]
Description=DESCRIPCION DEL SERVICIO  
After=network.target 

[Service]
Type=simple  
ExecStart=COMANDO A EJECUTAR

[Install]
WantedBy=multi-user.target  

Si en tu caso no necesitas de ningún servicio, bastaría con hacer caso omiso a la carpeta systemd, incluso ahorrarte la creación de la misma.

La estructura de carpetas quedaría de la siguiente manera:

NOMBRE_DEL_PAQUETE/  
   |
   |---> files/
   |       |--> opt/mi_programa/ "Nuestro software"
   |       |--> etc/mi_programa/ "archivo de configuración"
   |
   |---> systemd/
   |       |--> mi_programa.service
   |
   |---> build.sh

El archivo build.sh

El comando fpm acepta una infinidad de opciones, solo basta con ejecutar fpm --help y te darás cuenta de lo que te hablo. Para no perdernos, la mejor opción es dividir en varias lineas lo que seria el comando completo. Aquí tenéis el comando dividido que deberéis copiar al archivo build.sh:

#!/bin/bash

# Build command in multiple lines // Comando de Empaquetado en multiples lineas

fpm -s dir -t deb \  
-C ./files/ \
--name NOMBRE_DEL_PAQUETE \
--version VERSION \
--no-depends \
--architecture AMD64_i386_POWERPC_ARMEL_ARMHF... \
--deb-systemd ./systemd/NOMBRE_DEL_SERVICIO.service \
--maintainer "NOMBRE DEL MANTENEDOR <correo@correo.net>" \
--deb-priority optional \
--license LICENCIA \
--category CATEGORIA \
--vendor none \
--url URL_DE_LA_WEB_DEL_SOFTWARE \
--description "DECRIPCION DEL SOFTWARE QUE ESTA EMPAQUETADO" \

Ahora tenéis que personalizarlo a vuestro gusto, aquí os dejo una pequeña descripción de cada una de las opciones, aunque siempre podéis tirar de fpm --help:

  • fpm -s dir -t deb : Le indicamos a fpm que el origen -s es un directorio donde esta el ejecutable y el resto de los archivos a empaquetar y con -t definimos el tipo de paquete que queremos crear, en este caso un .deb.

  • --name : Nombre que le daremos al paquete. Tener en cuenta que si este paquete se cuelga en un repositorio, este nombre sera por el que podremos identificarlo entre todos.

  • --version : Versión del software a empaquetar. Acepta todo tipo de texto.

  • --no-depens : Asta el momento todo lo que he empaquetado no ha necesitado de otros paquetes para que funciones, por lo que con esta opción definimos que no tiene dependencias.

  • --archirtecture : El binario o software que vamos empaquetar estará compilado para un tipo de arquitectura, como por ejemplo amd64, i368, armel... Como existen varios sabores de Debian, aquí definimos para cual esta compilado. En caso de ser algún tipo de contenido soportado por todas las arquitecturas, bastará con poner all.

  • --deb-systemd : Si vamos a necesitar de un servicio de systemd para poner en marcha nuestro programa empaquetado, aquí indicamos donde esta ese archivo .service. El propio apt o dpkg se encargara de instalarlo y ponerlo en marcha. Si en tu caso no as a empaquetar ningún servicio, puedes borrar esta opción.

  • --manteiner : Aquí podemos poner nuestro nombre y correo de contacto, ya que el paquete esta creado por nosotros aun no siendo los creadores del contenido del mismo.

  • --deb-priority : Con esta opción definimos la prioridad del paquete a la hora de instalarse. Esto es util cuando algún otro paquete dependiera de este, pero como hasta el momento no he necesitado hacer uso de esto, siempre pongo optional.

  • --license : El software a empaquetar puede que este sujeto a algún tipo de licencia, GPL, CC, BeerWare etc...

  • --category : El paquete puede definirse para que este dentro de alguna categoría. A modo de ejemplo aquí están las de los repositorios oficiales de Debian.

  • --vendor : En caso de que el software sea de alguna compañía y estemos obligados a poner su nombre en el paquete, este es el sitio adecuado. Sino, bastaría con poner none.

  • --url : Si el contenido de paquete procede de alguna web, este es el lugar idóneo para poner la url de esa web.

  • --description : Una breve descripción de lo que contendrá el paquete.

Empaquetemos de una vez!

Ya tenemos todo organizado en carpetas y el comando fpm personalizado. Solo nos hace falta darle permisos de ejecución al archivo build.sh y ejecutarlo para que nos cree nuestro archivo .deb:

chmod +x build.sh  
./build.sh

Listo! ya tenemos nuestro paquete .deb, ahora hace falta instalarlo para ver que todo lo hemos hecho bien:

dkpg -i mi_programa.deb  

Funciona !!!

Como podéis ver, usar fpm nos facilita el trabajo de empaquetado una barbaridad. Cierto es que los preparativos pueden llevarnos tiempo y trabajo, pero esta misma estructura nos puede volver a valer para empaquetar otro programa, a modo de plantilla.

Ahora solo hace falta montarnos un repositorio para que cualquiera pueda hacer uso de nuestros paquetes.

Fuentes:

comments powered by Disqus