lunes, 19 de julio de 2010

Creando binarios para linux con Open Suse Build Service

Hay que reconocerlo: crear archivos ditribuibles para Linux es un auténtico infierno.  Además, como no, seremos víctimas de una nueva lucha de estándares rpm vs deb. Esto hace que sea bastante tentador distribuir simplemente el código fuente y desear suerte a los usuarios con la compilación, aunque de esta manera no llegaremos a los menos aventajados. También es cierto que distribuyendo el fuente no tardarán en aparecer voluntarios que crearán paquetes para determinadas distribuciones pero de esa manera perderemos el control de nuestro software. De modo  que, si queremos enfrentarnos a este problema, parece que sólo hay unas pocas soluciones: o bien encontrar un software que nos cree un instalable independiente de la distribución o tratar de llegar a la máxima cantidad de usuarios creando rpms y debs para las mayores distribuciones. Este artículo se centrará en el segundo enfoque. Open Suse Build Service (OBS) es, como su nombre indica, un servicio de construcción de paquetes binarios para las mayores distribuciones de Linux, incluyendo Ubuntu, Open Suse, Fedora, CentOs, Mandriva y alguna que otra más. Además de la creación de paquetes, pone a nuestra disposición los correspondientes repositorios de descarga para que puedan ser distribuidos a todo el mundo bien directamente, enlazando desde nuestra propia web si disponemos de ella, desde sitios capaces de integrar el servicio como kde-apps.org o desde el propio lugar habilitado por Open Suse para ello.
En este artículo trataré de describir mi experiencia para generar los binarios de un proyecto propio pero será difícil que no se me escape algún detalle así que, en todo caso, recomiendo que se de un vistazo a proyectos existentes en OBS para tener una referencia de la estructura de los archivos y a las configuraciones que se pueden encontrar en los .spec y .dsc necesarios para la construcción.
Como resumen antes de comenzar, sólo me queda decir que aunque su manejo no es todo lo sencillo que desearíamos, en cuanto se tiene un poco de práctica, obtenemos la ventaja de producir archivos instalables para la gran mayoría de distribuciones tanto en arquitectura 32 como 64 bits, algo que de otro modo no podríamos conseguir por nosotros mismos.

En qué consiste

Básicamente lo que se pone a nuestra disposición es una máquina virtual que se crea en el momento en base a nuestras necesidades. Dicho de otro modo, obtenemos un entorno de compilación y paquetización generado dinámicamente según los paquetes que habremos indicado previamente en los ficheros de descripción (uno para .deb y otro para .rpm)
Cada vez que modifiquemos alguno de los archivos de nuestro proyecto el servicio realiza una petición de construcción por el cual se crea de cero la máquina y, posteriormente a la instalación de todos los paquetes, se compila nuestro proyecto y se crea el binario. Como es natural este proceso no es especialmente rápido y más teniendo en cuenta que compartimos el servicio con otros usuarios pero con suerte, si no hay mucha cola, en poco más de unos 5 minutos podemos tener el resultado de todo el proceso.

Preparando el proyecto

Después de  crear nuestra cuenta llegará el momento de crear nuestro primer proyecto. Una de las cosas que hay que considerar es comprobar que no existe el mismo proyecto en la cuenta de otro usuario, si por ejemplo se está recompilando un fuente que no es nuestro porque lo queremos para nuestra distribución preferida.
En todo caso tendremos un proyecto creado por defecto, pero llevará el nombre de nuestro usuario, así que es recomendable crear uno nuevo.



Una vez creado el proyecto podremos asignarle paquetes y a estos a su vez podremos añadirles archivos. De una forma más práctica:
  1. Nuestro proyecto puede ser el nombre de nuestro programa
  2. Asignaremos las distribuciones (repositorios) para los que queremos paquetizar
  3. Podemos crear un paquete para cada versión
  4. A cada versión (paquete) le añadiremos todos los archivos descriptivos y de código fuente para que se creen sus binarios.
Iremos viendo a continuación como cumplir con los pasos que continúan a la creación del proyecto, pero antes de eso, como adelanto, en la imagen siguiente se puede ver la página inicial de un proyecto ya maduro




