Cómo empaquetar y publicar una aplicación Snap en Ubuntu 18.04

Introducción

Uno de los mayores desafíos en el desarrollo de aplicaciones es el paso final de distribuir el producto terminado a tus usuarios o clientes. Muchas metodologías de implementación de aplicaciones existentes carecen de facilidad de uso y seguridad. Asimismo, no proporcionan métodos para actualizar automáticamente una aplicación una vez que se ha instalado.

Snap es un formato moderno de empaquetado de aplicaciones con potentes funciones de sandboxing y seguridad. Estas funciones incluyen aislamiento del sistema de archivos, actualizaciones automáticas y gestión integrada de dependencias.

Las aplicaciones Snap, conocidas como Snaps, se pueden descargar e instalar utilizando un programa de línea de comandos, muy parecido a apt o yum. Ubuntu viene con Snap preinstalado, lo que significa que hay una gran audiencia para las aplicaciones Snap.

En este tutorial, crearás una aplicación Snap y la publicarás en Snap Store.

Prerrequisitos

Para completar este tutorial, necesitarás:

  • Un servidor Ubuntu 18.04 configurado siguiendo la configuración básica del servidor con Ubuntu 18.04, incluido un usuario sudo no root.
  • Una aplicación que deseas empaquetar y publicar como Snap. Esta puede ser una aplicación compleja que hayas creado, un proyecto común de código abierto o un simple programa “¡Hola, mundo!”. Si aún no tienes una aplicación, el Paso 1 de este tutorial cubrirá cómo puedes crear un programa Hola mundo en Go.
  • Una cuenta en el Panel de desarrollo de Snapcraft.

Una vez que tengas todo esto listo, debes iniciar sesión en tu servidor como tu usuario no root para comenzar.

Paso 1 – Preparando tu aplicación para empaquetar

En primer lugar, prepararás tu aplicación para empaquetar como una aplicación Snap asegurándote de que todo lo requerido esté presente en un solo directorio.

Comencemos creando un nuevo directorio para tu Snap y muévete a él:

Luego, si ya tienes una aplicación, debes colocar una copia completa del código fuente de tu aplicación en el directorio que acabas de crear. El proceso aquí variará significativamente dependiendo de la aplicación exacta que estés empaquetando.  Por ejemplo, si el código fuente esté almacenado en un repositorio de Git, puedes hacer git init en el directorio y desplegar todo el código relevante.

Si aún no tienes una aplicación que te gustaría empaquetar, puedes crear un programa “Hola mundo” para usar en su lugar. Si deseas más contexto sobre cómo escribir este programa con Go, puedes consultar algún tutorial en línea

Puedes hacer esto creando primero un nuevo archivo Go y abriéndolo usando tu editor de texto preferido:

A continuación, debes agregar el siguiente código al archivo:

Luego guarda y sal del archivo.

Si no tienes Go instalado, puedes instalarlo usando el siguiente comando:

Una vez que Go está instalado, puedes ejecutar tu nuevo programa para verificar que esté funcionando:

Verás el siguiente resultado:

Ha preparado tu aplicación para empaquetar como Snap. A continuación, instalarás el software requerido para comenzar el proceso de empaquetado.

Paso 2 – Instalación de Snapcraft

En este paso, descargarás e instalarás Snapcraft, que es el nombre de la herramienta oficial de empaquetado de aplicaciones Snap. Snapcraft está disponible en Snap Store, que está integrado en Ubuntu de forma predeterminada. Esto significa que puedes instalar Snapcraft desde la línea de comandos utilizando el comando snap.

El comando snap es equivalente al comando apt, pero puedes usarlo para instalar software desde Snap Store, en lugar de paquetes desde los repositorios Apt.

Para instalar Snapcraft, ejecuta el siguiente comando:

Utiliza el comando con el argumento –classic  para que Snapcraft se instale sin las estrictas funciones de sandboxing que los Snaps usan normalmente. Snapcraft requiere este argumento ya que necesita un acceso más privilegiado a tu sistema para empacar aplicaciones de manera confiable.

Una vez que hayas instalado Snapcraft, verás lo siguiente:

Finalmente, puedes verificar la instalación de Snapcraft ejecutando:

Esto mostrará algo similar a:

Ahora que has instalado Snapcraft, puedes comenzar a definir la configuración y los metadatos para tu aplicación Snap.

Paso 3 – Definición de la configuración y los metadatos para tu Snap

En este paso, comenzarás a definir la configuración, estructura y metadatos para tu aplicación Snap.

Comienza por asegurarte de que todavía estás trabajando en tu directorio de aplicaciones Snap:

A continuación, crea y edita el archivo snapcraft.yaml con tu editor de texto preferido:

