Tutorial

So paketieren und veröffentlichen Sie eine Snap-Anwendung unter Ubuntu 18.04

DevelopmentUbuntu 18.04

Der Autor wählte die Electronic Frontier Foundation, um eine Spende im Rahmen des Programms Write for DOnations zu erhalten.

Einführung

Eine der größten Herausforderungen in der Anwendungsentwicklung ist der letzte Schritt der Verteilung des fertigen Produkts an Ihre Benutzer oder Kunden. Viele bestehende Methoden zur Anwendungsbereitstellung sind nicht benutzerfreundlich und sicher oder bieten keine Methoden zur automatischen Aktualisierung einer Anwendung nach ihrer Installation.

Snap ist ein modernes Anwendungsverpackungsformat mit leistungsstarken Sandboxing- und Sicherheitsfunktionen, u. a. Dateisystem-Isolation, automatische Updates und integriertes Abhängigkeitsmanagement. Snap-Anwendungen, die als Snaps bezeichnet werden, können ähnlich wie apt oder yum mit einem Befehlszeilenprogramm heruntergeladen und installiert werden. Ubuntu wird mit vorinstalliertem Snap bereitgestellt, was bedeutet, dass es ein breites Publikum für Snap-Anwendungen gibt.

In diesem Tutorial werden Sie eine Snap-Anwendung erstellen und im Snap Store veröffentlichen.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie:

  • Einen Ubuntu-18.04-Server, der gemäß Ersteinrichtung eines Servers mit Ubuntu 18.04 eingerichtet wurde, einschließlich eines Benutzers ohne Root- und mit sudo-Berechtigungen.

  • Eine Anwendung, die Sie paketieren und als Snap freigeben möchten. Dabei kann es sich um eine komplexe Anwendung handeln, die Sie erstellt haben, um ein gemeinsames Open-Source-Projekt oder um ein einfaches „Hello, World!“-Programm. Wenn Sie noch keine Anwendung haben, wird in Schritt 1 dieses Tutorials behandelt, wie Sie ein Hello World-Programm in Go erstellen können.

  • Ein Konto auf dem Snapcraft Developer Dashboard.

Sobald Sie diese zur Verfügung haben, melden Sie sich zunächst als Benutzer ohne Root-Berechtigung auf Ihrem Server an.

Schritt 1 – Vorbereiten Ihrer Anwendung für die Paketierung

Zunächst bereiten Sie Ihre Anwendung für die Paketierung als Snap-Anwendung vor, indem Sie sicherstellen, dass alles Erforderliche in einem einzigen Verzeichnis vorhanden ist.

Beginnen Sie mit der Erstellung eines neuen Verzeichnisses für Ihr Snap und wechseln Sie in dieses:

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

Wenn Sie bereits eine Anwendung haben, legen Sie als Nächstes eine vollständige Kopie des Quellcodes Ihrer Anwendung in dem Verzeichnis ab, das Sie gerade erstellt haben. Der Prozess wird je nach der genauen Anwendung, die Sie paketieren, erheblich variieren. Für den Fall, dass der Quellcode in einem Git-Repository gespeichert ist, können Sie mit dem Befehl git init ein Repository im Verzeichnis anlegen und den gesamten relevanten Code abrufen.

Wenn Sie noch keine Anwendung haben, die Sie paketieren möchten, können Sie ein Hello World-Programm erstellen, das Sie stattdessen verwenden. Wenn Sie mehr Kontext zum Schreiben dieses Programms mit Go wünschen, lesen Sie das Tutorial So schreiben Sie ein ersten Programm in Go.

Sie können dies tun, indem Sie zuerst eine neue Go-Datei erstellen und mit Ihrem bevorzugten Texteditor öffnen:

  • nano helloworld.go

Fügen Sie als Nächstes den folgenden Code in die Datei ein:

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

Speichern und schließen Sie die Datei dann.

Wenn Sie Go nicht installiert haben, können Sie es mit dem folgenden Befehl installieren:

  • sudo apt install golang-go

Nachdem Go installiert ist, können Sie Ihr neues Programm ausführen, um zu überprüfen, ob es funktioniert:

  • go run helloworld.go

Sie sehen die folgende Ausgabe:

Output
Hello, world!

Sie haben Ihre Anwendung für die Paketierung als Snap vorbereitet. Als Nächstes installieren Sie die Software, die für den Beginn des Paketierungsvorgangs erforderlich ist.

Schritt 2 – Installieren von Snapcraft

In diesem Schritt laden Sie Snapcraft, das offizielle Snap-Anwendungs-Paketierungs-Tool, herunter und installieren es. Snapcraft ist über den Snap Store verfügbar, der standardmäßig in Ubuntu integriert ist. Das bedeutet, dass Sie Snapcraft von der Befehlszeile aus mit dem Befehl snap installieren können.

Der Befehl snap entspricht dem Befehl apt, jedoch können Sie ihn zur Installation von Software aus dem Snap Store anstelle von Paketen aus den Apt-Repositorys verwenden.

Um Snapcraft zu installieren, führen Sie den folgenden Befehl aus:

  • sudo snap install snapcraft --classic

Verwenden Sie das Befehlsargument --classic, sodass Snapcraft ohne die strengen Sandboxing-Funktionen installiert wird, die Snaps normalerweise verwenden. Snapcraft benötigt dieses Argument, da es einen privilegierten Zugriff auf Ihr System erfordert, um Anwendungen zuverlässig zu paketieren.

Sobald Sie Snapcraft installiert haben, sehen Sie Folgendes:

Output
snapcraft 3.9.8 from Canonical✓ installed

Abschließend können Sie die Snapcraft-Installation überprüfen, indem Sie Folgendes ausführen:

  • snapcraft --version

Dadurch wird in etwa Folgendes angezeigt:

Output
snapcraft, version 3.9.8

Nachdem Sie Snapcraft installiert haben, können Sie nun die Konfiguration und Metadaten für Ihre Snap-Anwendung definieren.

Schritt 3 – Definieren der Konfiguration und Metadaten für Ihr Snap

In diesem Schritt werden Sie zunächst die Konfiguration, die Struktur und die Metadaten für Ihre Snap-Anwendung definieren.

Stellen Sie zuerst sicher, dass Sie immer noch in Ihrem Snap-Anwendungsverzeichnis arbeiten:

  • cd ~/your-snap

Erstellen und bearbeiten Sie als Nächstes die Datei snapcraft.yaml mit Ihrem bevorzugten Texteditor:

  • nano snapcraft.yaml

Sie verwenden die Datei snapcraft.yaml, um die gesamte Konfiguration für Ihre Snap-Anwendung zu speichern, einschließlich des Namens, der Beschreibung und der Version, sowie Einstellungen im Zusammenhang mit der Abhängigkeitsverwaltung und dem Sandboxing.

Beginnen Sie mit der Definition des Namens, der Zusammenfassung, der Beschreibung und der Versionsnummer für Ihre Anwendung:

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'

Der Name Ihres Snap muss eindeutig sein, wenn Sie es im Snap Store veröffentlichen möchten – suchen Sie nach anderen Anwendungen mit demselben Namen, um sicherzustellen, dass er nicht bereits vergeben ist.

Als Nächstes können Sie den/die Befehl(e) definieren, den/die Sie mit Ihrer Anwendung verknüpfen möchten. Dadurch kann Ihr Snap direkt von der Bash-Befehlszeile aus als normaler Befehl verwendet werden.

Fügen Sie Folgendes zu Ihrer Datei snapcraft.yaml hinzu:

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

your-snap-command ist der Name des Befehls, den Sie definieren möchten. Beispielsweise können Sie den Befehl helloworld verwenden, um Ihr Hello World-Programm auszuführen.

Verwenden Sie command: your-snap, um Snapcraft mitzuteilen, was zu tun ist, wenn der Anwendungsbefehl ausgeführt ist. Im Fall des Hello World-Programms würden Sie den Wert helloworld verwenden, um auf die Datei helloworld.go zu verweisen, die Snapcraft die erfolgreiche Ausführung Ihres Programms ermöglicht.

Daraus ergibt sich die folgende Beispielkonfiguration:

snapcraft.yaml
apps:
  helloworld:
    command: helloworld

Wenn der Befehlsname genau mit dem Namen des Snaps übereinstimmt, können Sie ihn direkt von der Befehlszeile aus ausführen. Wenn der Befehl nicht mit dem Snap-Namen übereinstimmt, wird dem Befehl automatisch der Name des Snaps vorangestellt. Beispielsweise helloworld.command1.

Abschließend können Sie die Teile definieren, aus denen sich Ihre Snap-Anwendung zusammensetzt. Snap-Anwendungen bestehen aus mehreren Teilen, die alle die Komponenten Ihrer Anwendung darstellen. In vielen Fällen gibt es nur einen Teil, nämlich die Anwendung selbst.

Jeder Teil hat ein zugehöriges Plugin. Beispielsweise wird für in Ruby geschriebene Komponenten Ihrer Anwendung das Plugin ruby verwendet, und für in Go geschriebene Komponenten wird das Plugin go verwendet.

Sie können den Snapcraft-Befehl list-plugins verwenden, um das/die richtigen Plugin(s) für Ihre Anwendung zu identifizieren:

  • snapcraft list-plugins

Dadurch wird in etwa folgende Liste ausgegeben:

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

Die am häufigsten verwendeten Plugins sind solche für gängige Programmiersprachen wie Go, Rust, Ruby oder Python.

Sobald Sie die richtigen Plugins für Ihre Anwendung identifiziert haben, können Sie damit beginnen, die Konfiguration parts zu Ihrer Datei snapcraft.yaml hinzuzufügen:

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

Verwenden Sie den Konfigurationsparameter source, um den relativen Pfad zu dem Quellcode Ihrer Anwendung anzugeben. Normalerweise ist dies das gleiche Verzeichnis wie die Datei snapcraft.yaml selbst, sodass der Wert für source ein einzelner Punkt (.) ist.

Anmerkung: Wenn Ihre Anwendungskomponente Abhängigkeiten hat, die für das Erstellen oder Ausführen der Anwendung erforderlich sind, können Sie diese mit den Attributen build-packages und stage-packages angeben. Die angegebenen Namen der Abhängigkeiten werden dann automatisch von dem Standard-Paketmanager für Ihr System abgerufen.

Beispiel:

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

Einige Snapcraft-Plugins haben ihre eigenen spezifischen Optionen, die für Ihre Anwendung erforderlich sein können. Daher ist es sinnvoll, die entsprechenden Handbuchseiten für Ihr Plugin hinzuzuziehen.

  • snapcraft help plugin-name

Im Fall von Go-Anwendungen würden Sie auch den go-importpath angeben. Für die Hello World-Konfiguration ergibt sich daraus die folgende Beispielkofiguation:

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

Sie können Ihre Datei snapcraft.yaml offen lassen, um im nächsten Schritt weitere Konfigurationen hinzuzufügen.

Sie haben die Basiskonfiguration für Ihre Snap-Anwendung definiert. Als Nächstes konfigurieren Sie die Sicherheits- und Sandboxing-Aspekte Ihrer Anwendung.

Schritt 4 – Sichern Ihrer Snap-Anwendung

Snap-Anwendungen sind so konzipiert, dass Sie in einer Sandbox-Umgebung ausgeführt werden können. In diesem Schritt konfigurieren Sie also Sandboxing für Ihr Snap. Als Erstes müssen Sie das Sandboxing für Ihre Anwendung aktivieren, was innerhalb von Snapcraft als confinement bekannt ist.

Fügen Sie Folgendes zu Ihrer Datei snapcraft.yaml hinzu:

snapcraft.yaml
. . .
confinement: strict

Dadurch wird das Sandboxing für Ihre Anwendung aktiviert und verhindert, dass sie auf das Internet, andere laufende Snaps oder das Host-System selbst zugreifen kann. In den meisten Fällen müssen Anwendungen jedoch außerhalb ihrer Sandbox kommunizieren können, beispielsweise wenn sie auf das Internet zugreifen oder im Dateisystem lesen/schreiben müssen.

Diese Berechtigungen, die innerhalb von Snapcraft als Schnittstellen bekannt sind, können Ihrer Snap-Anwendung mit Plugs gewährt werden. Mithilfe von Plugs können Sie eine sehr feine Kontrolle über das Sandboxing für Ihre Anwendung ausüben, um ihr nur den benötigten Zugriff zu geben und nicht mehr (Prinzip der geringsten Privilegien).

Die genau benötigten Schnittstellen hängen von Ihrer Anwendung ab. Einige der am häufigsten verwendeten Schnittstellen sind:

  • audio-playback – Erlaubt die Audio-Ausgabe/Wiedergabe von Sounds.
  • audio-record – Erlaubt die Audio-Eingabe/Aufnahme.
  • camera – Erlaubt den Zugriff auf verbundene Webcams.
  • home – Erlaubt den Zugriff auf nicht versteckte Dateien in Ihrem Home-Verzeichnis.
  • network – Erlaubt den Zugriff auf das Netzwerk/Internet.
  • network-bind – Erlaubt die Bindung an Ports, um als Netzwerkdienst zu arbeiten.
  • system-files – Erlaubt den Zugriff auf das gesamte Dateisystem des Host-Rechners.

Die vollständige Liste der verfügbaren Schnittstellen ist in der Snapcraft-Dokumentation unter Unterstützte Schnittstellen zu finden.

Sobald Sie alle erforderlichen Schnittstellen für Ihre Anwendung identifiziert haben, können Sie damit beginnen, diese den Plugs innerhalb Ihrer Datei snapcraft.yaml zuzuweisen.

Die folgende Beispielkonfiguration ermöglicht der Anwendung den Zugriff auf das Netzwerk und den Home-Bereich der Benutzer:

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

Speichern und schließen Sie Ihre Datei.

Der Name des Plug sollte ein beschreibender Name sein, um Benutzern die Identifizierung des Zwecks des Plug zu erleichtern.

Sie haben das Sandboxing für Ihr Snap aktiviert und einige Plugs konfiguriert, um begrenzten Zugriff auf System-Ressourcen zu gewähren. Als Nächstes werden Sie die Erstellung Ihrer Snap-Anwendung abschließen.

Schritt 5 – Erstellen und Testen Ihrer Snap-Anwendung

Nachdem Sie nun die gesamte erforderliche Konfiguration für Ihr Snap geschrieben haben, können Sie mit der Erstellung und dem lokalen Testen des Snap-Paketes fortfahren.

Wenn Sie diesem Tutorial mit einem Hello World-Programm als Ihre Anwendung gefolgt sind, sieht Ihre vollständige Datei snapcraft.yaml nun in etwa wie folgt aus:

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

Um Ihre Snap-Anwendung zu erstellen, führen Sie den Befehl snapcraft aus dem Verzeichnis für Ihr Snap aus:

  • snapcraft

Snapcraft startet dann automatisch einen virtuellen Rechner (VM) und beginnt mit der Erstellung Ihres Snap. Sobald die Erstellung abgeschlossen ist, wird Snapcraft beendet und Sie sehen in etwa Folgendes:

Output
Snapped your-snap_1.0_amd64.snap

Jetzt können Sie Ihr Snap lokal installieren, um zu überprüfen, ob es funktioniert:

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

Das Befehlsargument --dangerous ist erforderlich, da Sie ein lokales Snap installieren, das nicht signiert wurde.

Output
your-snap 1.0 installed