Creando los repositorios

El objetivo final de todo esto debería ser tener varios repositorios de paquetes para distribuir a nuestros usuarios. El concepto de repositorio estará ligado siempre a una distribución por lo que si elegimos distribuir para OpenSuse y Ubuntu, contaremos con dos repositorios.



En todo caso estará en nuestras manos que esta distribución de los binarios construidos sea libre o no. ¿Y por que no debería serlo? Para mí la respuesta es fácil, en mi cuenta nadie puede acceder a ellos ya que de momento OBS no registra estadísticas de descargas y ese es un dato que interesa controlar ya que mide el grado de aceptación que tiene nuestro trabajo. Una posible solución es descargarse los binarios (nuestro usuario siempre tendrá permiso por ser el creador) y subirlos a SourceForge dónde sí podremos controlar el número de descargas.
Al margen de cómo lo planteemos, la publicación es bastante flexible y podremos elegir que archivos son públicos o no por distribución y arquitectura. Esto lo veremos más adelante cuando se explique todo lo relativo a paquetes.

Creando paquetes en nuestro proyecto


Como se ha dicho con anterioridad podremos asimilar el concepto de paquetes a una versión de nuestro software. Además las tareas de construcción se lanzan contra los paquetes, dicho de otro modo, las maquinas virtuales creadas por OBS se ejecutan con la información de los archivos que habremos subido para un determinado paquete. Es por ello que todo lo que hemos visto con anterioridad sobre los permisos de construcción y publicación se hace para un determinado paquete.

Administración de los paquetes del proyecto

La creación de un nuevo paquete es muy simple, sólo se nos pide un nombre y una descripción que podemos dejar en blanco.




Una vez creado, de nuevo contaremos con una pantalla de resumen general desde la que tendremos a nuestro alcance las diversas opciones existentes para el paquete seleccionado. Es muy similar a la del proyecto pero tiene la opción files para añadir los archivos y aquí la opción repositories sirve para controlar la construcción y publicación para distintas distros y arquitecturas, mientras que en la opción del proyecto sirve para añadir o quitar distribuciones.




 Los archivos

A nuestro paquete subiremos archivos para que OBS construya los binarios pero antes de nada debemos saber que cada vez que subamos un archivo a un determinado paquete, se disparará un petición de construcción para los sistemas/arquitecturas permitidos.
Veremos por ahora de forma muy superficial los archivos que necesitaremos para la versión 0.0.1 de una aplicación llamada app de la que queremos .deb para Ubuntu y rpms para diversas distribuciones basadas en este otro sistema:
Para construir los rpms:
  • app.spec Es el descriptor del paquete que vamos a construir
  • app-0.0.1.tar.gz El código fuente a compilar para obtener el rpm
Para los debs:
  •  app_0.0.1-1.dsc Archivo de descripción
  • app_0.0.1-1.tar.gz Fuentes a compilar


Podremos editar los archivos de descripción desde la misma web pero veremos más adelante todo esto de forma más detallada cuando hablemos de cada uno de los casos de construcción en profundidad.

Controlando la construcción y distribución

Como se dijo antes, desde esta opción controlaremos todo lo relativo a la construcción y publicación de los repositorios que hemos elegido para nuestro proyecto. En la imagen que se puede ver abajo tenemos prohibida la publicación del repositorio para todas las distros y arquitecturas. Sólo nosotros, como creadores del paquete tendremos acceso a la descarga de los archivos generados.


 
También tendremos un modo similar de seleccionar para que distros y arquitecturas se debe lanzar la construcción. Por ejemplo si estamos peleándonos con la construcción de .deb para Ubuntu podemos tener paradas todas las construcciones basadas en rpm. De este modo no consumiremos recursos del servicio y no entorpeceremos a otros usuarios.




Conclusiones

Hemos visto como crear nuestro proyecto y la información básica para empezar a obtener archivos. Realmente con esto y observando en OBS algunos de los proyectos existentes, los más impacientes podrán empezar a trabajar ya. En todo caso, próximamente podréis encontrar por aquí los casos de construcción de .deb y .rpm con algunos problemas comunes y la forma a enfrentarse a ellos,

No hay comentarios: