Debian Buildd セットアップ
Debian/SH4 の buildd を構築したときの作業メモ。
debian-ports でしか動作確認を行っていないが、オフィシャルアーキテクチャのbuilddも構築できるはず。 その場合、wanna-build へのアクセス権限が必要となるので builddメンテナと要相談。
あと、基本的にメールアドレスが必要になる。理由はビルドログ、changelog へのキーサインなどはMUAで行うためである。 buildd 毎に メールアドレスを用意する必要がある。debian-ports では、このあたりのサポートもしているので、管理者に相談すること。
Buildd のパッケージビルドまでの流れ
Buildd する前に、Buildd のパッケージビルドがされるまでの流れを理解しておくとよいかもしれないのでメモしておく。
- パッケージメンテナが新しいソースパッケージをアップロード
- wanna-build のDBに新しいバージョンが追加される
- Buildd が wanna-build に ビルドができるパッケージがないか、問い合わせる
- ビルドするパッケージあったら、Buildd がwanna-buildのDBを変更
- Buildd がビルドする。
- ビルドが完了したら、Buildd はビルドログとchangesファイルを Buildd メンテナに送信。Buildd は 3. に戻る。
- Builddメンテナは受信したメールから changes の部分を抽出して GPGサイン。サインした changes を Buildd に返信。
- Buildd に失敗した場合には、返信するメールの本文にコマンドを書いて返信する。ビルドに失敗した場合には failed、再ビルドをしたい場合には give-back など。
- メールを受信した Buildd は メールの内容に合わせて動作する。
- コマンドが書かれている場合には、wanna-build にコマンドを発行する。
- changes ファイルがある場合には、内容をパースしてビルドしたパッケージを サーバにアップロードする(実際にはもうちょっと細かい動作をするが、割愛)。
上記のように動作するので、Buildd には メールを送信する機能(smtp)と、メールを受信する機能(pop)、パッケージをビルドする機能(schroot, sbuild, buildd)、パッケージ情報をチェックする機能(buildd, ssh)が必要になる。
buildd の構築
以下に Buildd の構築手順を示す。 設定用データは以下の通り。
- ターゲットアーキテクチャ: target_arch
- Buildd のメールアドレス: buildd@example.org
- Buildd メンテナのメールアドレス: buildd-admin@example.org
- Buildd ログの送信メールアドレス: logs@example.org
- wanna-buildd サーバ: example.org
- wanna-buildd サーバのアカウント: buildd_target_arch
- dupload 先: example.org
- chroot の位置: /srv/chroot/sid
前準備
buildd ユーザを追加する。
# adduser --system --shell /bin/sh --uid 60000 --gecos 'Build Daemon' --group --disabled-password buildd
sbuild と buildd をインストールする。 インストールする際には、リリースされているものではなく、https://buildd.debian.org/apt/ から取得すること。
# apt-get install sbuild buildd
オフィシャルのパッケージによってアップデートされないように、hold しておく。
# echo buildd hold | dpkg --set-selections # echo libsbuild-perl hold | dpkg --set-selections # echo sbuild hold | dpkg --set-selections
/srv/chroot ディレクトリを作成し、sid ディレクトリに chroot を作成する。
# mkdir -p /srv/chroot # debootstrap --variant=buildd sid sid http://ftp.debian-ports.org/debian
/etc/fstab に以下の内容を追加する。
$ cat /etc/fstab /dev/pts /srv/chroot/sid/dev/pts none rw,bind 0 0 tmpfs /srv/chroot/sid/dev/shm tmpfs defaults 0 0 proc /srv/chroot/sid/proc proc defaults 0 0 /tmp /srv/chroot/sid/tmp none rw,bind 0 0 /etc/resolv.conf /srv/chroot/sid/etc/resolv.conf none ro,bind 0 0
/etc/schroot/schroot.conf を以下のように変更する。
コメントアウトになっているので、該当部分のコメントを外せばOK。
$ cat /etc/schroot/schroot.conf [sid] description=Debian sid (unstable) directory=/srv/chroot/sid groups=sbuild root-groups=sbuild aliases=unstable,default
/etc/sbuild/chroot ディレクトリを作成して、/srv/chroot/sid のシンボリックリンクを /etc/sbuild/chroot/sid に作成する。
# mkdir -p /etc/sbuild/chroot # ln -s /srv/chroot/sid /etc/sbuild/chroot/sid
sudo の設定をする。
buildd ユーザsudoアクセスはパスワードなしに設定するので、セキュリティには注意すること。
# apt-get install sudo buildd ALL=NOPASSWD: ALL Defaults:buildd env_keep+="APT_CONFIG DEBIAN_FRONTEND SHELL"
buildd ユーザを sbuild グループに追加する。
# adduser buildd sbuild
fetchmail と procmail をインストールする。
# apt-get install fetchmail procmail
/etc/buildd/buildd.conf
パッケージのアップロード先を指定する。upload_queues の値を変更する。以下は debian-ports の場合の設定。 @upload_queues = ( { # Local queue directory where binaries are stored before uploaded # by dupload. dupload_local_queue_dir => "upload", # Upload site for buildd-upload to pass to dupload(1); see # /etc/dupload.conf for possible values. dupload_archive_name => "debian-ports", }, );
chroot 内での作業
chroot にログインする。
# chroot /srv/chroot/sid
secure-apt を設定する。
# apt-get install debian-ports-archive-keyring
chroot 環境をアップデートする。
# apt-get update # apt-get upgrade # apt-get dist-upgrade
debconf をインストールして、インターフェイスとプライオリティを設定する。
# apt-get install debconf # dpkg-reconfigure -plow debconf
debconf の設定は以下のようにする。
interface : choose 6/Noninteractive
priority : choose 1/Critical
debfoster fakeroot build-essential makedev をインストールする。
# apt-get install debfoster fakeroot build-essential makedev
makedev の設定をして、mtab ファイルを作成する。
# cd /dev/ # /sbin/MAKEDEV generic # touch /etc/mtab
sbuild の設定をする。
chroot 内には sbuild グループが設定されていないので、追加する。 この場合、host(chroot外) と chroot 内の sbuild グループIDを一致させる必要がある。 例えば、105 なら 以下のようにして作成する。
# groupadd -g 105 sbuild
sbuild に必要なディレクトリ等を作成する。
# mkdir /build # chown root:sbuild /build # chmod 02775 /build # mkdir -p /var/lib/sbuild/srcdep-lock # chown -R root:sbuild /var/lib/sbuild # chmod -R 02775 /var/lib/sbuild
上記を一度に実行するためのメモ。
# mkdir /build ; chown root:sbuild /build ; chmod 02775 /build ; mkdir -p /var/lib/sbuild/srcdep-lock ; chown -R root:sbuild /var/lib/sbuild ; chmod -R 02775 /var/lib/sbuild
debfosterを実行する。
# debfoster
質問が出てくるので、Y を押す。
build-essential is keeping the following 24 packages installed: binutils bzip2 cpp cpp-4.4 dpkg-dev fakeroot g++ g++-4.4 gcc gcc-4.4 libc-dev-bin libc6-dev libdb4.7 libdpkg-perl libgmp10 libgomp1 libmpfr4 libstdc++6-4.4-dev libtimedate-perl linux-libc-dev make patch perl perl-modules Keep build-essential? [Ynpsiuqx?], [H]elp: Y debfoster is keeping the following 1 packages installed: libgc1c2 Keep debfoster? [Ynpsiuqx?], [H]elp: Y Keep debian-ports-archive-keyring? [Ynpsiuqx?], [H]elp: Y Keep makedev? [Ynpsiuqx?], [H]elp: Y
chroot からログアウトする。
# exit
buildd ユーザでの作業
buildd に必要なディレクトリを作成する。
$ mkdir -p logs build old-logs upload bin stats/graphs mqueue Mail
~/.sbuildrc を設定する。
基本的に以下の設定だけでOK。
$arch = 'target_arch'; $mailto = "buildd-admin\@example.org,logs\@example.org"; $mailfrom = 'Debian buildd <buildd@example.org>'; $maintainer_name='Debian buildd <buildd@example.org>'; $purge_build_directory="successful"; $sbuild_mode = "buildd"; $stalled_pkg_timeout = 3000; # don't remove this, Perl needs it: 1;
~/.builddrc を設定する。
いろいろ設定があるが、メールアドレス、wanna-build へのアクセス、アーキテクチャの設定を変更するだけで動作するはず。
@take_from_dists = qw(unstable); # list of packages which shouldn't be picked up by buildd @no_auto_build = qw(); # packages which are built only if there is nothing else to build @weak_no_auto_build = qw(); $autoclean_interval = 86400; # threshold for a secondary daemon to start (number of Needs-Build packages) $secondary_daemon_threshold = undef; # mail addr of admin $admin_mail = 'buildd\@example.org'; $statistics_mail = $admin_mail; # how many days until to archive build logs $build_log_keep = 1; # log success messages from upload queue daemon? $log_queued_messages = 1; # Should buildd send rotated daemon.log files? $daemon_log_send = 0; # Dedicated build daemons should not be niced $nice_level = 0; $sshcmd = "/usr/bin/ssh -l buildd_target_arch example.org"; $sshsocket = "buildd.example.org.ssh"; $wanna_build_user = "buildd"; $wanna_build_dbbase = "target_arch/build-db"; # don't remove this, Perl needs it 1;
/etc/email-addresses に buildd ユーザを追加する。
buildd: buildd@example.org
procmail と fetchmail の設定をする。
~/.procmailrc の設定例。メールアドレス(builddメンテナのアドレス。GPGサインする人へ送信する。)以外はそのままでOK.
PATH=/bin:/usr/bin:/usr/local/bin HOME=/home/buildd MAILDIR=$HOME/Mail DEFAULT=$MAILDIR/default/ LOGFILE=$MAILDIR/procmaillog LOCKFILE=$HOME/.lockmail :0 * ^From:.*buildd-admin@example.org |/usr/bin/buildd-mail-wrapper
~/.fetchmailrc の設定例。以下は gmailを使っている場合。
defaults flush # not keep mail mda "/usr/bin/procmail" poll pop.gmail.com protocol pop3 port 995 user buildd@example.org password 'password' ssl
smtp の設定をする。
exim4 かつ gmail で構築する場合には、http://wiki.debian.org/GmailAndExim4 が役に立つ。
dupload を設定する。
~/.dupload.conf を設定する。
package config; $default_host = 'example'; $cfg{'debian-ports'} = { fqdn => "example.org", incoming => "/incoming/", dinstall_runs => 1, passive => 1 };
リブートする。
sbuild の動作確認。
buildd ユーザで sbuild の動作確認を行う。hello パッケージあたりでテストするのが無難。 ソースパッケージやログが実行したディレクトリ下に置かれるので、適当なディレクトリを作成して、移動した後に行うのがよいかも。
$ sbuild -v -d unstable hello_unstableのバージョン
ビルド結果は、上で設定されたメールアドレス($mailto)に送られる。メールがこない場合には設定に間違いがあるか、smtpの問題。
buildd ユーザの ssh 公開鍵を wanna-build メンテナに送って、buildd が wanna-buildd にアクセスできるように設定してもらう。
cron を設定。
時間は適当で。builddの能力に合わせて設定すると良いかも。
40 * * * * /usr/bin/buildd-uploader 20 * * * * /usr/bin/buildd-watcher 0 * * * * /usr/bin/fetchmail
unstable 以外の ディストリビューションのサポート方法
以下、experimental 向けの説明です。
/srv/chroot/experimental に experimental 用の chroot を作成する。
基本的に unstable の場合と同じ。 debootstrap で作成して、apt-line に experimental を追加すること。
/srv/chroot/experimental のシンボリックリンクを /etc/sbuild/chroot/experimental に作成する。
$ sudo ln -s /srv/chroot/experimental /etc/sbuild/chroot/experimental
/etc/schroot/schroot.conf に experimental の設定を追加する。
[experimental] description=Debian experimental directory=/srv/chroot/experimental groups=sbuild root-groups=sbuild
~/.builddrc を設定する。
@take_from_dists に experimental を追加。
@take_from_dists = qw(unstable experimental);
buildd を再起動
再起動する前に、sbuild で動作確認しておいたほうがいい。
$ sbuild -v -d experimental experimentalにあるパッケージ_パッケージのバージョン
auto-sign 機能の追加
debian-ports でも auto-sign機能が付いたので、サポートしてみる。
buildd ユーザでGPG鍵を作る。RSA, 4096, 期限は120日。エントロピーが足りないとか言われる場合があるので
dd if=/dev/urandom of=/tmp/mass bs=1M count=512
としてディスクアクセスを発生してみたりする。
buildd, sbuild をアップデート。201104版ぐらいからサポートしているらしい。
~/.builddrc に以下の行を追加。
$sign_with = "0BADBEEF";
- buildd を再起動。
その他
Buildd でgmail の smtp を使って送信する場合
http://wiki.debian.org/GmailAndExim4 を参照。
buildd から送信されたメールへの処理
最初でも説明したように、ビルド結果が buildd からメールで送信され、そのメールを処理して PGP/GPG でサインして buildd に送り返す必要がある。この場合、MUAで処理するのだが、一つ一つ手作業でやっていては無駄なので、 MUAのスクリプト機能を使って行う。mutt の場合(なぜか buildd メンテナはmutt使いが多いようだ)、以下のようなスクリプトを 作成して ~/.muttrc に追加しておけば、処理が楽になる。
~/bin/buildd-script.sh
#!/bin/bash +e
sed -i -e '/^Fcc:/d' -e '/^On .* wrote:$/,/\.changes\:$/d' -e '/^[*┌]/,$d' $1
~/.muttrc の設定
send-hook '~t buildd ~s success' "set signature='' pgp_autosign=yes indent_string='' edit_headers=yes editor='~/bin/buildd-script.sh' fast_reply=yes pgp_create_traditional=yes include=yes pgp_sign_as=buildd-admin@example.org"
buildd で ssh を使う場合
ビルドするパッケージで ssh ポート(22) を使う事がある。この場合、ポートが競合するので、buildd の ssh ポートは違うポートに割り当てる事。
カーネルのipv6 サポート
パッケージによってはipv6のテストを行うので、カーネルでipv6を有効にしておくこと。