Ubuntu Weekly Recipe

第660回自作のsnapパッケージをSnap Storeに公開する

第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ファイルが大きくなってくるとストレージの仕様効率が悪いのと、バージョンアップ時に時間がかかってしまうという懸念点が存在します。

しかしながら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種類です。

  • AppStream用のXMLファイルから取得する
  • ビルド時にスクリプトを実行して取得する

前者はGUIアプリケーションなどのように、すでにAppStream用のデータを開発元が提供している場合に利用できます。AppStreamのデータは/usr/share/metainfo/以下に保存されるため、そこに保存するようなXMLファイルが存在しないかをまず確認すると良いでしょう。

AppStreamデータがないのであれば、スクリプトを使って手作業で設定します。この場合、設定できるのはversiongradeだけです。今回のケースならダウンロードしたパッケージのどこかに、バージョン番号が含まれているはずです。よってそれをそのままsnapパッケージでも使うようにすれば、管理が楽になります。ThoriumにAppStreamファイルは用意されていないようなので、後者の方法で対応してみましょう[3]⁠。

まずは現在の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-pullpullステージ(ソースコードのダウンロード等)の処理を上書きするものです。ここでは一度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のパッケージページ
図1

これでSnapパッケージを作ってから公開するまでの説明は一通り完了です。この先はたとえばdebパッケージ以外もパッケージングしてみるとか、GitHubを使って自動ビルドを試みるとか、各チャンネルを利用したリリースマネジメントを考えるなどなど、様々な「次のステップ」が存在します。

ぜひ皆さんもsnapパッケージを作成・公開してみてください。

おすすめ記事

記事・ニュース一覧