著者は、 Electronic Frontier Foundation を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

アプリケーション開発における最大の課題の1つは、完成品をユーザーまたは顧客に配布する最終ステップです。 既存のアプリケーション展開方法の多くは、使いやすさとセキュリティに欠けているか、インストール後にアプリケーションを自動的に更新する方法を提供していません。

Snap は、ファイルシステムの分離、自動更新、統合された依存関係管理など、強力なサンドボックス機能とセキュリティ機能を備えた最新のアプリケーションパッケージ形式です。 スナップと呼ばれるスナップアプリケーションは、aptyumのようなコマンドラインプログラムを使用してダウンロードおよびインストールできます。 UbuntuにはSnapがプリインストールされています。つまり、Snapアプリケーションには幅広いユーザーがいます。

このチュートリアルでは、Snapアプリケーションを作成し、 SnapStoreに公開します。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • Ubuntu 18.04を使用した初期サーバーセットアップに従ってセットアップされた1つのUbuntu18.04サーバー(sudo非rootユーザーを含む)。

  • スナップとしてパッケージ化してリリースしたいアプリケーション。 これは、作成した複雑なアプリケーション、一般的なオープンソースプロジェクト、または単純な「Hello、world!」の場合があります。 プログラム。 アプリケーションをまだお持ちでない場合は、このチュートリアルのステップ1 で、GoでHelloWorldプログラムを作成する方法について説明します。

  • Snapcraft開発者ダッシュボードのアカウント。

これらの準備ができたら、root以外のユーザーとしてサーバーにログインして開始します。

ステップ1—アプリケーションをパッケージ化する準備をする

まず、必要なものがすべて1つのディレクトリにあることを確認して、Snapアプリケーションとしてパッケージ化するためにアプリケーションを準備します。

スナップ用の新しいディレクトリを作成し、そこに移動することから始めます。

  1. mkdir ~/your-snap
  2. cd ~/your-snap

次に、すでにアプリケーションがある場合は、アプリケーションのソースコードの完全なコピーを作成したディレクトリに配置します。 ここでのプロセスは、パッケージ化する正確なアプリケーションによって大幅に異なりますが、ソースコードがGitリポジトリに保存されている場合は、ディレクトリ内のリポジトリをgit initして、すべてをプルダウンできます。関連するコード。

パッケージ化するアプリケーションがまだない場合は、代わりに使用する「HelloWorld」プログラムを作成できます。 Goを使用してこのプログラムを作成する方法について詳しく知りたい場合は、Goチュートリアルで最初のプログラムを作成する方法を確認してください。

これを行うには、最初に新しいGoファイルを作成し、好みのテキストエディタを使用して開きます。

  1. nano helloworld.go

次に、次のコードをファイルに追加します。

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

次に、ファイルを保存して終了します。

Goがインストールされていない場合は、次のコマンドを使用してインストールできます。

  1. sudo apt install golang-go

Goがインストールされたら、新しいプログラムを実行して、それが機能していることを確認できます。

  1. go run helloworld.go

次の出力が表示されます。

Output
Hello, world!

スナップとしてパッケージ化するためのアプリケーションを準備しました。 次に、パッケージングプロセスを開始するために必要なソフトウェアをインストールします。

ステップ2—Snapcraftのインストール

このステップでは、公式のSnapアプリケーションパッケージツールの名前であるSnapcraftをダウンロードしてインストールします。 Snapcraftは、デフォルトでUbuntuに組み込まれているSnapStoreから入手できます。 これは、snapコマンドを使用してコマンドラインからSnapcraftをインストールできることを意味します。

snapコマンドはaptコマンドと同等ですが、Aptリポジトリからのパッケージではなく、SnapStoreからソフトウェアをインストールするために使用できます。

Snapcraftをインストールするには、次のコマンドを実行します。

  1. sudo snap install snapcraft --classic

--classicコマンド引数を使用して、Snapが通常使用する厳密なサンドボックス機能なしでSnapcraftをインストールできるようにします。 Snapcraftは、アプリケーションを確実にパッケージ化するためにシステムへのより特権的なアクセスを必要とするため、この引数が必要です。

Snapcraftをインストールすると、次のように表示されます。

Output
snapcraft 3.9.8 from Canonical✓ installed

最後に、次を実行して、Snapcraftのインストールを再確認できます。

  1. snapcraft --version

これにより、次のようなものが表示されます。

Output
snapcraft, version 3.9.8

Snapcraftをインストールしたので、Snapアプリケーションの構成とメタデータの定義を開始できます。

ステップ3—スナップの構成とメタデータを定義する

このステップでは、Snapアプリケーションの構成、構造、およびメタデータの定義を開始します。

まず、Snapアプリケーションディレクトリで作業していることを確認します。

  1. cd ~/your-snap

