Shiki’s Weblog

ESウェブブラウザ通信 - Ubuntu版のリリースに向けて

2012/08/18 #ESウェブブラウザ通信

これまでescortウェブ ブラウザのバイナリ パッケージはFedora版のみ公開してきました。次のバージョン0.2.3からはUbuntu用のdebパッケージも公開する予定です。今回は、今後の参考のためにdebパッケージを自分で作成して公開する際の手順をまとめておきます。FedoraとUbuntuの違いは、いろいろあると思いますが、まず利用しているパッケージの形式がFedoraはrpm、Ubuntuはdebになります。それからファイルシステムの構成方法は、どちらもFilesystem Hierarchy Standard (FHS)に基づいているのですが、Ubuntuが標準のまま利用しようとしている感じなのに対して、Fedoraは、

The FHS document is the authoritative reference to any FHS-compliant file system, but the standard leaves many areas undefined or extensible.

としていて多少違いがあります。escortブラウザではr2930から、Fedoraだと/usr/libexecディレクトリを利用している部分は、Ubuntuでは/usr/libを利用するように修正しています。注意 : これまでにUbuntu上でescortをソースからビルド、インストールされていて、もし/usr/libexecの中にesrilleというディレクトリだけがある場合は、/usr/libexecごと削除してr2930以降にアップデートしてください。この記事では、これ以降はご自分でdebパッケージを作成する必要がなければ、特にescortについての新しい情報は含まれていません。

escortのdebパッケージの作成手順

ツールのインストール

Fedoraではrpmbuildやmockというツールを使ってパッケージを作成しましたが、Ubuntuではdebhelperpbuilderといったツールを使いますので、予めインストールしておきます:

$ sudo apt-get install ubuntu-dev-tools  # pbuilder
$ sudo apt-get install debhelper         # dh

debianディレクトリの準備(dh_make コマンド)

rpmを構築するためにはSPECファイルを作成しましたが、debの構築ではdebianというディレクトリの下にいくつかの設定ファイルが必要になります。r2932以降で必要なファイルがソースツリーに予めコミットしてあります。はじめてdebianディレクトリを準備する場合は、make distで作成したtarballを使って、そのひな形をdh_makeコマンドで用意することができます:

$ sudo apt-get install dh-make
$ tar zxvf esidl-0.2.0.tar.gz
$ cd esidl-0.2.0
$ dh_make -e info@esrille.org --copyright apache \
-f ../esidl-0.2.0.tar.gz --native

上記のdh_makeコマンドの引数の内容は以下のとおりです:

-e info@esrille.org  # パッケージをesrille.orgが提供していることを示します
--copyright apache   # apacheライセンスのオープンソースプログラムであることを示します
 --native            # esidl-0.2.0.tar.gzがはじめからdebianに対応したtarballであることを示します

debianディレクトリ内のファイルはrpmのSPECファイルで記述したのと同様の内容をいくつかのファイルに分けて記述したような感じになっています。詳細は、『Debian 新メンテナーガイド』などを参考にしてください。SPECファイルもそうでしたが、esidlやescortのようにautotoolsを使っているプロジェクトであれば、特に複雑な設定は必要なさそうです。

パッケージに署名するための鍵の準備

注意 : 自分でパッケージに署名する必要がなければ、キーリストへの鍵の登録だけを行います。pbuilderを利用するときにはパッケージに署名をしておかないとその他の設定がいろいろと面倒になるところがあるので、GnuPGを使って鍵を生成しておきます。$ gpg --gen-key

GnuPGの詳しい使い方は『GnuPGの使い方』などを参考にしてください。esrille.orgから配布するパッケージにはバージョン0.2.3からは、

Esrille Inc. (0.2)<info@esrille.org>

の鍵で署名していく予定です。ニックネームは今のところ(メージャー バージョン.マイナー バージョン)表記としています。なお、1箇所注意しておいたほうがよいのは、 署名に使うためにgpgで作成した鍵とdebian/changelogファイル中の、

Firstname Lastname (nickname)<user@domain.tld>

の部分はまったく同じでないといけない、という点です(参考:debsign: clearsing failed: secret key not available)。鍵を作り終わったら、作成した鍵を使って署名したパッケージをaptコマンドで認証できるように、 公開鍵をaptのキーリストに登録しておきます。公開鍵を、

$ gpg -a --export </span> *userid*

で表示して、それを、

$ apt-key add -
... 公開鍵のテキストを貼り付ける  ...
^D  # EOFを入力

のようにすれば、キーリストに鍵を登録できます。登録されている鍵は、

$ apt-key list

で確認できます。

補足: ソースパッケージの認証は~/.gnupg/trustedkeys.gpgを参照するようで、

$ gpg --no-default-keyring --keyring trustedkeys.gpg --import

