パッケージ作成環境: sbuild, lintian, piuparts, autopkgtest


Related Index Debian

はじめに

Debian パッケージを作成するため

  • sbuild: ビルド時の依存環境をテストしつつビルドする
  • lintian: パッケージの品質のチェック
  • piuparts: パッケージとしてのテスト
  • autopkgtest: ビルドしたバイナリの実行テスト

ができるようにしておきます.

sbuild: clean room build 環境

clean room build 環境としては

  • pbuilder/cowbuilder/qemubuilder
  • sbuild

の二通りがあります. どちらが良いのか, は完全に好みの問題だと思いますが Debian 公式のビルドインフラが sbuild なので, 私は sbuild を使っています. sbuild に関しては sbuild - Debian Wiki を参照下さい.

インストールと設定

ほぼ, 上述の wiki の通り:

sudo apt-get install sbuild
sudo sbuild-adduser $LOGNAME
newgrp sbuild

chroot の作成は以下

for a in amd64 i386; do
  for d in stable testing unstable ; do
    sudo LANG=C sbuild-createchroot --arch=$a --include=eatmydata,gnupg $d \
        /srv/chroot/$d-$a-sbuild http://dennou-k.gfd-dennou.org/debian
  done
done

これで, /srv/chroot/ 以下に sbuild 用の chroot 環境ができる. ついでに /etc/schroot/chroot.d/ 以下に sbuild 用の設定ファイルができるので,

union-type=overlay
union-overlay-directory=/dev/shm

を設定しておくと良い(overlayfs で動作します)

