Tutorial de Creación de paquetes Snap con SnapCraft

Un complemento es un paquete de una aplicación y sus dependencias que funciona sin modificaciones en muchas distribuciones de Linux diferentes. Los snaps se pueden descubrir e instalar desde Snap Store , una tienda de aplicaciones con una audiencia de millones.

Snapcraft es una herramienta de línea de comandos potente y fácil de usar para crear instantáneas . Lee un archivo declarativo simple y ejecuta la compilación por nosotros.

En este tutorial, exploraremos algunas de las mejores características de Snapcraft antes de usarlo para crear una primera instantánea ideal. Para obtener una visión más detallada de la creación de instantáneas , consulte Creación de una instantánea en la documentación oficial.


1. Empezando

Este tutorial ha sido escrito para funcionar en Ubuntu 18.04 LTS. Sin embargo, debería funcionar sin modificaciones en versiones posteriores de Ubuntu y otras distribuciones de GNU / Linux derivadas de una base de Ubuntu 18.04, como Linux Mint 19.x.

Instalación de dependencias

Primero, abra una terminal y asegúrese de haber instalado snap :

$ snap --version

Si está instalado, verá algo similar a lo siguiente:

snap    2.39.3
snapd   2.39.3
series  16
ubuntu  18.04
kernel  5.0.0-36-generic

Consulte Instalación de snapd si snap no está instalado.

Ahora podemos instalar Snapcraft con un solo comando:

$ sudo snap install --classic snapcraft

NOTA: El --classicinterruptor permite la instalación de un broche que utiliza el confinamiento clásico . Hablamos del confinamiento de seguridad instantánea en la siguiente sección.

Estamos listos. ¡Empecemos y construyamos nuestro primer snap!


2. Crear un complemento es fácil

 Iniciando el proyecto

Lo primero que debe hacer es crear un directorio de instantáneas general seguido de un directorio de trabajo para este proyecto de instantánea específico:

$ mkdir -p ~/mysnaps/hello
$ cd ~/mysnaps/hello

Es desde dentro de este hellodirectorio donde invocaremos todos los comandos posteriores.

NOTA: Debido a una limitación en el proyecto que vamos a construir, la ruta del directorio en el que colocó el hellodirectorio no debe contener espacios .

Empiece por inicializar su entorno instantáneo:

$ snapcraft init

Esto crea un snapcraft.yamlen el que declaras cómo se construye el complemento y qué propiedades expone al usuario. Editaremos esto más tarde.

La estructura del directorio ahora se ve así:

mysnaps/
??? hello
    ??? snap
        ??? snapcraft.yaml

Nota: Cualquier instantánea futura que desee crear debe colocarse dentro de su propio directorio en mysnaps.

Describiendo el chasquido

Echemos un vistazo a la parte superior de su archivo snapcraft.yaml. Debería verse como se muestra a continuación:

name: my-snap-name # you probably want to 'snapcraft register <name>'
base: core18 # the base snap is the execution environment for this snap
version: '0.1' # just for humans, typically '1.2+git' or '1.3.2'
summary: Single-line elevator pitch for your amazing snap # 79 char long summary
description: |
  This is my-snap's description. You have a paragraph or two to tell the
  most important story about your snap. Keep it under 100 words though,
  we live in tweetspace and your description wants to look good in the snap
  store.

grade: devel # must be 'stable' to release into candidate/stable channels
confinement: devmode # use 'strict' once you have the right plugs and slots

Esta parte de snapcraft.yamles obligatoria y son metadatos básicos para el complemento.

Repasemos esta línea por línea:

  • nombre : el nombre del complemento.

  • base : un complemento básico que proporciona un entorno de tiempo de ejecución con un conjunto mínimo de bibliotecas que son comunes a la mayoría de las aplicaciones. Para la mayoría de las instantáneas, esto debería ser core18, lo que equivale a Ubuntu 18.04 LTS.

  • versión : la versión actual del complemento. Esta es solo una cadena legible por humanos. Todas las cargas instantáneas recibirán una revisión instantánea incremental , que es independiente de esta versión. Está separado para que pueda cargar varias veces el mismo complemento para la misma arquitectura con la misma versión. Véalo como una cadena que le indica a su usuario la versión actual, como "estable", "2.0", etc.

  • resumen : un resumen breve de una línea o un eslogan para su complemento.

  • descripción : una descripción más larga del complemento. Puede abarcar varias líneas si tiene el prefijo '|' personaje.

  • grado : puede ser utilizado por el editor para indicar la confianza de calidad en la construcción. La tienda evitará publicar compilaciones de grado 'desarrollo' en el canal 'estable'.

  • confinamiento : nivel de confinamiento de un broche de presión es el grado de aislamiento que tiene de su sistema, y hay tres niveles: strict, classicy devmode. Las instantáneas estrictas se ejecutan en completo aislamiento, las classicinstantáneas tienen acceso abierto a los recursos del sistema y las instantáneas en modo de desarrollo se ejecutan de forma estricta pero con acceso abierto al sistema. Este último es ideal para el desarrollo, pero su complemento deberá pasar del modo dev para ser publicado. Consulte Confinamiento instantáneo para obtener más detalles.

    En este tutorial, vamos a centrarnos en devmodey strictconfinamiento.

Para obtener información más detallada sobre estos metadatos de nivel superior, consulte Agregar metadatos globales .

Y eso es todo por lo básico. Ahora es el momento de personalizar el archivo snapcraft.yaml para nuestro propio complemento. Teniendo en cuenta lo anterior, podemos cambiar la parte superior del archivo para que sea:

name: hello
base: core18
version: '2.10'
summary: GNU Hello, the "hello world" snap
description: |
  GNU hello prints a friendly greeting.
grade: devel
confinement: devmode

Nota: La información de la versión es solo para el consumo instantáneo del usuario y no tiene ningún efecto sobre las actualizaciones instantáneas. Se define entre comillas, ( '2.10'), porque debe ser una cadena YAML en lugar de un número de punto flotante. El uso de una cadena permite detalles de versión no numéricos, como ' myfirstversion' o ' 2.3-git'.

Agregar una pieza

Las partes se utilizan para describir su aplicación, dónde se pueden encontrar sus diversos componentes, sus requisitos de compilación y tiempo de ejecución, y los de sus dependencias. Un complemento consta de una o más partes, según su complejidad.

Aquí hay algunos ejemplos de instantáneas de varias partes: - instantáneas con partes lógicas separadas, como una instantánea de servidor que contiene un servidor web, una base de datos y la aplicación misma - un juego que envía el motor del juego y los datos del juego para tres juegos diferentes, cada uno uno está definido en su propia parte - encaja con partes de diferentes ubicaciones - partes que se construyen de una manera diferente

Nuestro hellocomplemento será agradable y simple. Consistirá en una sola parte por ahora. En las siguientes páginas la vamos a ampliar gradualmente.

Dos elementos imprescindibles para cada parte son la definición de "fuente" y "complemento". Piense en estos como el "qué" y el "cómo", respectivamente. Como fuente, puede, por ejemplo, elegir un repositorio de fuentes (como git), un tarball o un directorio local. Snapcraft admite muchos complementos, lo que le permite crear una amplia variedad de tipos de proyectos (por ejemplo, autotools, cmake, go, maven, nodejs, python2, python3).

Para compilar hello, agregue la siguiente estrofa de 'partes' a su snapcraft.yamlarchivo (reemplace cualquier otra cosa que pueda estar allí):

parts:
  gnu-hello:
    source: http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
    plugin: autotools

Entonces hemos agregado una parte llamada gnu-hello(su nombre es arbitrario). Para 'fuente', especificamos un tarball ubicado en el servidor FTP del proyecto GNU. Como 'complemento', hemos elegido autotoolscuál utiliza los ./configure && make && make installpasos de compilación tradicionales .

Ver plugins compatibles , o correr snapcraft list-plugins, para obtener más información sobre la que construir-herramientas y plataformas soportes Snapcraft.

Para construir nuestro complemento, todo lo que necesita hacer es:

$ snapcraft

La primera vez que ejecute snapcraft, es posible que se le solicite permiso para instalar Multipass . Snapcraft usa Multipass tanto para simplificar el proceso de construcción como para confinar el entorno de construcción dentro de una máquina virtual. Ofrece la mejor experiencia de construcción, por lo que recomendamos encarecidamente responder "y". Sin embargo, si prefiere no utilizar Multipass, también puede compilar de forma nativa, remota y con LXD. Consulte Opciones de compilación para obtener más detalles.

Durante la compilación, Snapcraft mostrará una gran cantidad de resultados, sin embargo, una compilación exitosa terminará con:

[...]
Staging gnu-hello
Priming gnu-hello
Snapping 'hello' |                                               
Snapped hello_2.10_amd64.snap

¡Felicidades! Acaba de crear su primer complemento, que ahora está listo para ser instalado:

$ sudo snap install --devmode hello_2.10_amd64.snap

La salida debe declarar:

hello 2.10 installed

Para obtener información sobre el complemento instalado:

$ snap list hello

Salida de muestra:

Name   Version  Rev  Tracking  Developer  Notes
hello  2.10     x1   -         -          devmode

Intentemos ejecutarlo:

$ hello

En Ubuntu tradicional obtendrás:

The program 'hello' can be found in the following packages:
 * hello
 * hello-traditional
Try: sudo apt install <selected package>

O puede obtener un error diferente si instaló previamente el hellocomplemento:

$ hello

Salida:

bash: /snap/bin/hello No such file

¡El comando no existe a pesar de ser parte de nuestro complemento e instalado! De hecho, las instantáneas no exponen nada al usuario de forma predeterminada (comando, servicios, etc.). Tenemos que hacer esto explícitamente y eso es exactamente lo que vas a abordar a continuación.

Si se hace el trabajo para usted, usted debe verificar que es el correcto helloorden. Verifique la salida de which hello- podría enumerar algo como /usr/bin/hello. Lo que buscamos es un binario en el /snap/bindirectorio.


3. ¡Exponer una aplicación a través de su complemento!

Definición de comandos

Para que los servicios y comandos estén expuestos a los usuarios, ¡debe especificarlos, por snapcraft.yamlsupuesto! Esto se encargará de un par de cosas por ti:

  • se asegurará de que los servicios se inicien / detengan automáticamente
  • todos los comandos tendrán "espacio de nombres", por lo que podría, por ejemplo, instalar el mismo complemento de diferentes editores y aún poder ejecutar los instantáneos por separado

Exponer el hellocomando es indoloro. Todo lo que necesita hacer es agregar lo siguiente a su snapcraft.yamlarchivo:

apps:
  hello:
    command: bin/hello

Esto define una aplicación denominada hello, que apunta al ejecutable bin/helloen la estructura de directorio enviada por el complemento.

Por lo general, recomendamos colocar esta estrofa entre los campos de metadatos y el campo 'partes'. Técnicamente, el orden no importa, pero tiene sentido colocar las piezas básicas antes que las más complejas.

Nuestro snapcraft.yamlarchivo ahora debería parecerse a esto:

name: hello
base: core18
version: '2.10'
summary: GNU Hello, the "hello world" snap
description: |
  GNU hello prints a friendly greeting.
grade: devel
confinement: devmode

apps:
  hello:
    command: bin/hello

parts:
  gnu-hello:
    source: http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
    plugin: autotools

Iterando sobre tu chasquido

Ahora que el comando está definido, reconstruyamos el complemento. Puede hacer esto simplemente ejecutando Snapcraft nuevamente; solo los elementos nuevos o modificados se construirán y fusionarán en un nuevo complemento.

Sin embargo, para mostrar un proceso de creación de instantáneas más típico, usaremos un comando ligeramente diferente que nos permitirá echar un vistazo al complemento que estamos construyendo antes de que se cree el complemento:

$ snapcraft prime --shell

