memo

2017-02-06

flatpak を使って python application をパッケージングしてみる試み

flatpak って?

http://flatpak.org/

Linux 方面の最近の流れとして、デスクトップアプリケーションとかもコンテナ技術でパッケージング・動作させようぜ、というのがあり、その一つ。 xdg-app と呼ばれていたもの。

デスクトップアプリケーション向けなので、 docker と違って一般ユーザーで普通に実行できたりとか、 X/Wayland とやり取りできたりとか、その他色々ある。

出てくる用語としては、

  • application

    • アプリケーション

    • 実行ファイルと、必要があればその依存ライブラリなどがパッケージングされている

    • 実行時は /app 以下に mount される

  • runtime

    • 複数の application から参照される共通のシステムイメージ部分

    • 実行時は /usr 以下に mount される

  • sdk

    • runtime + ビルドに必要なモノ

    • コンパイラとかヘッダファイルとかが入っている

    • アプリケーションをパッケージングするときはこちらのイメージを使ってビルドを通し、 実行時は runtime を使ってディスク容量を節約する、という使い分けがされる (多分)

  • repository

    • application や runtime が置かれてるトコ

辺り。

使い方としては、まず repository を登録し、次に repository から application をインストールし、そして実行する。 という感じ。

パッケージングしてみる

さて、パッケージングしてみる。

パッケージング対象はとりあえず何でもいいのだけど、 python 製のアプリケーションでたまに名前を聞くものとして、 httpie にしよう。

まずは runtime/sdk として何を利用するかだが、 GNOME な人々が配っている org.freedesktop.BasePlatform に python も含まれているので、コレを使おう。

$ flatpak --user remote-add --if-not-exists gnome https://sdk.gnome.org/gnome.flatpakrepo
$ flatpak --user install gnome org.freedesktop.BasePlatform
Installing: org.freedesktop.BasePlatform/x86_64/1.4 from gnome

6 delta parts, 64 loose fetched; 56494 KiB transferred in 20 seconds
$ flatpak --user install gnome org.freedesktop.BaseSdk
Installing: org.freedesktop.BaseSdk/x86_64/1.4 from gnome

11 delta parts, 21 loose fetched; 98421 KiB transferred in 23 seconds

続いて実際のパッケージング作業。

ここでは flatpak builder という、設定ファイルから全部いい感じにやってくれるツールが存在するのだが、 今の所 autotools やら cmake やら前提になっていて、 python アプリケーションのパッケージングには使えない。 ということで、諸々手動でやる。

流れとしては、

  1. flatpak build-init で、簡単な雛形ディレクトリを作成し、

  2. flatpak build で、その雛形 + runtime/sdk 内に入ってコマンドを実行、インストール作業を行い、

  3. flatpak build-finish でメタデータの設定やらを行って、

  4. flatpak build-export で repository に書き出し。

という感じ。

今回はコレを shell script にまとめました。

build-httpie.bash:

#!/bin/bash
REPOSITORY="${HOME}/repos/flatpak/u7fa9.org"

PACKAGE="httpie"
VERSION="0.9.9"
BUILD_FINISH_ARGS=(
  --share=network
  --command=http
)

_APP="org.u7fa9.${PACKAGE}"
_RUNTIME="org.freedesktop.BasePlatform"
_SDK="org.freedesktop.BaseSdk"
_RUNTIME_VERSION="1.4"

build_location="$(mktemp -d "${_APP}".XXXXXXX)"

flatpak build-init "${build_location}" "${_APP}" "${_SDK}" "${_RUNTIME}" "${_RUNTIME_VERSION}"

# 先述したように、 application は /app 以下に mount されるので、この中に必要なものを全て入れる必要がある。
# 今回は /app 以下に virtualenv を作成し、 httpie を pip install する。
flatpak build "${build_location}" python3 -m venv /app
flatpak build --share=network "${build_location}" /app/bin/pip install "${PACKAGE}==${VERSION}"

flatpak build-finish "${BUILD_FINISH_ARGS[@]}" "${build_location}"
flatpak build-export "${REPOSITORY}" "${build_location}" "${VERSION}"
$ bash build-httpie.bash
You are using pip version 6.0.8, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting httpie==0.9.9
  Using cached httpie-0.9.9-py2.py3-none-any.whl
Collecting Pygments>=2.1.3 (from httpie==0.9.9)
  Using cached Pygments-2.2.0-py2.py3-none-any.whl
Collecting requests>=2.11.0 (from httpie==0.9.9)
  Using cached requests-2.13.0-py2.py3-none-any.whl
Installing collected packages: requests, Pygments, httpie



Successfully installed Pygments-2.2.0 httpie-0.9.9 requests-2.13.0
Please review the exported files and the metadata
Commit: 5c202dac8309b51af168f71c70a92ea564b536f67a5e50f5b6181c6b7a5f4f39
Metadata Total: 277
Metadata Written: 139
Content Total: 1324
Content Written: 1262
Content Bytes Written: 16052289 (16.1 MB)

できあがり。

公開する

Repository を HTTP でアクセスできるどこかにコピーして置くだけ。

https://u7fa9.org/flatpak/repo/

インストールする

別環境にて。 gnome と上記の repository を追加して、インストールする。

$ flatpak --user remote-add --if-not-exists gnome https://sdk.gnome.org/gnome.flatpakrepo
$ flatpak --user remote-add --no-gpg-verify u7fa9 https://u7fa9.org/flatpak/repo/
$ flatpak --user install u7fa9 org.u7fa9.httpie
Required runtime for org.u7fa9.httpie/x86_64/0.9.9 (org.freedesktop.BasePlatform/x86_64/1.4) is not installed, searching...
Found in remote gnome, do you want to install it? [y/n]: y
Installing: org.freedesktop.BasePlatform/x86_64/1.4 from gnome

6 delta parts, 64 loose fetched; 56494 KiB transferred in 20 seconds
Installing: org.u7fa9.httpie/x86_64/0.9.9 from u7fa9

139 metadata, 1261 content objects fetched; 5783 KiB transferred in 2 seconds

実行する

$ flatpak run org.u7fa9.httpie https://u7fa9.org/
HTTP/1.1 200 OK
Accept-Ranges: bytes
Connection: keep-alive
Content-Length: 337
Content-Type: text/html; charset=utf-8
Date: Mon, 06 Feb 2017 11:34:21 GMT
ETag: "4ce914bc-151"
Last-Modified: Sun, 21 Nov 2010 12:46:52 GMT
Server: nginx

<html>
  <head>
    <title>index</title>
    <link rel="stylesheet" href="/static/style.css" type="text/css">
  </head>
  <body>
    <ul>
      <li><a href="/memo/">memo</a></li>
      <li><a href="http://github.com/nakamuray">github</a></li>
      <li><a href="http://twitter.com/nakamuray">twitter</a></li>
    </ul>
  </body>
</html>

動いた。