Utilizarás el archivo snapcraft.yaml para almacenar toda la configuración de tu aplicación Snap, incluido el nombre, la descripción y la versión. Asimismo, la configuración relacionada con la gestión de dependencias y el sandboxing.

Inicia por definir el nombre, resumen, descripción y número de versión para tu aplicación:

El nombre de tu Snap debe ser único si deseas publicarlo en la Snap Store.  Debes buscar otras aplicaciones con el mismo nombre para asegurarte de que no se haya usado.

Definir comandos

A continuación, puedes definir los comandos que deseas asociar con tu aplicación. Esto permitirá que tu Snap se use directamente desde la línea de comandos de Bash como un comando normal.

Agrega lo siguiente a tu archivo snapcraft.yaml:

your-snap-command es el nombre del comando que deseas definir. Por ejemplo, es posible que desees utilizar el comando helloworld para ejecutar tu programa Hola Mundo.

Puedes usar command: your-snap para decirle a Snapcraft que hay que hacer cuando se ejecuta el comando de la aplicación. En el caso del programa Hola Mundo, usarías el valor helloworld para hacer referencia al archivo helloworld.go. Esto permitirá a Snapcraft ejecutar tu programa con éxito.

Esto da como resultado la siguiente configuración de ejemplo:

Si el nombre del comando coincide exactamente con el nombre de Snap, podrás ejecutarlo directamente desde la línea de comandos. Si el comando no coincide con el nombre de Snap, el comando será prefijado automáticamente con el nombre de Snap. Por ejemplo, helloworld.command1.

Definir las partes

Finalmente, puedes definir las partes que componen tu aplicación Snap. Las aplicaciones Snap están formadas por múltiples partes, que son todos los componentes que conforman tu aplicación. En muchos casos, solo hay una parte, que es la aplicación misma.

Cada parte tiene un snap asociado. Por ejemplo, para los componentes de tu aplicación escritos en Ruby, ruby usa el snap, y para los componentes escritos en Go, go usa el snap.

Puede usar el comando Snapcraft list-plugins para identificar los complementos correctos para tu aplicación:

Esto generará una lista similar a la siguiente:

Los complementos más comunes son aquellos para lenguajes de programación comunes, como Go, Rust, Ruby o Python.

Una vez que hayas identificado los complementos correctos para tu aplicación, puedes comenzar a agregar la configuración parts a tu archivo snapcraft.yaml:

Utiliza el parámetro source de configuración para especificar la ruta relativa al código fuente de tu aplicación. Por lo general, este será el mismo directorio que el archivo snapcraft.yaml en sí, por lo que el valor source es un solo punto (.).

Nota: Si el componente de tu aplicación tiene dependencias necesarias para compilarla o ejecutarla, puede especificarlo utilizando los atributos build-packagesstage-packages. Los nombres de dependencia especificados se recuperarán automáticamente del administrador de paquetes predeterminado para tu sistema.

Por ejemplo:

Algunos complementos de Snapcraft tienen sus propias opciones específicas que pueden ser necesarias para tu aplicación. Por lo que vale la pena revisar las páginas del manual relevantes para tu complemento:

En el caso de las aplicaciones Go, también deberías especificar el go-importpath. Para la configuración Hello World, esto da como resultado la siguiente configuración de ejemplo:

Puedes dejar tu archivo snapcraft.yaml abierto para agregar más configuración en el siguiente paso.

Has definido la configuración base para tu aplicación Snap. A continuación, configurarás los aspectos de seguridad y sandboxing de tu aplicación.

Paso 4 – Asegurar tu aplicación Snap

Las aplicaciones Snap están diseñadas para ejecutarse en un entorno de espacio aislado (sandboxing), por lo que en este paso configurarás el sandboxing para tu Snap. En primer lugar, deberás habilitar el sandboxing para tu aplicación, conocido dentro de Snapcraft como confinement.

Debes agregar lo siguiente a tu archivo snapcraft.yaml:

Esto habilitará el sandboxing para tu aplicación, evitando que acceda a Internet, a otros Snaps en ejecución o al propio sistema host. Sin embargo, en la mayoría de los casos, las aplicaciones necesitan poder comunicarse fuera de su sandbox. Por ejemplo, cuando necesitan acceder a Internet o leer/escribir en el sistema de archivos.

Estos permisos, conocidos dentro de Snapcraft como interfaces, se pueden otorgar a tu aplicación Snap mediante Plugs. Al usar Plugs, puedes tener un control exhaustivo sobre el sandboxing para tu aplicación, para darle el acceso que requiere y nada más. Esto es el principio de mínimo privilegio.

