viernes, febrero 03, 2017

Anotaciones sobre Flatpak (I): Solución para la distribución de aplicaciones

Recientemente he tenido algunas conversaciones sobre Flatpak, y me gustaría hacer un post para anotar mi (escaso) conocimiento sobre Flatpak y que, quizás, pueda servir de ayuda para alguna persona que quiera tener una idea inicial sobre esta interesante tecnología.


En primer lugar, Flatpak es una tecnología para construir, distribuir e instalar aplicaciones de usuario, normalmente de escritorio. Los dos grandes objetivos perseguidos por Flatpak son:
  1. Distribución de aplicaciones cross-distro y cross-desktop. 
  2. Ejecución segura de aplicaciones (sandboxing)
El primer objetivo es muy importante y su consecución puede ser considerado como un paso hacia adelante para que la industria pueda considerar GNU/Linux como una plataforma, de la misma forma que Windows o MacOS lo son actualmente. El modelo de las distribuciones de GNU/Linux tiene sus ventajas [1], como pueden ser:
  • Facilidades de instalación y actualización
  • Actualizaciones de seguridad
  • Testeo de aplicaciones
  • Respeto por las licencias de software
  • Único punto de confianza

Pero también tiene sus puntos débiles:
  • Barrera entre los desarrolladores y los usuarios
    • No controlan cuando llegan las actualizaciones
    • No controlan las dependencias
    • No reciben un feedback directo de sus usuarios
    • Algunas distribuciones ofrecen versiones modificadas con respecto a upstream
  • Fragmentación de los usuarios (p. ej. rpm vs deb)
  • Las aplicaciones menos populares pueden no estar empaquetadas en tu distro.
  • No resulta atractivo para el desarrollo de software por parte de muchas compañias 

Flatpak es una tecnología interesante porque resuelve las desventajas del modelo de las distribuciones, y no viene a sustituir las distribuciones, es decir, puede usarse de forma complementaria. De hecho, las principales distrubuciones actuales ya tienen soporte para flatpak (Arch, Debian, Fedora, Gentoo, Mageia, openSUSE, Solus y Ubuntu)[2][3]. La integración de flatpak en las distribuciones es bastante sencilla, y se limita a básicamente empaquetar ostree y flatpak [3]


Runtimes

Una de las críticas más comunes a las soluciones tipo "bundle" de distribución de aplicaciones, en el que la aplicación se acompaña de las dependencias que necesita, es que su uso hace que final al existan numerosas dependencias repetidas una y otra vez en el sistema. Flatpak evita esta situación mediante la creación de los llamados runtimes, que no son otra cosa que paquetes flatpak que aglutinan un conjunto de dependencias versionadas de uso común.  De esta manera, las aplicaciones sólo contienen su propio código y aquellas dependencias extras a las proporcionadas por el runtime del que dependen. En la actualidad existen dos runtimes disponibles Freedesktop y GNOME (tanto versiones estables como de desarrollo) [4], y el runtime KDE que está en un avanzado estado de gestación [5]. Además, cualquier otra organización podría realizar sus propio runtime para el desarrollo de sus aplicaciones.

El uso de runtimes, además de solucionar el problema de la duplicidad de dependencias, también libera a los desarrolladores de la tarea de distribución de actualizaciones de seguridad de las dependencias.


Usando flatpak desde la línea de comandos 

 Veamos algunos comandos básicos para el consumo de paquetes flatpak [6]. En primer lugar, deberemos de instalar los repositorios de los runtimes y/o aplicaciones que queremos usar.

Los repositorios se describen a través de ficheros con el formato .flatpakrepo. Se trata de un sencillo fichero de texto con varios campos: título, comentario, url del repositorio, clave GPG (opcional) y la página web del proyecto.

[Flatpak Repo]
Title=GNOME Nightly Runtime
Comment=Nightly GNOME Runtime
Description=GNOME develops essential free software applications suited for daily 
desktop usage. This includes browsing photos, playing music, managing your files, 
surfing the web and much more. This repository includes development builds of the 
GNOME runtime.
Url=https://sdk.gnome.org/nightly/repo/
GPGKey=mQENBFYSUcEBCAC50sRVDy40A0mF
Homepage=https://www.gnome.org/

En este caso vamos a instalar el repositorio de los runtimes de desarrollo de GNOME y un repositorio de aplicaciones basados en este repositorio.

$ flatpak remote-add --from gnome-nightly https://sdk.gnome.org/gnome-nightly.flatpakrepo

$ flatpak remote-add --from gnome-apps-nightly https://sdk.gnome.org/gnome-apps-nightly.flatpakrepo

Una vez instalados, podemos listar los paquetes flatpak que se incluyen en cada repositorio

$ flatpak remote-ls gnome-nightly 
org.gnome.Platform       
org.gnome.Platform.Locale
org.gnome.Sdk            
org.gnome.Sdk.Debug      
org.gnome.Sdk.Locale 

$ flatpak remote-ls gnome-apps-nightly 
...
org.gnome.Builder               
org.gnome.Builder.Debug
org.gnome.Builder.Locale
....