Sobald der Installationsvorgang abgeschlossen ist, können Sie Ihr Snap mit dem zugehörigen Befehl ausführen. Beispiel:

  • helloworld

Im Fall des Beispielprogramms Hello World würde sich die folgende Ausgabe ergeben:

Output
Hello, world!

Sie können ebenfalls die Sandboxing-Richtlinie für Ihr Snap anzeigen, um sicherzustellen, dass die zugewiesenen Berechtigungen ordnungsgemäß erteilt wurden:

  • snap connections your-snap

Dadurch wird eine Liste von Plugs und Schnittstellen ausgegeben, die in etwas wie folgt aussieht:

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

In diesem Schritt haben Sie Ihr Snap erstellt und lokal installiert, um zu testen, ob es funktioniert. Als Nächstes veröffentlichen Sie Ihr Snap im Snap Store.

Schritt 6 – Veröffentlichen Ihres Snap

Nachdem Sie Ihre Snap-Anwendung erstellt und getestet haben, ist es nun an der Zeit, sie im Snap Store zu veröffentlichen.

Melden Sie sich mit der Snapcraft-Befehlszeilenanwendung an Ihrem Snap Developer-Konto an:

  • snapcraft login

Folgen Sie den Eingabeaufforderungen, um Ihre E-Mail-Adresse und Ihr Passwort einzugeben.

Als Nächstes müssen Sie den Namen der Anwendung im Snap Store registrieren:

  • snapcraft register your-snap

Sobald Sie den Snap-Namen registriert haben, können Sie das erstellte Snap-Paket mithilfe von Push in den Shop übertragen:

  • snapcraft push your-snap.snap

Sie sehen eine Ausgabe, die der folgenden ähnelt:

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.

Bei jeder Push-Übertragung in den Snap Store wird die Versionsnummer erhöht, beginnend mit eins. Dies ist nützlich, um die verschiedenen Builds Ihres Snap zu identifizieren.

Abschließend können Sie Ihr Snap für die Öffentlichkeit freigeben:

  • snapcraft release your-snap revision-number channel

Wenn dies Ihre erste Push-Übertragung in den Snap Store ist, wird die Versionsnummer 1 sein. Sie können auch zwischen der Freigabe in den Kanälen stable, candidate, beta und edge wählen, wenn Sie mehrere Versionen Ihrer Anwendung in verschiedenen Entwicklungsstufen haben.

Mit dem folgenden Befehl wird beispielsweise die Version 1 des Hello World-Snap für den Kanal stable freigegeben:

  • snapcraft release helloworld 1 stable

Sie sehen eine Ausgabe, die der folgenden ähnelt:

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

Sie können nun im Snap Store nach Ihrer Anwendung suchen und auf einem Ihrer Geräte installieren.

Snapcraft Store mit in den Suchergebnissen angezeigter HelloWorld-Anwendung

In diesem letzten Schritt haben Sie Ihr erstelltes Snap-Paket in den Snap Store hochgeladen und für die Öffentlichkeit freigegeben.

Zusammenfassung

In diesem Artikel haben Sie eine Snap-Anwendung konfiguriert und erstellt und über den Snap Store für die Öffentlichkeit freigegeben. Sie verfügen nun über die grundlegenden Kenntnisse, die für die Wartung Ihrer Anwendung und die Erstellung neuer Anwendungen erforderlich sind.

Wenn Sie Snaps weiter erkunden möchten, können Sie den gesamten Snap Store durchsuchen. Vielleicht möchten Sie auch die Snapcraft YAML-Referenz durchsehen, um mehr darüber zu erfahren und zusätzliche Attribute für Ihre Snap-Konfiguration zu identifizieren.

Wenn Sie sich näher über die Snap-Entwicklung informieren möchten, empfehlen wir Ihnen, mehr über Snap Hooks und deren Implementierung zu lesen. Sie ermöglichen es Snaps, dynamisch auf Systemänderungen wie Upgrades oder Anpassungen der Sicherheitsrichtlinien zu reagieren.

0 Comments

Creative Commons License