Tutorial

Comment packager et publier une application Snap sur Ubuntu 18.04

DevelopmentUbuntu 18.04

L'auteur a choisi Electronic Frontier Foundation pour recevoir un don dans le cadre du programme Write for DOnations.

Introduction

L'un des plus grands défis du développement d'applications est l'étape finale de la distribution du produit fini à vos utilisateurs ou clients. De nombreuses méthodes de déploiement d'applications existantes manquent d'intuitivité et de sécurité, ou ne prévoient pas de méthodes pour mettre à jour automatiquement une application une fois qu'elle a été installée.

Snap est un format moderne de packaging d'application avec de puissantes fonctions de sandboxing et de sécurité, y compris l'isolation du système de fichiers, les mises à jour automatiques et la gestion intégrée des dépendances. Les applications Snap, connues sous le nom de Snaps, peuvent être téléchargées et installées en utilisant un programme en ligne de commande, tel que apt ou yum. Snap est pré-installé sur Ubuntu, ce qui signifie que les applications Snap ont un large public.

Dans ce tutoriel, vous allez créer une application Snap et la publier sur le Snap Store.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de :

  • Un serveur Ubuntu 18.04 configuré en suivant la Configuration initiale du serveur avec Ubuntu 18.04, y compris un utilisateur sudo non root.

  • Une application que vous souhaitez packager et diffuser en tant que Snap. Il peut s'agir d'une application complexe que vous avez créée, d'un projet open source commun ou d'un simple programme « Hello World ». Si vous n'avez pas encore d'application, l’étape 1 de ce tutoriel vous expliquera comment créer un programme Hello World dans Go.

  • Un compte sur Snapcraft Developer Dashboard.

Une fois que tout cela est prêt, connectez-vous à votre serveur en tant qu'utilisateur non root pour commencer.

Étape 1 - Préparation de votre application pour le packaging

Tout d'abord, vous devez préparer votre application pour le packaging en tant qu'application Snap en vous assurant que tous les éléments requis sont disponibles dans un seul répertoire.

Commencez par créer un répertoire pour votre Snap et entrez dans celui-ci :

  • mkdir ~/your-snap
  • cd ~/your-snap

Ensuite, si vous avez déjà une application, placez une copie complète de son code source dans le répertoire que vous venez de créer. Le processus varie considérablement en fonction de l'application exacte que vous packagez, mais si le code source est stocké dans un dépôt Git, vous pouvez exécuter la commande git init pour initialiser un référentiel dans le répertoire et en extraire tout le code pertinent.

Si vous n'avez pas encore d'application que vous aimeriez packager, vous pouvez créer un programme Hello World à utiliser à la place. Si vous souhaitez en savoir plus sur la rédaction de ce programme avec Go, consultez le tutoriel Comment rédiger votre premier programme dans Go.

Pour écrire le programme, créez d'abord un fichier Go et ouvrez-le à l'aide de votre éditeur de texte préféré :

  • nano helloworld.go

Ensuite, ajoutez le code suivant au fichier :

helloworld.go
package main
import "fmt"
func main() {
  fmt.Println("Hello, world!")
}

Puis, enregistrez et quittez le fichier.

Si vous n'avez pas installé Go, vous pouvez le faire en utilisant la commande suivante :

  • sudo apt install golang-go

Une fois Go installé, vous pouvez exécuter votre nouveau programme pour vérifier qu'il fonctionne :

  • go run helloworld.go

Vous verrez la sortie suivante :

Output
Hello, world!

Vous avez préparé votre application à être packagée en tant que Snap. Ensuite, vous allez installer le logiciel nécessaire pour commencer le processus de packaging.

Étape 2 - Installation de Snapcraft

Au cours de cette étape, vous allez télécharger et installer Snapcraft, l'outil officiel de packaging des applications Snap. Snapcraft est disponible sur le Snap Store, qui est intégré par défaut dans Ubuntu. Cela signifie que vous pouvez installer Snapcraft à partir de la ligne de commande en utilisant la commande snap.

La commande snap est équivalente à la commande apt, mais vous pouvez l'utiliser pour installer des logiciels depuis le Snap Store, plutôt que des packages depuis les dépôts Apt.

Pour installer Snapcraft, exécutez la commande suivante :

  • sudo snap install snapcraft --classic

Vous utilisez l'argument de commande --classic pour que Snapcraft s'installe sans les fonctionnalités strictes de sandboxing que les Snaps utilisent normalement. Snapcraft nécessite cet argument car il a besoin d'un accès plus privilégié à votre système pour packager les applications de manière fiable.

