第658回 まででChromeベースのEPUBリーダーをsnapパッケージ化することが完了しました。今回はそのパッケージをSnap Storeに公開してみましょう。Snap Storeで公開されると全世界のユーザーがsnapコマンドないしUbuntu Software経由でパッケージをインストールできるようになります。
前回のおさらい
前回までで「Thorium Reader 」の自家製snapパッケージは制限の強いstrictモードで動作するようになりました。その時点でのコードはGitLabにアップロードしてあります 。今回はここから進めましょう。
$ git clone https://gitlab.com/mtyshibata/thorium-reader-snap.git
$ cd thorium-reader-snap
$ git checkout -b v0.2 v0.2
ただし公開前にいくつか状況を再確認し、必要に応じて微調整することにします。
データの保存先について
現在のThorium Readerパッケージは取り込んだEPUBデータ等を「~/snap/thorium-reader-snap/current/.config/EDRLab.ThoriumReader/
」に保存しています。
このディレクトリはsnapパッケージのリビジョンが変わるごとに異なります。
$ ls -l ~/snap/thorium-reader-snap/
合計 12
drwxr-xr-x 3 shibata member 4096 2月 23 16:01 common
lrwxrwxrwx 1 shibata member 2 3月 19 18:42 current -> x9
drwxr-xr-x 5 shibata member 4096 3月 19 18:42 x10
drwxr-xr-x 5 shibata member 4096 3月 19 18:42 x9
「~/snap/パッケージ名/common
」がリビジョンを通して共通のデータ(SNAP_USER_COMMON
)で、「 ~/snap/パッケージ名/リビジョン
」がリビジョンに依存するデータ(SNAP_USER_DATA
)となります。snapの設定では直近2リビジョンのデータを残すことになっているため、上記のような結果になるはずです[1] 。
直近2リビジョン残しているのはsnap refresh
で別のリビジョンをインストールしたあとに、snap revert
で元に戻したい際にデータをリストアできるようにするためです。よってSNAP_USER_DATA
のディレクトリにはデータベースのような「バージョンが変わることで元に戻せなくなるデータ」を保存しておきます。
それに対して、SNAP_USER_COMMON
はユーザーが作成したデータのような、リビジョンには強く依存しないデータを保存します。
このあたりのディレクトリはsnapcraft.ioの「Environment variables 」にもあるように、snapパッケージからは環境変数として参照できます。たとえば「$HOME
」は「$SNAP_USER_DATA
」にマッピングされるなど、ソフトウェア側から参照する環境変数についても言及されていますので眺めておくと良いでしょう。
今回のThorium Readerの場合、前述のとおりEPUBファイルそのものが$SNAP_USER_DATA
に保存されます[2] 。つまり2リビジョンインストールした際は、同じEPUBファイルが2箇所に複製されることになるのです。よってEPUBファイルが大きくなってくるとストレージの仕様効率が悪いのと、バージョンアップ時に時間がかかってしまうという懸念点が存在します。
[2] 厳密にはElectronのapp.getPath("userData")
で取得されるパスです。Linuxの場合は$XDG_CONFIG_HOME
もしくは~/.config
にアプリケーション名を追記した値となります。snapパッケージの$HOME
は$SNAP_USER_DATA
になっているため、$SNAP_USER_DATA/.config/EDRLab.ThoriumReader/
となるわけです。
しかしながらThoriumはこのディレクトリをコンテンツデータの保存よりもむしろデータベース的に使用しているようです。このため、バージョンアップ時のことを考えると、より安全側に倒したほうが良いかもしれません。よって今回のケースでは、保存先を変更せずにこのままにしておきます。
常に最新のパッケージをダウンロードする
これまでdebファイルを取得する際には、GitHub上の特定のリリース向けURLを利用していました。リリースを固定して動作確認するには便利ですが、この先メンテナンスを考えると「最新のパッケージ」を取得できたほうが良さそうです。幸い、Thoriumは「https://www.edrlab.org/software/thorium-reader/github/debian
」で常に最新のdebパッケージをダウンロードできるために、これを使うことにします。
source
の行を1行変更するだけです。
parts:
thorium-reader:
source: https://www.edrlab.org/software/thorium-reader/github/debian
source-type: deb
ただしこれは状況により良し悪しです。明示的にバージョンを固定してパッケージを作ったほうが安全な場合もありますので、各自のメンテナンス方法に応じて使い分けると良いでしょう。
バージョンの自動設定
これまでsnapパッケージのバージョンはversion
フィールドで固定的に付けていました。実はこのversion
のようないくつかのメタデータは、外部ファイルのデータを参照可能です 。
データの取得方法は次の2種類です。
前者はGUIアプリケーションなどのように、すでにAppStream用のデータを開発元が提供している場合に利用できます。AppStreamのデータは「/usr/share/metainfo/
」以下に保存されるため、そこに保存するようなXMLファイルが存在しないかをまず確認すると良いでしょう。
AppStreamデータがないのであれば、スクリプトを使って手作業で設定します。この場合、設定できるのはversion
とgrade
だけです。今回のケースならダウンロードしたパッケージのどこかに、バージョン番号が含まれているはずです。よってそれをそのままsnapパッケージでも使うようにすれば、管理が楽になります。ThoriumにAppStreamファイルは用意されていないようなので、後者の方法で対応してみましょう[3] 。
[3] ちなみにsnap/snapcraft.yaml
がGitで管理されていて、なおかつそのリポジトリの「git describe
」の結果をバージョンに反映させたいのなら、version: git
と記述できます。
まずは現在のsnap/snapcraft.yaml
は次のような内容になっています。
base: core20
version: '0.2'
license: BSD-3-Clause
(中略)
parts:
thorium-reader:
source: https://www.edrlab.org/software/thorium-reader/github/debian
source-type: deb
plugin: dump
override-build: |
snapcraftctl build
sed -i 's|Icon=.*|Icon=/usr/share/icons/hicolor/0x0/apps/thorium.png|g' \
$SNAPCRAFT_PART_INSTALL/usr/share/applications/thorium.desktop
sed -i 's|/opt/Thorium/thorium|/opt/Thorium/thorium --no-sandbox|g' \
$SNAPCRAFT_PART_INSTALL/usr/share/applications/thorium.desktop
stage-packages:
- libdrm-common
- libnss3
これを次のように変更します。
base: core20
adopt-info: thorium-reader
license: BSD-3-Clause
(中略)
parts:
thorium-reader:
source: https://www.edrlab.org/software/thorium-reader/github/debian
source-type: deb
plugin: dump
override-pull: |
snapcraftctl pull
VERSION=$(dpkg-parsechangelog -S Version -c 1 \
-l $SNAPCRAFT_PART_SRC/usr/share/doc/edrlab.thoriumreader/changelog.gz)
snapcraftctl set-version "$VERSION"
override-build: |
snapcraftctl build
sed -i 's|Icon=.*|Icon=/usr/share/icons/hicolor/0x0/apps/thorium.png|g' \
$SNAPCRAFT_PART_INSTALL/usr/share/applications/thorium.desktop
sed -i 's|/opt/Thorium/thorium|/opt/Thorium/thorium --no-sandbox|g' \
$SNAPCRAFT_PART_INSTALL/usr/share/applications/thorium.desktop
stage-packages:
- libdrm-common
- libnss3
ポイントは次のとおりです。
version
フィールドを削除し、そのかわりにadopt-info: thorium-reader
を追加しました。
override-pull
フィールドを追加しました。
override-pull
はpull
ステージ(ソースコードのダウンロード等)の処理を上書きするものです。ここでは一度snapcraftctl pull
で、普通のpull
を実行してから、その後にバージョンの設定を行っています。
今回はソースがdebパッケージなので、パッケージのバージョンは「ファイル名」もしくは「changelog
ファイル」のいずれかから取得できます。このうちファイル名はダウンロードしたファイルを把握しなければならないものの、dump
プラグインだとそのファイルが残らないために使えません。そこでchangelog
ファイルをパースすることにします。
changelog
ファイルのパースには、dpkg-parsechangelog
コマンドが便利です。今回はVersion
フィールドを、最新の1バージョンだけ取得しています。
この状態でビルドしてみましょう。
$ snapcraft --debug --enable-experimental-extensions
(中略)
Snapped thorium-reader-snap_1.6.0_amd64.snap
無事にバージョン1.6.0が割り振られましたね。
gradeの変更とクリーンビルド
ここまでのsnapパッケージはローカル用の開発版ということで、snap/snapcraft.yaml
の中で「grade: devel
」を設定していました。Snap Storeに公開して、広くインストールしてもらうためにはstableチャンネルにアップロードする必要があります。
そこでgrade
も変更しておきましょう。
grade: stable
confinement: strict
これだけです。ついでに正式にアップロードするパッケージをクリーンビルドしておきます。
$ snapcraft clean --enable-experimental-extensions
$ snapcraft --enable-experimental-extensions
Snapped thorium-reader-snap_1.6.0_amd64.snap
clean
サブコマンドでビルド用の仮想マシンごとデータが削除されるため、次のビルドは仮想マシンの作成から始まります。よって多少時間がかかる点は注意してください。
パッケージのセルフレビュー
Snap Storeにアップロードされたパッケージは自動的なレビューと、パッケージの内容によっては人力によるマニュアルレビューも経た上で公開されます。このうち自動的なレビューについては、ツールを使えば自分でも実行可能です。実際にアップロードする前にレビューを通しておくと良いでしょう。
$ sudo snap install review-tools
$ snap-review thorium-reader-snap_1.6.0_amd64.snap
thorium-reader-snap_1.6.0_amd64.snap: pass
問題なさそうですね。
Snap Storeにパッケージをアップロードする
まずSnap Store用の開発者アカウントを作成します。これはUbuntu Oneシングルサインオンを利用しているため、過去にLaunchpadやUbuntu関連のアカウントを作っていたのなら、それを利用できます。
Snap Storeのアカウントログインページ にアクセスしてください。作成済みならそのままログインします。未作成なら「I don’t have an Ubuntu One account」にチェックを入れて、必要な情報を入力しましょう。入力したメールアドレスに認証用メールが届きますので指示に従って対応してください。最後に開発者プログラムの規約に同意すれば準備完了です。
認証情報を取得する
次にsnapcraft
コマンドでログインし、認証情報を取得しておきましょう。
$ snapcraft login
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: (メールアドレス)
Password: (パスワード)
We strongly recommend enabling multi-factor authentication: https://help.ubuntu.com/community/SSO/FAQs/2FA
Login successful.
アップロード先のチャンネルを決める
次にsnapパッケージをアップロードする「チャンネル 」を決めます。チャンネルは同じsnapパッケージに対して、異なるバージョンや、開発版・安定版の違いをもたせるための仕組みです。チャンネルは「トラック/リスク/ブランチ」の方法で指定します。トラックとブランチは特殊ケースなので、とりあえず今回はリスクだけを考えましょう。リスクには次の4つが存在します。
stable:
広く使われる安定版を提供するチャンネルです。ユーザーはstableが存在するパッケージのみ検索可能です。
chandidate:
stableになる直前の最終テストに使われるチャンネルです。
beta:
メジャーバージョンアップ時など、大きな変更が行われる際に広くテストを募るためのチャンネルです。
edge:
常に最新のコードをビルド・公開するためなどに使われるチャンネルです。
実際のところどのチャンネルをどう使うかは開発者の自由です。candidateやbetaはテストが必要なときしか使わない結果、stableよりもcandidateのほうが古いなんてこともザラにあります。
今回は手元でテストしているので、いきなりstableにアップロードしてしまいましょう。
パッケージをアップロードする
さぁ、ようやくアップロードの時間です!
$ snapcraft upload --release=stable thorium-reader-snap_1.6.0_amd64.snap
Preparing to upload 'thorium-reader-snap_1.6.0_amd64.snap'.
After uploading, the resulting snap revision will be released to 'stable' when it passes the Snap Store review.
Running the review tools before pushing this snap to the Snap Store.
You are required to register this snap before continuing. Refer to 'snapcraft help register' for more options.
Would you like to register 'thorium-reader-snap' with the Snap Store? [y/N]: y
(中略)
released
Revision 1 of 'thorium-reader-snap' created.
Track Arch Channel Version Revision
latest amd64 stable 1.6.0 1
candidate ↑ ↑
beta ↑ ↑
edge ↑ ↑
まず先ほどのsnap-review
を自動的に実行してチェックしています。
次に「名前を登録するか」を聞かれているので「y」と入力しましょう。Snap Storeで公開するパッケージは、パッケージ名の衝突を避けるために「名前を予約」しておく必要があります。これが「snapcraft register
」です。つまりこのコマンドを使えば、アップロード前に予約が可能です。
無事にアップロードが完了し、マニュアルレビューが不要ならすぐにパッケージが公開されます。
$ snap info thorium-reader-snap
name: thorium-reader-snap
summary: EPUB reader based on the Readium Toolkit
publisher: –
store-url: https://snapcraft.io/thorium-reader-snap
license: BSD-3-Clause
description: |
Thorium Reader is an easy to use EPUB reading application for cross
platforms.
This is unofficial re-packing of the debian package provided by EDRLab.
commands:
- thorium-reader-snap.thorium
refresh-date: today at 19:45 JST
channels:
latest/stable: 1.6.0 2021-03-19 (1) 115MB -
latest/candidate: ↑
latest/beta: ↑
latest/edge: ↑
installed: 1.6.0 (x10) 115MB -
開発版は一旦綺麗に削除してからインストールを試してみると良いでしょう。
$ sudo snap remove --purge thorium-reader-snap
thorium-reader-snap removed
$ sudo snap install thorium-reader-snap
thorium-reader-snap 1.6.0 from Mitsuya Shibata (cosmos-door) installed
無事にインストールできたでしょうか?
公開サイトを調整する
アップロードされたパッケージは、Snap Storeでも検索可能になりますし、「 https://snapcraft.io/パッケージ名」のようなURLが作られます。うまくインストールできるようになったら、このページを調整しましょう。
snapcraft.ioのデベロッパーページ には、公開済みのsnapパッケージ一覧が表示されています。ここからパッケージ名をクリックすると、パッケージページを調整可能です。特に次の情報はきちんと設定しておきましょう。
アイコン画像:256KB、512x512以下のPNG/JPEG/SVGファイル
タイトル:パッケージ名よりはわかりやすいタイトルを
カテゴリー:複数指定可能
スクリーンショット:どんなソフトウェアかすぐにわかる画像を添付する
開発者向けURL:利用者が修正提案を出しやすくなるサイトを指定する
ライセンス:指定しなくてもかまわないが明示したほうが良い
もちろん他の項目も埋めたほうがいいのですが、このあたりは好みに合わせて調整すると良いでしょう。
図1 Thorium Readerのパッケージページ
これでSnapパッケージを作ってから公開するまでの説明は一通り完了です。この先はたとえばdebパッケージ以外もパッケージングしてみるとか、GitHubを使って自動ビルドを試みる とか、各チャンネルを利用したリリースマネジメントを考える などなど、様々な「次のステップ」が存在します。
ぜひ皆さんもsnapパッケージを作成・公開してみてください。