Este comando le dice a snapcraft que ejecute la compilación hasta el paso "principal" y abra un shell dentro del entorno de compilación instantánea, siendo el primer paso la etapa final en un proceso de cuatro pasos:

  1. pull: descarga o recupera los componentes necesarios para construir la pieza
  2. construir: construye la pieza a partir de los componentes extraídos previamente
  3. copia los componentes integrados en el área de preparación
  4. copia los componentes en etapas en el área de imprimación, en sus ubicaciones finales para el ajuste resultante.

Otro comando útil es snapcraft --debug. Esto abrirá un shell en el entorno de compilación cuando se produzca un error, lo que le permitirá investigar el error antes de reanudar la compilación.

Desde dentro del shell, puede ver que si bien el binario que acabamos de agregar está en el directorio de escenario , aún no está en primo :

$ ls stage/bin/
hello
$ ls prime/bin/
ls: cannot access 'prime/bin': No such file or directory

Puede continuar construyendo su snap desde dentro del entorno de construcción usando los mismos comandos de snapcraft que usa en el exterior, con la conveniencia de tener un prompt directamente dentro del entorno. Para construir el escenario principal, por ejemplo, simplemente escriba snapcraft prime:

$ snapcraft prime
Skipping pull gnu-hello (already ran)
Skipping build gnu-hello (already ran)
Skipping stage gnu-hello (already ran)
Priming gnu-hello

El binario hello ahora estará en el directorio prime / bin :

$ sudo snap install --devmode hello_2.10_amd64.snap
$ ls prime/bin
hello

Para reanudar la compilación y generar el complemento, puede escribir snapcraftdentro del entorno de compilación o salir y ejecutar snapcraftnuevamente desde allí. De cualquier manera, el complemento resultante se colocará en el directorio del proyecto del complemento.

Ahora podemos volver a instalar el nuevo complemento y ejecutar hello :

$ hello
Hello, world!

La ruta para el binario también debe establecerse correctamente:

$ which hello
/snap/bin/hello

¡Bien hecho! ¡Acabas de hacer tu primer snap de trabajo!


4. Un broche está hecho de piezas

Agreguemos otra parte para hacer el complemento un poco más interesante. En la definición de 'partes', agregue:

parts:
  [...]
  gnu-bash:
    source: http://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz
    plugin: autotools

Notarás que esta parte (nombrada gnu-bash) funciona de manera muy similar a la gnu-helloparte anterior: descarga un tarball y lo construye usando el autotoolscomplemento.

Como hicimos antes, necesitamos definir el comando que queremos exponer. Hagamos esto ahora. En la definición de 'aplicaciones', agregue:

apps:
  [...]
  bash:
    command: bash

Esta vez, el nombre del comando es diferente del nombre del complemento. De forma predeterminada, todos los comandos se exponen al usuario como <snap-name>.<command-name>. Este binario será así hello.bash. De esa manera, evitaremos un conflicto con /bin/bash(los binarios del sistema triunfan sobre los binarios enviados por snaps) o cualquier otro snaps que envíe un bashcomando. Sin embargo, como recordará, se nombra el primer binario hello. Esto se debe a la simplificación cuando es igual. En lugar de hello.hello, tenemos el comando condensado en hello.

Nuestro complemento, por lo tanto, dará como resultado el envío de dos binarios: helloy hello.bash.

Tenga en cuenta que lo configuramos bashcomo el parámetro de comando, y no bin/bashrelativo al directorio snap del sistema ( $SNAP=/snap/hello/current) como lo hicimos hello. Ambos son igualmente válida porque snapcrafty snapdcrear un pequeño envoltorio alrededor de su comando ejecutable que establece algunas variables de entorno. Técnicamente, $SNAP/binse le antepondrá a usted $PATHpara este complemento. Esto evita la necesidad de establecer la ruta de forma explícita. Este tema se abordará en las próximas secciones.

Ahora vuelva a hacer la compilación:

$ snapcraft

gnu-bashAhora solo se construirá la parte (ya que nada cambió en la otra parte). Esto hace que las cosas sean más rápidas, pero dado que Bash es en sí mismo una pieza importante de software, este comando aún tardará bastante en completarse.