次に、お好みのテキストエディタを使用してsnapcraft.yamlファイルを作成および編集します。

  1. nano snapcraft.yaml

snapcraft.yamlファイルを使用して、名前、説明、バージョン、依存関係の管理とサンドボックスに関連する設定など、Snapアプリケーションのすべての構成を保存します。

アプリケーションの名前、要約、説明、およびバージョン番号を定義することから始めます。

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'

Snap Store で公開する場合は、Snapの名前が一意である必要があります。同じ名前の他のアプリケーションを検索して、まだ使用されていないことを確認してください。

次に、アプリケーションに関連付けるコマンドを定義できます。 これにより、Snapを通常のコマンドとしてBashコマンドラインから直接使用できるようになります。

snapcraft.yamlファイルに以下を追加します。

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

your-snap-commandは、定義するコマンドの名前です。 たとえば、コマンドhelloworldを使用してHelloWorldプログラムを実行したい場合があります。

command: your-snapを使用して、アプリケーションコマンドの実行時にSnapcraftに何をするかを指示します。 Hello Worldプログラムの場合、値helloworldを使用してhelloworld.goファイルを参照します。これにより、Snapcraftでプログラムを正常に実行できます。

これにより、次の設定例が作成されます。

snapcraft.yaml
apps:
  helloworld:
    command: helloworld

コマンド名がスナップ名と完全に一致する場合は、コマンドラインから直接実行できます。 コマンドがスナップ名と一致しない場合、コマンドの前にスナップの名前が自動的に付けられます。 たとえば、helloworld.command1です。

最後に、Snapアプリケーションを構成するパーツを定義できます。 スナップアプリケーションは、アプリケーションを構成するすべてのコンポーネントである複数の部分で構成されています。 多くの場合、アプリケーション自体という1つの部分しかありません。

各パーツにはプラグインが関連付けられています。 たとえば、Rubyで記述されたアプリケーションのコンポーネントには、rubyプラグインが使用され、Goで記述されたコンポーネントには、goプラグインが使用されます。

Snapcraft list-pluginsコマンドを使用して、アプリケーションに適したプラグインを特定できます。

  1. snapcraft list-plugins

これにより、次のようなリストが出力されます。

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

最も一般的なプラグインは、Go、Rust、Ruby、Pythonなどの一般的なプログラミング言語用のプラグインです。

アプリケーションに適したプラグインを特定したら、parts構成をsnapcraft.yamlファイルに追加し始めることができます。

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

source構成パラメーターを使用して、アプリケーションのソースコードへの相対パスを指定します。 通常、これはsnapcraft.yamlファイル自体と同じディレクトリになるため、sourceの値は単一のドット(.)になります。

注:アプリケーションコンポーネントに、ビルドまたは実行に必要な依存関係がある場合は、build-packagesおよびstage-packages属性を使用してこれらを指定できます。 指定された依存関係の名前は、システムのデフォルトのパッケージマネージャーから自動的に取得されます。

例えば:

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

一部のSnapcraftプラグインには、アプリケーションに必要な独自のオプションがあるため、プラグインに関連するマニュアルページを確認する価値があります。

  1. snapcraft help plugin-name

Goアプリケーションの場合は、go-importpathも指定します。 Hello World構成の場合、これにより次の構成例が作成されます。

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

snapcraft.yamlファイルを開いたままにして、次の手順でさらに構成を追加できます。

Snapアプリケーションの基本構成を定義しました。 次に、アプリケーションのセキュリティとサンドボックスの側面を構成します。

ステップ4—スナップアプリケーションを保護する

Snapアプリケーションは、サンドボックス環境内で実行するように設計されているため、このステップでは、Snapのサンドボックスを構成します。 まず、Snapcraft内でconfinementと呼ばれるアプリケーションのサンドボックス化を有効にする必要があります。

snapcraft.yamlファイルに以下を追加します。

snapcraft.yaml
. . .
confinement: strict

これにより、アプリケーションのサンドボックス化が有効になり、インターネット、実行中の他のスナップ、またはホストシステム自体にアクセスできなくなります。 ただし、ほとんどの場合、アプリケーションは、インターネットにアクセスしたり、ファイルシステムに対して読み取り/書き込みを行ったりする必要がある場合など、サンドボックスの外部で通信できる必要があります。

これらの権限は、Snapcraft内では interfaces と呼ばれ、プラグを使用してSnapアプリケーションに付与できます。 プラグを使用すると、アプリケーションのサンドボックスをきめ細かく制御して、必要なアクセスだけをアプリケーションに与えることができます(最小特権の原則)。

