How To Package and Publish a Snap Application on Ubuntu 18.04
著者は、 Electronic Frontier Foundation を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
アプリケーション開発における最大の課題の1つは、完成品をユーザーまたは顧客に配布する最終ステップです。 既存のアプリケーション展開方法の多くは、使いやすさとセキュリティに欠けているか、インストール後にアプリケーションを自動的に更新する方法を提供していません。
Snap は、ファイルシステムの分離、自動更新、統合された依存関係管理など、強力なサンドボックス機能とセキュリティ機能を備えた最新のアプリケーションパッケージ形式です。 スナップと呼ばれるスナップアプリケーションは、apt
やyum
のようなコマンドラインプログラムを使用してダウンロードおよびインストールできます。 UbuntuにはSnapがプリインストールされています。つまり、Snapアプリケーションには幅広いユーザーがいます。
このチュートリアルでは、Snapアプリケーションを作成し、 SnapStoreに公開します。
前提条件
このチュートリアルを完了するには、次のものが必要です。
-
Ubuntu 18.04を使用した初期サーバーセットアップに従ってセットアップされた1つのUbuntu18.04サーバー(sudo非rootユーザーを含む)。
-
スナップとしてパッケージ化してリリースしたいアプリケーション。 これは、作成した複雑なアプリケーション、一般的なオープンソースプロジェクト、または単純な「Hello、world!」の場合があります。 プログラム。 アプリケーションをまだお持ちでない場合は、このチュートリアルのステップ1 で、GoでHelloWorldプログラムを作成する方法について説明します。
-
Snapcraft開発者ダッシュボードのアカウント。
これらの準備ができたら、root以外のユーザーとしてサーバーにログインして開始します。
ステップ1—アプリケーションをパッケージ化する準備をする
まず、必要なものがすべて1つのディレクトリにあることを確認して、Snapアプリケーションとしてパッケージ化するためにアプリケーションを準備します。
スナップ用の新しいディレクトリを作成し、そこに移動することから始めます。
- mkdir ~/your-snap
- cd ~/your-snap
次に、すでにアプリケーションがある場合は、アプリケーションのソースコードの完全なコピーを作成したディレクトリに配置します。 ここでのプロセスは、パッケージ化する正確なアプリケーションによって大幅に異なりますが、ソースコードがGitリポジトリに保存されている場合は、ディレクトリ内のリポジトリをgit init
して、すべてをプルダウンできます。関連するコード。
パッケージ化するアプリケーションがまだない場合は、代わりに使用する「HelloWorld」プログラムを作成できます。 Goを使用してこのプログラムを作成する方法について詳しく知りたい場合は、Goチュートリアルで最初のプログラムを作成する方法を確認してください。
これを行うには、最初に新しいGoファイルを作成し、好みのテキストエディタを使用して開きます。
- nano helloworld.go
次に、次のコードをファイルに追加します。
package main
import "fmt"
func main() {
fmt.Println("Hello, world!")
}
次に、ファイルを保存して終了します。
Goがインストールされていない場合は、次のコマンドを使用してインストールできます。
- sudo apt install golang-go
Goがインストールされたら、新しいプログラムを実行して、それが機能していることを確認できます。
- go run helloworld.go
次の出力が表示されます。
OutputHello, world!
スナップとしてパッケージ化するためのアプリケーションを準備しました。 次に、パッケージングプロセスを開始するために必要なソフトウェアをインストールします。
ステップ2—Snapcraftのインストール
このステップでは、公式のSnapアプリケーションパッケージツールの名前であるSnapcraftをダウンロードしてインストールします。 Snapcraftは、デフォルトでUbuntuに組み込まれているSnapStoreから入手できます。 これは、snap
コマンドを使用してコマンドラインからSnapcraftをインストールできることを意味します。
snap
コマンドはapt
コマンドと同等ですが、Aptリポジトリからのパッケージではなく、SnapStoreからソフトウェアをインストールするために使用できます。
Snapcraftをインストールするには、次のコマンドを実行します。
- sudo snap install snapcraft --classic
--classic
コマンド引数を使用して、Snapが通常使用する厳密なサンドボックス機能なしでSnapcraftをインストールできるようにします。 Snapcraftは、アプリケーションを確実にパッケージ化するためにシステムへのより特権的なアクセスを必要とするため、この引数が必要です。
Snapcraftをインストールすると、次のように表示されます。
Outputsnapcraft 3.9.8 from Canonical✓ installed
最後に、次を実行して、Snapcraftのインストールを再確認できます。
- snapcraft --version
これにより、次のようなものが表示されます。
Outputsnapcraft, version 3.9.8
Snapcraftをインストールしたので、Snapアプリケーションの構成とメタデータの定義を開始できます。
ステップ3—スナップの構成とメタデータを定義する
このステップでは、Snapアプリケーションの構成、構造、およびメタデータの定義を開始します。
まず、Snapアプリケーションディレクトリで作業していることを確認します。
- cd ~/your-snap
次に、お好みのテキストエディタを使用してsnapcraft.yaml
ファイルを作成および編集します。
- nano snapcraft.yaml
snapcraft.yaml
ファイルを使用して、名前、説明、バージョン、依存関係の管理とサンドボックスに関連する設定など、Snapアプリケーションのすべての構成を保存します。
アプリケーションの名前、要約、説明、およびバージョン番号を定義することから始めます。
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
ファイルに以下を追加します。
. . .
apps:
your-snap-command:
command: your-snap
your-snap-command
は、定義するコマンドの名前です。 たとえば、コマンドhelloworld
を使用してHelloWorldプログラムを実行したい場合があります。
command: your-snap
を使用して、アプリケーションコマンドの実行時にSnapcraftに何をするかを指示します。 Hello Worldプログラムの場合、値helloworld
を使用してhelloworld.go
ファイルを参照します。これにより、Snapcraftでプログラムを正常に実行できます。
これにより、次の設定例が作成されます。
apps:
helloworld:
command: helloworld
コマンド名がスナップ名と完全に一致する場合は、コマンドラインから直接実行できます。 コマンドがスナップ名と一致しない場合、コマンドの前にスナップの名前が自動的に付けられます。 たとえば、helloworld.command1
です。
最後に、Snapアプリケーションを構成するパーツを定義できます。 スナップアプリケーションは、アプリケーションを構成するすべてのコンポーネントである複数の部分で構成されています。 多くの場合、アプリケーション自体という1つの部分しかありません。
各パーツにはプラグインが関連付けられています。 たとえば、Rubyで記述されたアプリケーションのコンポーネントには、ruby
プラグインが使用され、Goで記述されたコンポーネントには、go
プラグインが使用されます。
Snapcraft list-plugins
コマンドを使用して、アプリケーションに適したプラグインを特定できます。
- snapcraft list-plugins
これにより、次のようなリストが出力されます。
Outputant 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
ファイルに追加し始めることができます。
. . .
parts:
your-snap:
plugin: plugin-name
source: .
source
構成パラメーターを使用して、アプリケーションのソースコードへの相対パスを指定します。 通常、これはsnapcraft.yaml
ファイル自体と同じディレクトリになるため、source
の値は単一のドット(.
)になります。
注:アプリケーションコンポーネントに、ビルドまたは実行に必要な依存関係がある場合は、build-packages
およびstage-packages
属性を使用してこれらを指定できます。 指定された依存関係の名前は、システムのデフォルトのパッケージマネージャーから自動的に取得されます。
例えば:
parts:
your-snap:
plugin: plugin-name
source: .
build-packages:
- gcc
- make
stage-packages:
- libcurl4
一部のSnapcraftプラグインには、アプリケーションに必要な独自のオプションがあるため、プラグインに関連するマニュアルページを確認する価値があります。
- snapcraft help plugin-name
Goアプリケーションの場合は、go-importpath
も指定します。 Hello World構成の場合、これにより次の構成例が作成されます。
parts:
helloworld:
plugin: go
source: .
go-importpath: helloworld
snapcraft.yaml
ファイルを開いたままにして、次の手順でさらに構成を追加できます。
Snapアプリケーションの基本構成を定義しました。 次に、アプリケーションのセキュリティとサンドボックスの側面を構成します。
ステップ4—スナップアプリケーションを保護する
Snapアプリケーションは、サンドボックス環境内で実行するように設計されているため、このステップでは、Snapのサンドボックスを構成します。 まず、Snapcraft内でconfinement
と呼ばれるアプリケーションのサンドボックス化を有効にする必要があります。
snapcraft.yaml
ファイルに以下を追加します。
. . .
confinement: strict
これにより、アプリケーションのサンドボックス化が有効になり、インターネット、実行中の他のスナップ、またはホストシステム自体にアクセスできなくなります。 ただし、ほとんどの場合、アプリケーションは、インターネットにアクセスしたり、ファイルシステムに対して読み取り/書き込みを行ったりする必要がある場合など、サンドボックスの外部で通信できる必要があります。
これらの権限は、Snapcraft内では interfaces と呼ばれ、プラグを使用してSnapアプリケーションに付与できます。 プラグを使用すると、アプリケーションのサンドボックスをきめ細かく制御して、必要なアクセスだけをアプリケーションに与えることができます(最小特権の原則)。
必要な正確なインターフェースは、アプリケーションによって異なります。 最も一般的なインターフェースのいくつかは次のとおりです。
audio-playback
-音声出力/再生音を許可します。audio-record
-オーディオの入力/録音を許可します。camera
-接続されたWebカメラへのアクセスを許可します。home
-ホームディレクトリ内の隠しファイル以外のファイルへのアクセスを許可します。network
-ネットワーク/インターネットへのアクセスを許可します。network-bind
-ポートへのバインドがネットワークサービスとして動作できるようにします。system-files
-ホストマシンのファイルシステム全体へのアクセスを許可します。
使用可能なインターフェイスの完全なリストは、Snapcraftのドキュメントのサポートされているインターフェイスにあります。
アプリケーションに必要なすべてのインターフェースを特定したら、それらをsnapcraft.yaml
ファイル内のplugs
に割り当て始めることができます。
次の設定例では、アプリケーションがネットワークとユーザーのホームエリアにアクセスできるようになります。
. . .
plugs:
your-snap-home:
interface: home
your-snap-network:
interface: network
ファイルを保存して終了します。
プラグの名前は、ユーザーがプラグの目的を識別しやすいようにわかりやすい名前にする必要があります。
スナップのサンドボックス化を有効にし、システムリソースへの制限付きアクセスを許可するようにいくつかのプラグを構成しました。 次に、Snapアプリの作成を完了します。
ステップ5—スナップアプリケーションの構築とテスト
Snapに必要なすべての構成を記述したので、Snapの構築とSnapパッケージのローカルテストに進むことができます。
アプリケーションとしてHelloWorldプログラムを使用してフォローしている場合、完全な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
コマンドを実行します。
- snapcraft
その後、Snapcraftは仮想マシン(VM)を自動的に起動し、Snapの構築を開始します。 完了すると、Snapcraftが終了し、次のようなものが表示されます。
OutputSnapped your-snap_1.0_amd64.snap
これで、Snapをローカルにインストールして、動作していることを確認できます。
- sudo snap install your-snap.snap --dangerous
署名されていないローカルスナップをインストールする場合は、--dangerous
コマンド引数が必要です。
Outputyour-snap 1.0 installed
インストールプロセスが完了すると、関連するコマンドを使用してスナップを実行できます。 例えば:
- helloworld
サンプルのHelloWorldプログラムの場合、次の出力は次のようになります。
OutputHello, world!
Snapのサンドボックスポリシーを表示して、割り当てられたアクセス許可が適切に付与されていることを確認することもできます。
- snap connections your-snap
これにより、次のようなプラグとインターフェイスのリストが出力されます。
Outputsnap 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アカウントにログインします。
- snapcraft login
プロンプトに従って、メールアドレスとパスワードを入力します。
次に、SnapStoreにアプリケーションの名前を登録する必要があります。
- snapcraft register your-snap
スナップ名を登録したら、ビルドしたスナップパッケージをストアにプッシュできます。
- snapcraft push your-snap.snap
次のような出力が表示されます。
OutputPreparing 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を一般に公開できます。
- snapcraft release your-snap revision-number channel
初めてSnapStoreにプッシュする場合、リビジョン番号は1
になります。 複数のバージョンの開発のさまざまな段階でのアプリケーション。
たとえば、次のコマンドは、HelloWorldSnapのリビジョン1
をstable
チャネルにリリースします。
- snapcraft release helloworld 1 stable
次のような出力が表示されます。
OutputTrack Arch Channel Version Revision
latest amd64 stable 1.0 1
candidate ^ ^
beta ^ ^
edge ^ ^
The 'stable' channel is now open.
これで、 Snap Store でアプリケーションを検索し、任意のデバイスにインストールできます。
この最後のステップでは、ビルドしたSnapパッケージをSnap Storeにアップロードし、一般にリリースしました。
結論
この記事では、Snapアプリケーションを構成および構築し、SnapStoreを介して一般に公開しました。 これで、アプリケーションを維持し、新しいアプリケーションを構築するために必要な基礎知識が得られました。
スナップをさらに詳しく調べたい場合は、スナップストア全体を参照することをお勧めします。 Snapcraft YAMLリファレンスを確認して、Snapcraft YAMLリファレンスの詳細を理解し、Snap構成の追加の属性を特定することもできます。
最後に、Snapの開発についてさらに調査したい場合は、Snapがアップグレードやセキュリティポリシーの調整などのシステム変更に動的に対応できるようにするSnapHooksについて読んで実装することをお楽しみください。