で登録できます。

ローカルのdebレポジトリの準備

escortのパッケージのビルドで少し面倒な所は、escortの前にesidl Web IDLコンパイラのパッケージをビルドして、さらにそれを利用してescortのパッケージをビルドしないといけない点です。こういった場合、pbuilderでは、ローカルにdebパッケージのレポジトリを用意しておいて、そこにesidlのパッケージを登録しておき、escortをビルドするときにはローカルのレポジトリからesidlを取得してくる、という方法がPbuilderTricksに紹介されています。そこで、pbuilderのセットアップを行う前にロカールのdebレポジトリを準備しておきます。HowToSetupADebianRepositoryではいろいろなdebレポジトリの構築方法が説明されていて迷ってしまうのですが、ここではapt-ftparchiveを使った方法をまとめておきます。まずはこちらなども参考にレポジトリのルート ディレクトリを決めます。 ここでは、

~/ftparchive

を使うことにしておきます。そうしたら、その下にさらに以下のようなディレクトリ構造を作ります:

 ~/ftparchive
  + conf
  + db
  + dists
  + hook  # このディレクトリはpbuilderが参照します
  + pool
      + precise   # 12.04 LTS (Precise Pangolin)用のプール

ここでは、Ubuntu 12.04 (Precise Pangolin)用のパッケージだけを準備しています。confの中には以下の2つの設定ファイルを用意しておきます。

$ cat ~/ftparchive/conf/apt-ftparchive.conf
Dir {
    ArchiveDir       ".";
    CacheDir         "db";
}

Tree "dists/precise" {
    Sections         "main";
    Architectures    "i386 amd64 source";
    Directory        "pool/precise";
    SrcDirectory     "pool/precise";
}

Default {
    Packages {
        Extensions   ".deb";
    };
};

$ cat ~/ftparchive/conf/precise-release.conf
APT::FTPArchive::Release::Origin "Esrille Inc.";
APT::FTPArchive::Release::Label "ES operating system";
APT::FTPArchive::Release::Suite "unstable";
APT::FTPArchive::Release::Codename "precise";
APT::FTPArchive::Release::Architectures "i386 amd64 source";
APT::FTPArchive::Release::Components "main";
APT::FTPArchive::Release::Description "Packages for Ubuntu 12.04 from Esrille";

ここまで準備ができたら、あとはpbuilderが生成したファイルをpool/preciseの中にコピーして、以下のようなスクリプトを実行すると、~/ftparchive/distsの中にレポジトリに必要なファイルが生成されます:

 $ cat  ~/ftparchive/update-archive.sh
#!/bin/sh
rm -rf db
mkdir -p db
rm -rf dists
mkdir -p dists/precise/main/binary-amd64
mkdir -p dists/precise/main/binary-i386
mkdir -p dists/precise/main/source
apt-ftparchive generate conf/apt-ftparchive.conf
apt-ftparchive -c conf/precise-release.conf release dists/precise > dists/precise/Release
gpg -abs -o dists/precise/Release.gpg dists/precise/Release

このupdate-archive.shスクリプトはあとで利用するのでここで作成しておきます。

pbuilderのセットアップ

pbuilderはFedoraのmockのUbuntu版のような感じで、やはりchroot環境でビルドすることでパッケージの依存関係の誤りなどを発見しやすくしてくれるものです。まずは、chroot環境を構築します。

$ pbuilder-dist precise create

'precise'はUbuntu 12.04 (Precise Pangolin)用のパッケージをビルドすることを指定しています。ホストのOSが64ビット版(amd64)であれば、以下のような具合に32ビット(i386)のchroot環境も操作できます。

$ pbuilder-dist precise i386 create

続いて先ほど作成したロカールのdebレポジトリにpbuilderがアクセスできるように設定していきます。まず、以下のような~/.pbuilderrcファイルを作成します( user となっている箇所は適当に置き換えてください)。

 $ cat ~/.pbuilderrc
OTHERMIRROR="deb file:///home/user/ftparchive precise main"
BINDMOUNTS="/home/user/ftparchive"
HOOKDIR="/home/user/ftparchive/hook"
EXTRAPACKAGES="apt-utils"

また$HOOKDIRに以下のようなファイルD05deps作成します(変わったファイル名ですが名前の付け方に規則があるので変更しないように):

 $ cat  ~/ftparchive/hook/D05deps
#!/bin/sh
apt-get update

以上の設定をpbuilderに反映させます:

$ pbuilder-dist precise update --override-config --configfile ~/.pbuilderrc

更にesidlパッケージの署名をpbuilder内でも認証できるようにしておかないといけないので、署名に使う鍵の公開鍵をpbuilderの環境にも保存しておきます(参考):

 $ pbuilder-dist precise login --save-after-login