Une fois Snapcraft installé, vous verrez ce qui suit :

Output
snapcraft 3.9.8 from Canonical✓ installed

Enfin, vous pouvez revérifier l'installation de Snapcraft en exécutant :

  • snapcraft --version

Cela affichera une sortie semblable à :

Output
snapcraft, version 3.9.8

Maintenant que vous avez installé Snapcraft, vous pouvez commencer à définir la configuration et les métadonnées de votre application Snap.

Étape 3 - Définition de la configuration et des métadonnées pour votre Snap

Au cours de cette étape, vous commencerez à définir la configuration, la structure et les métadonnées de votre application Snap.

Commencez par vous assurer que vous travaillez toujours dans le répertoire de votre application Snap :

  • cd ~/your-snap

Ensuite, créez et modifiez le fichier snapcraft.yaml en utilisant votre éditeur de texte préféré :

  • nano snapcraft.yaml

Vous utiliserez le fichier snapcraft.yaml pour stocker toute la configuration de votre application Snap, y compris le nom, la description et la version, ainsi que les paramètres liés à la gestion des dépendances et au sandboxing.

Commencez par définir le nom, le résumé, la description et le numéro de version de votre application :

snapcraft.yaml
name: your-snap
summary: A summary of your application in 78 characters or less.
description: |
  A detailed description of your application.
  The description can have multiple lines.
version: '1.0'

Le nom de votre Snap doit être unique si vous souhaitez le publier sur le Snap Store. Vérifiez si d'autres applications ne portent pas déjà le même nom en faisant une recherche sur le Snap Store.

Ensuite, vous pouvez définir la ou les commandes que vous souhaitez associer à votre application. Cela permettra à votre Snap d'être utilisé directement depuis la ligne de commande Bash comme une commande normale.

Ajoutez les éléments suivants à votre fichier snapcraft.yaml :

snapcraft.yaml
. . .
apps:
  your-snap-command:
    command: your-snap

your-snap-command est le nom de la commande que vous voulez définir. Par exemple, vous pouvez utiliser la commande helloworld pour exécuter votre programme Hello World.

Vous utilisez command: your-snap pour indiquer à Snapcraft ce qu'il doit faire lorsque la commande de l'application est exécutée. Dans le cas du programme Hello World, vous utiliserez la valeur helloworld pour référencer le fichier helloworld.go, ce qui permettra à Snapcraft d'exécuter votre programme.

Il en résulte l'exemple de configuration suivant :

snapcraft.yaml
apps:
  helloworld:
    command: helloworld

Si le nom de la commande correspond exactement au nom du Snap, vous pourrez l'exécuter directement depuis la ligne de commande. Si la commande ne correspond pas au nom du Snap, la commande sera automatiquement préfixée par le nom du Snap. Par exemple, helloworld.command1.

Enfin, vous pouvez définir les parties ou parts qui composent votre application Snap. Les applications Snap sont composées de plusieurs parties, qui sont tous les composants de votre application. Dans de nombreux cas, il n'y a qu'une seule partie, qui est l'application elle-même.

Chaque partie a un plugin associé. Par exemple, pour les composants de votre application écrits en Ruby, le plugin ruby est utilisé, et pour les composants écrits en Go, le plugin go est utilisé.

Vous pouvez utiliser la commande Snapcraft list-plugins pour identifier le ou les bons plugins pour votre application :

  • snapcraft list-plugins

Il en résultera une liste semblable à ce qui suit :

Output
ant catkin-tools conda dump gradle make nil python rust autotools cmake crystal go kbuild maven nodejs qmake scons catkin colcon dotnet godeps kernel meson plainbox-provider ruby waf

Les plugins les plus courants sont ceux des langages de programmation courants, tels que Go, Rust, Ruby ou Python.

Une fois que vous avez identifié les bons plugins pour votre application, vous pouvez commencer à ajouter la configuration parts à votre fichier snapcraft.yaml :

snapcraft.yaml
. . .
parts:
  your-snap:
    plugin: plugin-name
    source: .

Vous utilisez le paramètre de configuration source pour spécifier le chemin relatif vers le code source de votre application. Habituellement, il s'agit du même répertoire que le fichier snapcraft.yaml lui-même, de sorte que la valeur source est un point (.).

Remarque : si votre composant d'application comporte des dépendances qui sont nécessaires à sa construction ou à son exécution, vous pouvez les spécifier à l'aide des attributs build-packages et stage-packages. Les noms de dépendances spécifiés seront alors automatiquement récupérés dans le gestionnaire de packages par défaut de votre système.

