Ubuntu Weekly Recipe

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

この記事を読むのに必要な時間:およそ 6 分

バージョンの自動設定

これまでsnapパッケージのバージョンはversionフィールドで固定的に付けていました。実はこのversionのようないくつかのメタデータは,外部ファイルのデータを参照可能です

データの取得方法は次の2種類です。

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

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

AppStreamデータがないのであれば,スクリプトを使って手作業で設定します。この場合,設定できるのはversiongradeだけです。今回のケースならダウンロードしたパッケージのどこかに,バージョン番号が含まれているはずです。よってそれをそのまま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-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サブコマンドでビルド用の仮想マシンごとデータが削除されるため,次のビルドは仮想マシンの作成から始まります。よって多少時間がかかる点は注意してください。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。