# apt-key add -
...公開鍵のテキストを貼り付ける...
^D  # EOFを入力
# もう一度^Dを押してログアウト

先ほどホスト側で行ったのと同じ処理をchroot環境内でも予め実行しておくわけです。これでpbuilderのセットアップは完了です。

ソースパッケージの作成 (esidl)

次に、esidlのtarballを展開して、ソースパッケージだけを作成します。

 $ cd esidl-0.2.3
$ dpkg-buildpackage -S
$ cd ..
$ ls -F
esidl-0.2.3/
esidl_0.2.3.dsc
esidl_0.2.3_source.changes
esidl_0.2.3.tar.gz
esidl-0.2.3.tar.gz 

esidl_0.2.3(途中はアンダースコア)ではじまるファイルがdpkg-buildpackageコマンドの作成したファイルで、pbuilderが参照するファイルになります。(mockでもrpmbuildでソースパッケージだけ先に作ったのと似ています。) なお、ソースツリーでdebianディレクトリ内のファイルを変更したときは、この手順から実行し直す必要があります。

debパッケージの作成 (esidl)

続けて、pbuilderを使ってesidlのdebパッケージを構築します。

$ pbuilder-dist precise build esidl\_0.2.3.dsc

実行が完了すると、~/pbuilder/precise_result の中にdebパッケージが作成されています:

$ cd ~/pbuilder/precise_result
$ ls
esidl_0.2.3.dsc
esidl_0.2.3_amd64.changes
esidl_0.2.3_amd64.deb
esidl_0.2.3.tar.gz 

この状態ではまだパッケージに署名がされていないので、署名しておきます。

$ debsign esidl\_0.2.3\_i386.changes

ローカルdebレポジトリの更新

次に生成されたesidlのdebパッケージをローカルレポジトリに登録します:

 $ cd ~/ftparchive
$ cp ~/pbuilder/precise_result/esidl_0.2.3* pool/precise
$./update-archive.sh
 pool/precise: New 1,347 B 1 files 202 kB 0s
 pool/precise: New 20 B 0 files 0 B 0s
 pool/precise:  esidl has no source override entry
  esidl has no binary override entry either
 New 1,324 B 1 pkgs in 0s
Packages done, Starting contents.
 dists/precise/Contents-amd64: New 220 B 1 files 202 kB 0s
 dists/precise/Contents-i386: New 20 B 0 files 0 B 0s
Done. 202 kB in 1 archives. Took 0s

update-archive.shの最後のステップでReleaseに署名しておくのがポイントです(参考:SecureApt - All about secure apt)。こうしておくと、あとでescortのdebパッケージをビルドする際に、pbuilderがesidlのパッケージを無事にインストールできます。ちなみに署名がないと、

Untrusted packages could compromise your system's security.
You should only proceed with the installation if you are certain that
this is what you want to do.

  esidl

Do you want to ignore this warning and proceed anyway?
To continue, enter "Yes"; to abort, enter "No": Abort.
E: pbuilder-satisfydepends failed.

となって、pbulderが強制終了されてしまいます(これはこれで直す方法があるようですが、署名してしまっておいた方が簡単な気がします)。これでようやくescortのdebパッケージをビルドする準備ができました。今後、esidlには変更がなくて、escortだけパッケージを構築し直したい場合には次のステップから始めれば大丈夫です。

debパッケージの作成 (escort)

いよいよescortのdebパッケージをビルドしていきます。手順はesidlの場合と同じです。

 $ tar zxvf escort-0.2.3.tar.gz
$ cd escort-0.2.3
$ dpkg-buildpackage -S
$ cd ..
$ ls -F
escort-0.2.3/
escort_0.2.3.dsc
escort_0.2.3_source.changes
escort_0.2.3.tar.gz
escort-0.2.3.tar.gz
$ pbuilder-dist precise build escort_0.2.3.dsc
$ cd ~/pbuilder/precise_result
$ ls
escort_0.2.3.dsc
escort_0.2.3_amd64.changes
escort_0.2.3_amd64.deb
escort_0.2.3.tar.gz
esidl_0.2.3.dsc
esidl_0.2.3_amd64.changes
esidl_0.2.3_amd64.deb
esidl_0.2.3.tar.gz
$ debsign escort_0.2.3_amd64.changes

これでパッケージがすべて準備できました。実際にHTTPサーバーから公開する場合には、escortのファイルもpoolに入れて、~/ftparchiveから~/ftparchive/distsと~/ftparchive/poolの部分を公開することになります。

まとめ

今回はUbuntu用のdebパッケージの作成方法をまとめておきました。それから前回、次回紹介しますと書いてしまったテスト ハーネスの使い方についてはまた次回に、ということで、今回はここまでです。