Par exemple :

snapcraft.yaml
parts:
  your-snap:
  plugin: plugin-name
  source: .
  build-packages:
  - gcc
  - make
  stage-packages:
  - libcurl4

Certains plugins Snapcraft ont leurs propres options spécifiques qui peuvent être nécessaires pour votre application, il est donc utile de consulter les pages du manuel correspondant à votre plugin :

  • snapcraft help plugin-name

Dans le cas des applications Go, vous devez également préciser le chemin go-importpath. Pour la configuration Hello World, cela donne l'exemple de configuration suivant :

snapcraft.yaml
parts:
  helloworld:
    plugin: go
    source: .
    go-importpath: helloworld

Vous pouvez laisser votre fichier snapcraft.yaml ouvert pour ajouter une configuration supplémentaire à l'étape suivante.

Vous avez défini la configuration de base pour votre application Snap. Ensuite, vous allez configurer les aspects sécurité et sandboxing de votre application.

Étape 4 - Sécurisation de votre application Snap

Les applications Snap sont conçues pour fonctionner dans un environnement sécurisé par un sandbox (bac à sable). Dans cette étape, vous allez donc configurer le sandboxing pour votre Snap. Tout d'abord, vous devrez activer le sandboxing pour votre application, connu dans Snapcraft sous le nom de confinement.

Ajoutez les éléments suivants à votre fichier snapcraft.yaml :

snapcraft.yaml
. . .
confinement: strict

Cela permettra de mettre votre application en sandboxing, l'empêchant d'accéder à Internet, à d'autres Snaps en cours d'exécution ou au système hôte lui-même. Toutefois, dans la plupart des cas, les applications doivent pouvoir communiquer en dehors de leur sandbox, par exemple lorsqu'elles doivent accéder à Internet ou lire/écrire dans le système de fichiers.

Ces autorisations, connues sous le nom d’interfaces dans Snapcraft, peuvent être accordées à votre application Snap en utilisant des plugs. Grâce aux plugs, vous pouvez avoir un contrôle très précis sur le sandbox de votre application, pour lui donner l'accès qu'elle requiert et rien de plus (principe de moindre privilège).

Les interfaces exactes requises varient en fonction de votre application. Voici quelques-unes des interfaces les plus courantes :

  • audio-playback - Permet la sortie audio/la lecture de sons.
  • audio-record - Permet l'entrée/enregistrement audio.
  • camera - Permet l'accès aux webcams connectées.
  • home - Permet l'accès aux fichiers non cachés dans votre répertoire de base
  • network - Permet l'accès au réseau/à Internet.
  • network-bind - Permet de lier les ports pour qu'ils fonctionnent comme un service en réseau.
  • system-files - Permet d'accéder à l'ensemble du système de fichiers de la machine hôte.

La liste complète des interfaces disponibles se trouve dans la documentation de Snapcraft sous Supported Interfaces (Interfaces prises en charge).

Une fois que vous avez identifié toutes les interfaces requises pour votre application, vous pouvez commencer à les attribuer à des plugs dans votre fichier snapcraft.yaml.

L'exemple de configuration suivant permettra à l'application d'accéder au réseau et au répertoire de base des utilisateurs :

snapcraft.yaml
. . .
plugs:
  your-snap-home:
    interface: home
  your-snap-network:
    interface: network

Enregistrez et fermez votre fichier

Le nom du plug doit être un nom descriptif pour aider les utilisateurs à identifier l'objectif du plug.

Vous avez activé le sandboxing pour votre Snap et configuré certains plugs pour accorder un accès limité aux ressources du système. Ensuite, vous finirez de construire votre application Snap.

Étape 5 - Construction et test de votre application Snap

Maintenant que vous avez écrit toute la configuration requise pour votre Snap, vous pouvez procéder à sa construction et tester le package Snap localement.

Si vous avez suivi ce tutoriel en utilisant un programme Hello World comme application, votre fichier snapcraft.yaml complet ressemblera maintenant à ce qui suit :

snapcraft.yaml
name: helloworld
summary: A simple Hello World program.
description: |
  A simple Hello World program written in Go.
  Packaged as a Snap application using Snapcraft.
version: '1.0'
confinement: strict

apps:
  helloworld:
    command: helloworld

parts:
  helloworld:
    plugin: go
    source: .
    go-importpath: helloworld

plugs:
  helloworld-home:
    interface: home
  helloworld-network:
    interface: network