Vemos que existen runtimes .Sdk, que son los que se usan para desarrollar aplicaciones, frente a los .Platform que son los que se usan para su consumo.  Los runtimes con extensión .Locale añáden información de internalización y los .Debug incluyen los símbolos  y código necesario para permitir su depuración. Se trata de una simple convención usada en este repositorio.

Cuando instalamos una aplicación, flatpak es capaz de instalar la(s) dependencia(s) flatpak que le hace falta si la(s) localiza en alguno de los repositorios instalados.

 $ flatpak install gnome-apps-nightly org.gnome.Builder
Required runtime for org.gnome.Builder/x86_64/master (org.gnome.Sdk/x86_64/master) is not installed, searching...
Found in remote gnome-nightly, do you want to install it? [y/n]: y

Installing: org.gnome.Sdk/x86_64/master from gnome-nightly
20 delta parts, 153 loose fetched; 336691 KiB transferred in 60 seconds                                                                                       
Installing: org.gnome.Sdk.Locale/x86_64/master from gnome-nightly
5 metadata, 1 content objects fetched; 13 KiB transferred in 5 seconds                                                                                        
Installing: org.gnome.Builder/x86_64/master from gnome-apps-nightly
1 delta parts, 6 loose fetched; 5543 KiB transferred in 8 seconds                                                                       
Installing: org.gnome.Builder.Locale/x86_64/master from gnome-apps-nightly
5 metadata, 1 content objects fetched; 6 KiB transferred in 5 seconds

flatpak usa OSTree para distribuir y desplegar los paquetes. Los repositorios usan el format de OSTree y se pueden gestionar con la utilidad ostree. Tanto la instalación y la actualizaciones de runtimes y aplicaciones se realizan mediante OSTree, y son similares hasta cierto punto a realizar operaciones git clone y pull. El uso de OSTree permite actualizaciones incrementales (deltas) y atómicas y la posibilidad de volver a versiones anteriores.


$ flatpak update org.gnome.Builder
Looking for updates...
Updating: org.gnome.Sdk/x86_64/master from gnome-nightly

1 metadata, 0 content objects fetched; 313 B transferred in 2 seconds           
Now at 1f350a3602ed.
Updating: org.gnome.Sdk.Locale/x86_64/master from gnome-nightly

1 metadata, 0 content objects fetched; 313 B transferred in 2 seconds           
Now at a030de5ab9e8.
Updating: org.gnome.Builder/x86_64/master from gnome-apps-nightly

1 metadata, 0 content objects fetched; 313 B transferred in 3 seconds           
Now at bfceaed2149b.
Updating: org.gnome.Builder.Locale/x86_64/master from gnome-apps-nightly

1 metadata, 0 content objects fetched; 313 B transferred in 2 seconds           

Now at ad0bdabc26e2.

Una vez instalado, podemos ejecutarlo con el siguiente comando.

$ flatpak run  org.gnome.Builder

Instalación simplificada con .flatpakref

El uso habitual de Flatpak consiste en lo que hemos visto, configurar unos repositorios que tienen las aplicaciones, e instalarlar las aplicaciones a través de la línea de comandos o través de un instalador gráfico. Sin embargo, existe ocasiones en las es conveniente proporcionar un simple enlace en una web que nos instale la aplicación. Flatpak permite esto a través de los ficheros .flatpakref. Estos ficheros son muy similares a los ficheros .flatpakrepo que hemos visto anteriormente, pero con la diferencia que además se indica la aplicación que se quiere instalar.

Estos ficheros se pueden instalar mediante un click (que abrirá gnome-software para su instalación) o a través de la línea de comandos:

$ flatpak install https://download.mono-project.com/repo/monodevelop.flatpakref
This application depends on runtimes from:
  http://sdk.gnome.org/repo/
Configure this as new remote 'gnome' [y/n]: y
Installing: com.xamarin.MonoDevelop/x86_64/stable
Required runtime for com.xamarin.MonoDevelop/x86_64/stable (org.freedesktop.Platform/x86_64/1.4) is not installed, searching...
Found in remote gnome, do you want to install it? [y/n]: y
Installing: org.freedesktop.Platform/x86_64/1.4 from gnome

9 delta parts, 29 loose fetched; 89585 KiB transferred in 22 second                                                            
Installing: org.freedesktop.Platform.Locale/x86_64/1.4 from gnome

5 metadata, 1 content objects fetched; 13 KiB transferred in 5 seconds                                                                                        
Installing: com.xamarin.MonoDevelop/x86_64/stable from com.xamarin.MonoDevelop-origin

946 metadata, 3063 content objects fetched; 127987 KiB transferred in 53 seconds 


Referencias

[1] https://mclasen.fedorapeople.org/devconf-flatpak.pdf
[2] http://flatpak.org/getting.html
[3] https://solus-project.com/2017/01/18/adopting-flatpak-to-reassemble-third-party-applications/
[4] http://flatpak.org/runtimes.html
[5] https://community.kde.org/Guidelines_and_HOWTOs/Flatpak
[6] https://blogs.gnome.org/alexl/2016/10/25/new-flatpak-command-line/