for conf in $(grep -l ’^union-type=’ /etc/schroot/chroot.d/*-sbuild*); do
    if ! grep -q "^union-type=" "$conf" ; then
        echo  'union-type=overlay' | sudo tee  --append "$conf"
        echo ’union-overlay-directory=/dev/shm’ | sudo tee --append "$conf"
    fi
done

sbuild の設定は ~/.sbuildrc に書いておく. 末尾にあるのでそちらを参照のこと.

lintian: パッケージの品質のチェック

作成したパッケージが Debian Policy に準拠しているかを チェックするパッケージである lintian を導入.

% sudo apt-get install lintian

設定は以下の通り. pedanticinfo は, まあ趣味でしょうか.

display-info = yes
pedantic = yes
color = auto
show-overrides = yes

sbuild からの呼び出しは ~/.sbuildrc において

## lintinan
# build 後に lintian を走らせる
$run_lintian = 1;
# lintian の option. お好みで。
$lintian_opts = ['-i', '-I'];

とでもしておくと良いだろう.

piuparts: パッケージとしてのテスト

ビルドしたパッケージについて インストール, アップグレード, リムーブ, パージのテストを行なえる piuparts を導入しておく.

% sudo apt-get install piuparts

実際の呼び出しは sbuild から行なう.

## piuparts
# build 後に piuparts を走らせる
$run_piuparts = 1;
# piuparts の option。ここでは sbuild 用に作成した schroot で走らせる
$piuparts_opts = ['-N', '-d', '%r', '--keep-sources-list', '--schroot', '%r-%a-sbuild'];
# root_args
$piuparts_root_args = ['sudo', '--'];

autopkgtest: ビルドしたバイナリの実行テスト

autopkgtest パッケージを導入しておく.

初期設定

autopkgtest 環境として, schroot を使うか lxc を使うか, がある. 当然ながら schroot の方が overhead が少ないのだが, Debian Continuous Integration での動作テストもあるので, debci に揃えることに.

LXC の基本設定や dnsmasq での DHCP 取得ができるようになっていると, あとは debci setup で良い…のだと思う. 本来は

% sudo apt install debci
% sudo MIRROR="http://dennou-k.gfd-dennou.org/debian" \
   debci setup -s unstable --backend lxc -a amd64

ここではまった.

  • 今使っている環境が btrfs
  • debci setup → autopkgtest-build-lxc が呼ばれる
  • autopkgtest-build-lxc では lxc-create で "-B best" が呼ばれている
  • btrfs と lxc-destroy に関するバグ? なのか, コンテナの差分更新後 lxc-destroy ができずに失敗する

というオチに.

結局

--- /usr/bin/autopkgtest-build-lxc.orig	2017-09-07 20:15:12.615081394 +0900
+++ /usr/bin/autopkgtest-build-lxc	2017-09-07 20:16:31.584016755 +0900
@@ -150,14 +150,14 @@

 if [ ! -e $LXCDIR/$NAME ]; then
     # first-time run: just create the container
-    $LXC_CREATE_PREFIX lxc-create -B best --name=$NAME $LXC_ARGS
+    $LXC_CREATE_PREFIX lxc-create --name=$NAME $LXC_ARGS
     setup $NAME
 else
     # remove LXC rootfs caches; on btrfs this might be a subvolume, otherwise
     # rm it
     btrfs subvolume delete /var/cache/lxc/$RELEASE/rootfs-* 2>/dev/null || rm -rf /var/cache/lxc/$RELEASE/rootfs-*
     # create a new rootfs in a temp container
-    $LXC_CREATE_PREFIX lxc-create -B best --name=${NAME}.new $LXC_ARGS
+    $LXC_CREATE_PREFIX lxc-create --name=${NAME}.new $LXC_ARGS
     setup ${NAME}.new
     sed -i "s/${NAME}.new/${NAME}/" $LXCDIR/${NAME}.new/rootfs/etc/hostname $LXCDIR/${NAME}.new/rootfs/etc/hosts
     # replace the original rootfs; can't make this more atomic unfortunately

なんて事をして,

% sudo dpkg-divert \
  --divert /usr/bin/autopkgtest-build-lxc.orig
  --rename /usr/bin/autopkgtest-build-lxc

としてお茶を濁す.

  • [ ] 設定ファイルがあったらそっちを優先して欲しいのだが.

sbuild からの呼び出し

面倒なのは lxc を使う場合には stretch, buster, sid とコードネームなのに対して, sbuild/schroot の release は unstable だったりするところ.

sbuild 自体にも autopkgtest の呼び出しはあるが, ここでは external_commands で 呼び出すことにする.

## autopkgtest
# build 後に autopkgtest の実行 ⇒ 実行しない. post-build-commands で実行
$run_autopkgtest = 0;
# sbuild 用に作成した schroot で走らせる場合は以下を有効に
# $autopkgtest_opts = ['-U', '--', 'schroot', '%r-%a-sbuild'];
# $autopkgtest_root_args = ['sudo', '--'];

外部コマンドの呼び出しは以下

# 外部スクリプトで autopkgtest, rdepends の autopkgstest
$external_commands = {
                      'post-build-commands' =>
                      ['/home/uwabami/.sbuild.d/sbuild-debci-rdepends %c %e'],
                     };

~/.sbuildrc

現在の ~/.sbuildrc は以下の通り

# -*- mode: cperl -*-
## basic
# architecture: all も build する
$build_arch_all = 1;
# デフォルトで source packag も build する
$build_source = 1;

## debsign
# GPG key id
$key_id = '66A4EA704FE240558D6AC2E69394F354891D7E07';

## lintinan
# build 後に lintian を走らせる
$run_lintian = 1;
# lintian の option.
$lintian_opts = ['-i', '-I'];

## piuparts
# build 後に piuparts を走らせる
$run_piuparts = 1;
# piuparts の option. ここでは sbuild 用に作成した schroot で走らせる
$piuparts_opts = ['-N', '--warn-on-leftovers-after-purge', '-d', '%r', '--keep-sources-list', '--log-level=info', '--schroot', '%r-%a-sbuild'];
$piuparts_root_args = ['sudo', '--'];

## autopkgtest
# build 後に autopkgtest の実行
$run_autopkgtest = 1;
# sbuild 用に作成した schroot で走らせる場合は以下を有効に
$autopkgtest_opts = ['-U', '--', 'schroot', '%r-%a-sbuild'];
$autopkgtest_root_args = ['sudo', '--'];
# 外部スクリプトで autopkgtest, rdepends の autopkgstest
$external_commands = {
                      'post-build-commands' =>
                      ['/home/uwabami/.sbuild.d/sbuild-debci-rdepends %c %e'],
                     };