Pour construire votre application Snap, exécutez la commande snapcraft depuis le répertoire de votre Snap :

  • snapcraft

Snapcraft lancera alors automatiquement une machine virtuelle (VM) et commencera à construire votre Snap. Une fois terminé, Snapcraft se fermera et vous verrez quelque chose de semblable à ce qui suit :

Output
Snapped your-snap_1.0_amd64.snap

Vous pouvez maintenant installer votre Snap localement afin de vérifier qu'il fonctionne :

  • sudo snap install your-snap.snap --dangerous

L'argument de commande --dangerous est nécessaire car vous installez un Snap local qui n'a pas été signé.

Output
your-snap 1.0 installed

Une fois le processus d'installation terminé, vous pouvez lancer votre Snap en utilisant la commande qui lui est associée. Par exemple :

  • helloworld

Dans le cas de l'exemple du programme Hello World, le résultat serait le suivant :

Output
Hello, world!

Vous pouvez également consulter la politique de sandboxing de votre Snap pour vous assurer que les autorisations attribuées ont été correctement accordées :

  • snap connections your-snap

Il en résultera une liste de plugs et d'interfaces, semblable à celle qui suit :

Output
snap connections your-snap Interface Plug Slot Notes home your-snap:your-snap-home :home - network your-snap:your-snap-network :network -

Au cours de cette étape, vous avez construit votre Snap et l'avez installé localement pour vérifier qu'il fonctionne. Ensuite, vous allez publier votre Snap sur le Snap Store.

Étape 6 - Publication de votre Snap

Maintenant que vous avez construit et testé votre application Snap, il est temps de la mettre en ligne sur le Snap Store.

Commencez par vous connecter à votre compte de développeur Snap en utilisant l'application de ligne de commande Snapcraft :

  • snapcraft login

Suivez les instructions pour entrer votre adresse e-mail et votre mot de passe.

Ensuite, vous devez enregistrer le nom de l'application sur le Snap Store :

  • snapcraft register your-snap

Une fois que vous avez enregistré le nom Snap, vous pouvez pousser le package Snap construit sur le store :

  • snapcraft push your-snap.snap

Vous verrez une sortie semblable à ce qui suit :

Output
Preparing to push 'your-snap_1.0_amd64.snap'. Install the review-tools from the Snap Store for enhanced checks before uploading this snap. Pushing 'your-snap_1.0_amd64.snap' [===================================================================================================] 100% Processing...| Ready to release! Revision 1 of 'your-snap' created.

À chaque fois que vous poussez un package sur le Snap Store, le numéro de révision est incrémenté, en commençant à « 1 ». Cela vous aide à identifier les différents builds de votre Snap.

Enfin, vous pouvez diffuser votre Snap au public :

  • snapcraft release your-snap revision-number channel

Si c'est la première fois que vous publiez sur le Snap Store, le numéro de révision sera 1. Vous pouvez également choisir entre les canaux stable, candidate, beta et edge, si vous avez plusieurs versions de votre application à différents stades de développement.

Par exemple, la commande suivante lancera la révision 1 du Snap Hello World sur le canal stable :

  • snapcraft release helloworld 1 stable

Vous verrez une sortie semblable à ce qui suit :

Output
Track Arch Channel Version Revision latest amd64 stable 1.0 1 candidate ^ ^ beta ^ ^ edge ^ ^ The 'stable' channel is now open.

Vous pouvez désormais rechercher votre application sur le Snap Store et l'installer sur n'importe lequel de vos appareils.

Boutique Snapcraft avec Application HelloWorld affichée à partir des résultats de recherche

Lors de cette dernière étape, vous avez téléchargé votre package Snap sur le Snap Store et l'avez mis à disposition du public.

Conclusion

Dans cet article, vous avez configuré et construit une application Snap, puis l'avez mise à disposition du public via le Snap Store. Vous avez maintenant les connaissances de base nécessaires pour maintenir votre application et en créer de nouvelles.

Si vous souhaitez découvrir d'autres Snaps, vous pouvez parcourir l'ensemble du Snap Store. Vous pouvez également consulter la documentation de référence YAML de Snapcraft pour en savoir plus et identifier des attributs supplémentaires pour votre configuration Snap.

Enfin, si vous souhaitez approfondir le développement de Snaps, nous vous conseillons de découvrir et d'implémenter des Snap Hooks, qui permettent aux Snaps de réagir de manière dynamique aux changements du système tels que les mises à jour ou les ajustements de la politique de sécurité.

0 Comments

Creative Commons License