年末年始ムードも落ち着き、
Debian形式のパッケージとそのテストツール
UbuntuはDebianをベースにしたディストリビューションであり、
あるソフトウェアのバイナリパッケージはおもに次のようなルートで生成されます。
- ソフトウェアの開発元
(アップストリーム) からソースコードのアーカイブを取得する - ソースコードをDebianのルールに従ってビルド、
インストールするためのスクリプト群 (debian/ディレクトリ) を追加する - アーカイブとdebian/ディレクトリを元に
「ソースパッケージ」 を作成する - ソースパッケージをビルドし、
バイナリパッケージを作成する
ほとんどの工程は半自動化されており、
アップストリームの新規リリースに追随したり、
ビルドテスト
パッケージを修正したらまず行うことはビルドできるかどうかの確認です。しかもただローカル環境でビルドするのではなく、
ある時点でパッケージをビルドできたとしても、
パッケージのポリシー
Debianのパッケージはただソフトウェアをインストールするだけでなく、
と言ってもこの膨大なポリシーすべてに従っているかどうかを手作業で確認するのは至難の業です。機械でできることは機械に任せる、
Debianの場合、
インストールやアップグレードのテスト
ビルドも問題なく、
これを自動的に行ってくれるのがpiupartsと言うコマンドです。piupartsを使えば、
Debianでは、
動作確認
もちろんインストールするだけでなく、
そんな様々なテストを行うことで、
autopkgtest
いろいろなフェーズのテストが自動化される中、
それでも可能な限り自動化できないか、
ようやくここからが本題です。
autopkgtestの仕組み
autpkgtestはバイナリパッケージに対して、
最近のソフトウェアには、
Debianでは現在、
Ubuntuでは既にいくつかのパッケージはautopkgtestを導入しています。導入されたパッケージについては、
サンプルで試してみる
では実際に試してみましょう。まずはテストしたい環境でautopkgtestパッケージをインストールしておきます。
$ sudo apt-get update $ sudo apt-get install autopkgtest
いきなりテストを書くのではなく、
$ mkdir /tmp/pkgtest-libxml2; cd /tmp/pkgtest-libxml2 $ apt-get source libxml2 $ cd libxml2-2.9.1+dfsg1/ $ ls debian/tests build control python $ cat debian/tests/control Tests: build python Depends: libxml2-dev, python-libxml2, build-essential, pkg-config
このうちcontrolがテストの設定を行うファイルです。Testsフィールドで
テストごとに同名のファイルを作って、
このテストを実行するにはadt-runコマンドを使用します。
$ sudo adt-run --no-built-binaries --built-tree=. --- adt-virt-null adt-run: $ vserver: adt-virt-null adt-run: $ genkey: sh -ec <SCRIPT> x /home/shibata/.autopkgtest/gpg + gpg --homedir=/home/shibata/.autopkgtest/gpg --batch --gen-key key-gen-params (中略) adt-run: & apt0t-build: [---------------------------------------- adt-run: & apt0t-build: ----------------------------------------] adt-run: & apt0t-build: - - - - - - - - - - results - - - - - - - - - - apt0t-build PASS adt-run: & apt0t-build: - - - - - - - - - - stdout - - - - - - - - - - build: OK run: OK (中略) adt-run: & tree0t-python: [---------------------------------------- adt-run: & tree0t-python: ----------------------------------------] adt-run: & tree0t-python: - - - - - - - - - - results - - - - - - - - - - tree0t-python PASS adt-run: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ tests done.
「build」
ちなみに上記を実行すると
「--no-build-binaries」
「--built-tree」
たとえば次のようにパッケージ名そのものを指定した場合は、
$ sudo adt-run libxml2 --- adt-virt-null
「---」
「adt-virt-null」
adt-virt-lxcを使う
autopkgtestではLXCも仮想環境として使用できます。これはautopkgtestの2.
まずLXCをインストールした上で、
$ sudo apt-get install lxc $ sudo lxc-create -t ubuntu-cloud -n trusty-cloud -- -r trusty
ubuntu-cloudはUbuntu Cloud Imageを使用するテンプレートです。EC2などと同様に、
実際に作成されたコンテナーは次のコマンドで確認できます。
$ sudo lxc-ls --fancy NAME STATE IPV4 IPV6 AUTOSTART -------------------------------------------- trusty-cloud STOPPED - - NO
次に、
$ sudo adt-run --no-built-binaries --built-tree=. --- adt-virt-lxc --ephemeral trusty-cloud adt-run: $ vserver: adt-virt-lxc --ephemeral trusty-cloud adt-run: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ builds ... adt-run: @@@@@@@@@@@@@@@@@@@@ tree tree0 adt-run: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ builds done. adt-run: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ tests ... adt-run: @@@@@@@@@@@@@@@@@@@@ test tree tree0 adt-run: @@@@@@@@@@ run_tests ... adt-run: & tree0t-build: preparing (中略) adt-run: & tree0t-python: [---------------------------------------- adt-run: & tree0t-python: ----------------------------------------] adt-run: & tree0t-python: - - - - - - - - - - results - - - - - - - - - - tree0t-python PASS adt-run: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ tests done.
「adt-virt-lxc」
たとえばテスト中にlxc-lsを実行すれば、
$ sudo lxc-ls --fancy NAME STATE IPV4 IPV6 AUTOSTART --------------------------------------------------------- adt-virt-lxc-tcgnqo RUNNING 10.0.3.247 - NO trusty-cloud STOPPED - - NO
ちなみにtrusty-cloudコンテナーを今後もテスト環境のベースコンテナーとして使い続けるなら、
$ sudo lxc-start -n trusty-cloud ユーザー名:ubuntu、パスワード:ubuntuでログイン $ sudo apt-get update && sudo apt-get dist-upgrade $ sudo halt
まとめ
現在どのパッケージがautopkgtestに対応しているかは次のコマンドで確認できます。
$ sudo apt-get install dctrl-tools $ grep-dctrl -F Testsuite autopkgtest -s Package /var/lib/apt/lists/*Sources
Debianのsidだと254個、
よってautopkgtestによるテストコードは、