必要な正確なインターフェースは、アプリケーションによって異なります。 最も一般的なインターフェースのいくつかは次のとおりです。

  • audio-playback-音声出力/再生音を許可します。
  • audio-record-オーディオの入力/録音を許可します。
  • camera-接続されたWebカメラへのアクセスを許可します。
  • home-ホームディレクトリ内の隠しファイル以外のファイルへのアクセスを許可します。
  • network-ネットワーク/インターネットへのアクセスを許可します。
  • network-bind-ポートへのバインドがネットワークサービスとして動作できるようにします。
  • system-files-ホストマシンのファイルシステム全体へのアクセスを許可します。

使用可能なインターフェイスの完全なリストは、Snapcraftのドキュメントのサポートされているインターフェイスにあります。

アプリケーションに必要なすべてのインターフェースを特定したら、それらをsnapcraft.yamlファイル内のplugsに割り当て始めることができます。

次の設定例では、アプリケーションがネットワークとユーザーのホームエリアにアクセスできるようになります。

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

ファイルを保存して終了します。

プラグの名前は、ユーザーがプラグの目的を識別しやすいようにわかりやすい名前にする必要があります。

スナップのサンドボックス化を有効にし、システムリソースへの制限付きアクセスを許可するようにいくつかのプラグを構成しました。 次に、Snapアプリの作成を完了します。

ステップ5—スナップアプリケーションの構築とテスト

Snapに必要なすべての構成を記述したので、Snapの構築とSnapパッケージのローカルテストに進むことができます。

アプリケーションとしてHelloWorldプログラムを使用してフォローしている場合、完全なsnapcraft.yamlファイルは次のようになります。

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

Snapアプリケーションをビルドするには、Snapのディレクトリ内からsnapcraftコマンドを実行します。

  1. snapcraft

その後、Snapcraftは仮想マシン(VM)を自動的に起動し、Snapの構築を開始します。 完了すると、Snapcraftが終了し、次のようなものが表示されます。

Output
Snapped your-snap_1.0_amd64.snap

これで、Snapをローカルにインストールして、動作していることを確認できます。

  1. sudo snap install your-snap.snap --dangerous

署名されていないローカルスナップをインストールする場合は、--dangerousコマンド引数が必要です。

Output
your-snap 1.0 installed

インストールプロセスが完了すると、関連するコマンドを使用してスナップを実行できます。 例えば:

  1. helloworld

サンプルのHelloWorldプログラムの場合、次の出力は次のようになります。

Output
Hello, world!

Snapのサンドボックスポリシーを表示して、割り当てられたアクセス許可が適切に付与されていることを確認することもできます。

  1. snap connections your-snap

これにより、次のようなプラグとインターフェイスのリストが出力されます。

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

このステップでは、Snapをビルドしてローカルにインストールし、動作していることをテストしました。 次に、SnapストアでSnapを公開します。

ステップ6—スナップを公開する

Snapアプリケーションをビルドしてテストしたので、SnapStoreでリリースします。

まず、Snapcraftコマンドラインアプリケーションを使用してSnapDeveloperアカウントにログインします。

  1. snapcraft login

プロンプトに従って、メールアドレスとパスワードを入力します。

次に、SnapStoreにアプリケーションの名前を登録する必要があります。

  1. snapcraft register your-snap

スナップ名を登録したら、ビルドしたスナップパッケージをストアにプッシュできます。

  1. snapcraft push your-snap.snap

次のような出力が表示されます。

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.

スナップストアにプッシュするたびに、リビジョン番号が1から増加します。 これは、Snapのさまざまなビルドを識別するのに役立ちます。

最後に、Snapを一般に公開できます。

  1. snapcraft release your-snap revision-number channel

初めてSnapStoreにプッシュする場合、リビジョン番号は1になります。 複数のバージョンの開発のさまざまな段階でのアプリケーション。

たとえば、次のコマンドは、HelloWorldSnapのリビジョン1stableチャネルにリリースします。

  1. snapcraft release helloworld 1 stable

次のような出力が表示されます。

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

これで、 Snap Store でアプリケーションを検索し、任意のデバイスにインストールできます。

Snapcraft store with HelloWorld App displayed from search results

この最後のステップでは、ビルドしたSnapパッケージをSnap Storeにアップロードし、一般にリリースしました。

結論

この記事では、Snapアプリケーションを構成および構築し、SnapStoreを介して一般に公開しました。 これで、アプリケーションを維持し、新しいアプリケーションを構築するために必要な基礎知識が得られました。

スナップをさらに詳しく調べたい場合は、スナップストア全体を参照することをお勧めします。 Snapcraft YAMLリファレンスを確認して、Snapcraft YAMLリファレンスの詳細を理解し、Snap構成の追加の属性を特定することもできます。

最後に、Snapの開発についてさらに調査したい場合は、Snapがアップグレードやセキュリティポリシーの調整などのシステム変更に動的に対応できるようにするSnapHooksについて読んで実装することをお楽しみください。