Instale el complemento resultante nuevamente y verifique si el nuevo binario está disponible:

$ sudo snap install --devmode hello_2.10_amd64.snap
$ hello
Hello, world!

Ahora prueba bash:

$ hello.bash

Lo anterior debería producir:

bash-4.3$ env
[ outputs a list of environment variables ]

Ahora sal de ese shell de Bash:

bash-4.3$ exit

Verá que las variables de entorno disponibles en su complemento son un poco diferentes de su entorno de usuario. Se agregan $SNAP_algunas variables adicionales como y algunas variables de entorno del sistema se han modificado para que apunten a su directorio snap, como $PATHo $LD_LIBRARY_PATH. ¡Tómate el tiempo para familiarizarte con ellos!

Consulte Variables de entorno para obtener más detalles.

¡Excelente trabajo! ¡Lo tienes todo bien y funcionando!


5. Eliminando devmode

Una última cosa que podría querer hacer antes de que el complemento esté listo para un consumo más amplio es eliminar el devmodeestado.

Importante: los
usuarios de snaps que usen devmodedeberán pasar --devmodedurante la instalación, por lo que aceptan explícitamente confiar en usted y en su complemento. Otro beneficio de eliminar devmodees que podrá enviar su complemento a los canales 'estables' o 'candidatos' (solo puede liberar a los otros canales, como 'beta' o 'borde' ya que su complemento es menos confiable) y los usuarios podrán buscarlo usando snap find.

Para que esto sea declarado en su complemento, vamos a establecer confinementa stricten snapcraft.yaml:

confinement: strict

¡Ahora construyamos el complemento e instálelo correctamente! Es decir, vamos a llamar snapcraftsin --devmodeprobarlo realmente en confinamiento:

$ snapcraft
[...]
$ sudo snap install hello_2.10_amd64.snap

Nota:
Obtuvimos el nombre del paquete instantáneo de la última línea de salida del snapcraftcomando.

¡Ay! Esto da:

error: cannot find signatures with metadata for snap "hello_2.10_amd64.snap"

De hecho, intentamos instalar un complemento que no estaba firmado por Snap Store. Anteriormente, realizamos instalaciones locales a través de las --devmodecuales implicaba (además de ejecutarse sin confinamiento) que se podía instalar un complemento sin firmar. Como este ya no es el caso, debemos indicar que está bien instalar un complemento sin firmar. Esto se hace a través de la --dangerousopción:

$ sudo snap install hello_2.10_amd64.snap --dangerous

¡Prueba de nuevo!

$ hello
Hello, world!

Creando un nuevo caparazón

$ hello.bash

... y emita un comando allí:

bash-4.3$ ls

ahora da:

ls: cannot open directory '.': Permission denied

Salga del caparazón por ahora:

bash-4.3$ exit

¿Que esta pasando aqui? Su complemento no está roto, solo está confinado ahora y, por lo tanto, solo puede acceder a sus propios directorios respectivos.

Nota:
Para otras instantáneas, es posible que deba declarar si los comandos o servicios necesitan permisos especiales (por ejemplo, acceso a la red o al audio). Un tutorial sobre "interfaces", "ranuras" y "enchufes" cubrirá este mismo tema.

Estás listo. Este complemento está listo para su publicación. ¡Increíble!


6. Empuje a la tienda

Las aplicaciones se cargan fácilmente en Snap Store . Registrar una cuenta es fácil, así que hagámoslo primero.

Registro de una cuenta

Comience por ir al panel de Snapcraft y haga clic en el botón "Iniciar sesión o registrarse" en la esquina superior derecha:

Si aún no tiene una cuenta de Ubuntu One (SSO), seleccione "Soy un nuevo usuario de Ubuntu One" y complete los datos necesarios:

Una vez que haya iniciado sesión en Ubuntu One, verá su nombre en la esquina superior derecha. Haga clic en su nombre para revelar un menú y luego seleccione "Detalles de la cuenta". Deberá aceptar los Términos y condiciones para desarrolladores antes de hacer clic en el botón verde "Registrarse":