Las interfaces exactas que se requieren variarán según tu aplicación. Algunas de las interfaces más comunes son:

  • audio-playback – Permite la salida de audio / reproducción de sonidos.
  • audio-record – Permite la entrada / grabación de audio.
  • camera – Permite el acceso a cámaras web conectadas.
  • home – Permite el acceso a archivos no ocultos dentro de tu directorio de inicio.
  • network – Permite el acceso a la red / internet.
  • network-bind – Permite vincular a los puertos para operar como un servicio de red.
  • system-files – Permite el acceso a todo el sistema de archivos de la máquina host.

Mas interfaces

La lista completa de interfaces disponibles se puede encontrar en la documentación de Snapcraft en Interfaces compatibles.

Una vez que hayas identificado todas las interfaces necesarias para tu aplicación, puedes comenzar a asignarlas mediante plugs dentro de tu archivo snapcraft.yaml.

El siguiente ejemplo de configuración permitirá que la aplicación acceda a la red y al área de inicio de los usuarios:

Debes guardar y salir de tu archivo.

El nombre del plug (complemento) debe ser un nombre descriptivo para ayudar a los usuarios a identificar el propósito del mismo.

Habilitaste el sandboxing para tu Snap y configuraste algunos complementos para otorgar acceso limitado a los recursos del sistema. A continuación, terminarás de crear tu aplicación Snap.

Paso 5 – Crear y probar tu aplicación Snap

Ahora que has escrito toda la configuración requerida para tu Snap, puedes proceder a compilarlo y probar el paquete Snap localmente.

Si has seguido el paso a paso del programa Hello World como tu aplicación, tu archivo snapcraft.yaml completo ahora se verá similar al siguiente:

Para compilar tu aplicación Snap, ejecuta el comando snapcraft desde el directorio de tu Snap:

Snapcraft iniciará automáticamente una máquina virtual (VM) y comenzará a compilar tu Snap. Una vez completado, Snapcraft saldrá y verás algo similar a lo siguiente:

Ahora puedes instalar tu Snap localmente para verificar que esté funcionando:

El argumento –dangerous del comando es obligatorio ya que estás instalando un Snap local que no ha sido firmado.

Una vez que se completa el proceso de instalación, puedes ejecutar tu Snap utilizando tu comando asociado. Por ejemplo:

En el caso del programa Hola Mundo de ejemplo, el resultado sería:

También puedes ver la política de sandboxing para tu Snap para asegurarte de que los permisos asignados se hayan otorgado correctamente:

Esto generará una lista de complementos e interfaces, similar a la siguiente:

En este paso, compilaste tu Snap y lo instalaste localmente para probar que está funcionando. A continuación, publicarás tu Snap en Snap Store.

Paso 6 – Publicar tu Snap

Ahora que has creado y probado tu aplicación Snap, es hora de publicarla en Snap Store.

Debes comenzar iniciando sesión en tu cuenta de desarrollador Snap utilizando la aplicación de línea de comandos Snapcraft:

Sigue las instrucciones para ingresar tu dirección de correo electrónico y contraseña.

A continuación, debes registrar el nombre de la aplicación en Snap Store:

Una vez que hayas registrado el nombre de Snap, puedes enviar el paquete Snap compilado a la tienda:

Verás una salida similar a la siguiente:

Cada vez que ingresas a la tienda Snap, el número de revisión se incrementa, comenzando en uno. Esto es útil para ayudar a identificar las diferentes compilaciones de tu Snap.

Finalmente, puedes liberar tu Snap al público:

Si es la primera vez que ingresas a Snap Store, el número de revisión será 1. También puedes escoger entre liberar a los canales stable, candidate, beta, y edge, si tienes varias versiones de tu aplicación en diferentes etapas de desarrollo.

Por ejemplo, el siguiente comando liberará la revisión 1 de Hola Mundo Snap en el canal stable:

Verás una salida similar a la siguiente:

Ahora puedes buscar tu aplicación en Snap Store e instalarla en cualquiera de tus dispositivos.

En este paso final, subiste tu paquete Snap compilado en la tienda de Snap y lo liberaste al público.

Conclusión

En este artículo, configuraste y creaste una aplicación Snap, y luego lo liberaste al público a través de Snap Store. Ahora tienes los conocimientos básicos necesarios para mantener tu aplicación y crear otras nuevas.

Si deseas explorar más Snaps, puedes explorar la tienda completa de Snap. También es posible que desee revisar la Referencia YAML de Snapcraft para comprender más al respecto e identificar atributos adicionales para tu configuración de Snap.

Finalmente, si deseas investigar más sobre el desarrollo de Snap, puedes disfrutar leyendo e implementando Snap Hooks. Estos permiten a Snaps reaccionar dinámicamente a los cambios del sistema, como actualizaciones o ajustes de políticas de seguridad.