Se mostrará su configuración actual. Revíselos. Su "nombre de usuario de la tienda Snap" puede estar preestablecido y no se puede editar. Hay "datos de contacto" que tal vez desee completar, así como una foto personal para cargar.

Si realizó algún cambio, presione el botón verde "Actualizar mi cuenta".

Autenticación de línea de comandos

Ahora iniciaremos sesión con el comando snapcraft usando su nueva cuenta. La primera vez que lo haga, se le pedirá que habilite la autenticación multifactor y que acepte los términos y condiciones del desarrollador:

$ snapcraft login

A continuación, se muestra una sesión de muestra:

Enter your Ubuntu One e-mail address and password.
If you do not have an Ubuntu One account, you can create one at https://snapcraft.io/account
Email: myemail@provider.com
Password:
Second-factor auth: (press Enter if you don't use two-factor authentication):

Login successful.

Puede cerrar sesión en cualquier momento con snapcraft logout.

Registrar un nombre instantáneo

Antes de poder cargar un complemento, deberá registrar (reservar) un nombre para él. Esto se hace con snapcraft register <some_name>.

Aquí, asumiendo que Javier es el nombre de usuario de la tienda establecido anteriormente, haremos:

$ snapcraft register hello-javier

A continuación, se muestra una sesión de muestra:

We always want to ensure that users get the software they expect
for a particular name.

If needed, we will rename snaps to ensure that a particular name
reflects the software most widely expected by our community.

For example, most people would expect 'thunderbird' to be published by
Mozilla. They would also expect to be able to get other snaps of
Thunderbird as 'thunderbird-$username'.

Would you say that MOST users will expect 'hello-javier' to come from
You, and be the software you intend to publish there? [y/N]: y

Registering hello-javier.
Congratulations! You're now the publisher for 'hello-javier'.

Claramente, la Tienda prefiere que el nombre sea del formato <local snap name>-<store-username>.

El nombre del complemento hello-javieres diferente del helloque colocamos inicialmente en nuestro snapcraft.yamlarchivo. Necesitaremos editar ese archivo en consecuencia y reconstruir el complemento. ¡Este es también un momento oportuno para cambiar el 'grado' a 'estable'!

El archivo ahora debería incluir las siguientes líneas:

name: hello-javier
grade: stable

Reconstruir:

$ snapcraft

Ahora debería tener un paquete instantáneo llamado hello_-javier_2.10_amd64.snap.

Nota:
recuerde que ya instaló un paquete instantáneo llamado hello_2.10_amd64.snap. No olvide desinstalarlo con sudo snap remove hello.

Empuje y suelte su broche

¡Es hora de que este complemento esté disponible para el mundo!

Lancémoslo al canal 'candidato' por ahora:

$ snapcraft push hello-javier_2.10_amd64.snap --release=candidate

Salida:

Pushing hello-javier_2.10_amd64.snap
After pushing, an attempt will be made to release to 'candidate'
Preparing to push 
'/home/ubuntu/mysnaps/hello/hello-javier_2.10_amd64.snap' to the store.
Pushing hello-javier_2.10_amd64.snap [====================================================] 100%
Processing...|                                                                                       
Ready to release!
Revision 1 of 'hello-javier' created.
Track    Arch    Channel    Version    Revision
latest   amd64   stable     -          -
                 candidate  2.10       1
                 beta       ^          ^
                 edge       ^          ^
The 'candidate' channel is now open.

Debería recibir un correo electrónico informándole que su complemento está pendiente de revisión (verificación automática). Si no está utilizando ninguna interfaz reservada y los controles de seguridad están pasando, los usuarios podrán instalarlo así:

$ sudo snap install hello-javier --channel=candidate

Mientras cargamos un binario amd64, solo las personas en máquinas de 64 bits tendrán acceso a este complemento. Puede concentrarse en una arquitectura para admitir, construir manualmente un binario para cada arquitectura que desee admiti

Podría ser de Interés...

Manejo y crear menus en bash sh consola linux. Terminal.


www.compostela21.com
diariocompostela21@gmail.com
20/04/2024