Debian Buildd セットアップ

Debian/SH4 の buildd を構築したときの作業メモ。

debian-ports でしか動作確認を行っていないが、オフィシャルアーキテクチャのbuilddも構築できるはず。 その場合、wanna-build へのアクセス権限が必要となるので builddメンテナと要相談。

あと、基本的にメールアドレスが必要になる。理由はビルドログ、changelog へのキーサインなどはMUAで行うためである。 buildd 毎に メールアドレスを用意する必要がある。debian-ports では、このあたりのサポートもしているので、管理者に相談すること。

Buildd のパッケージビルドまでの流れ

Buildd する前に、Buildd のパッケージビルドがされるまでの流れを理解しておくとよいかもしれないのでメモしておく。

  1. パッケージメンテナが新しいソースパッケージをアップロード
  2. wanna-build のDBに新しいバージョンが追加される
  3. Buildd が wanna-build に ビルドができるパッケージがないか、問い合わせる
  4. ビルドするパッケージあったら、Buildd がwanna-buildのDBを変更
  5. Buildd がビルドする。
  6. ビルドが完了したら、Buildd はビルドログとchangesファイルを Buildd メンテナに送信。Buildd は 3. に戻る。
  7. Builddメンテナは受信したメールから changes の部分を抽出して GPGサイン。サインした changes を Buildd に返信。
  8. Buildd に失敗した場合には、返信するメールの本文にコマンドを書いて返信する。ビルドに失敗した場合には failed、再ビルドをしたい場合には give-back など。
  9. メールを受信した 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

前準備

  1. buildd ユーザを追加する。

    # adduser --system --shell /bin/sh --uid 60000 --gecos 'Build Daemon' --group --disabled-password buildd
    
  2. 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 
    
  3. /srv/chroot ディレクトリを作成し、sid ディレクトリに chroot を作成する。

    # mkdir -p /srv/chroot
    # debootstrap --variant=buildd sid sid http://ftp.debian-ports.org/debian
    
  4. /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   
    
  5. /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
    
  6. /etc/sbuild/chroot ディレクトリを作成して、/srv/chroot/sid のシンボリックリンクを /etc/sbuild/chroot/sid に作成する。

    # mkdir -p /etc/sbuild/chroot
    # ln -s /srv/chroot/sid /etc/sbuild/chroot/sid
    
  7. sudo の設定をする。

    buildd ユーザsudoアクセスはパスワードなしに設定するので、セキュリティには注意すること。

    # apt-get install sudo
    
    
    buildd  ALL=NOPASSWD: ALL
    Defaults:buildd env_keep+="APT_CONFIG DEBIAN_FRONTEND SHELL"
    
  8. buildd ユーザを sbuild グループに追加する。

    # adduser buildd sbuild
    
  9. fetchmail と procmail をインストールする。

    # apt-get install fetchmail procmail
    
  10. /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 内での作業

  1. chroot にログインする。

    # chroot /srv/chroot/sid
    
  2. secure-apt を設定する。

    # apt-get install debian-ports-archive-keyring
    
  3. chroot 環境をアップデートする。

    # apt-get update
    # apt-get upgrade
    # apt-get dist-upgrade
    
  4. debconf をインストールして、インターフェイスとプライオリティを設定する。

    # apt-get install debconf
    # dpkg-reconfigure -plow debconf
    

    debconf の設定は以下のようにする。

    • interface : choose 6/Noninteractive

    • priority : choose 1/Critical

  5. debfoster fakeroot build-essential makedev をインストールする。

    # apt-get install debfoster fakeroot build-essential makedev
    
  6. makedev の設定をして、mtab ファイルを作成する。

    # cd /dev/
    # /sbin/MAKEDEV generic
    # touch /etc/mtab
    
  7. 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
    
  8. 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
    
  9. chroot からログアウトする。

    # exit
    

buildd ユーザでの作業

  1. buildd に必要なディレクトリを作成する。

    $ mkdir -p logs build old-logs upload bin stats/graphs mqueue Mail
    
  2. ~/.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;
    
  3. ~/.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;
    
  4. /etc/email-addresses に buildd ユーザを追加する。

    buildd: buildd@example.org
    
  5. 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
    
  6. smtp の設定をする。

    exim4 かつ gmail で構築する場合には、http://wiki.debian.org/GmailAndExim4 が役に立つ。

  7. dupload を設定する。

    ~/.dupload.conf を設定する。

    package config;
    $default_host = 'example';
    $cfg{'debian-ports'} = {
            fqdn => "example.org",
            incoming => "/incoming/",
            dinstall_runs => 1,
            passive => 1
    };
    
  8. リブートする。

  9. sbuild の動作確認。

    buildd ユーザで sbuild の動作確認を行う。hello パッケージあたりでテストするのが無難。 ソースパッケージやログが実行したディレクトリ下に置かれるので、適当なディレクトリを作成して、移動した後に行うのがよいかも。

    $ sbuild -v -d unstable hello_unstableのバージョン
    

    ビルド結果は、上で設定されたメールアドレス($mailto)に送られる。メールがこない場合には設定に間違いがあるか、smtpの問題。

  10. buildd ユーザの ssh 公開鍵を wanna-build メンテナに送って、buildd が wanna-buildd にアクセスできるように設定してもらう。

  11. cron を設定。

    時間は適当で。builddの能力に合わせて設定すると良いかも。

    40 * * * * /usr/bin/buildd-uploader
    20 * * * * /usr/bin/buildd-watcher
    0 * * * * /usr/bin/fetchmail
    

unstable 以外の ディストリビューションのサポート方法

以下、experimental 向けの説明です。

  1. /srv/chroot/experimental に experimental 用の chroot を作成する。

    基本的に unstable の場合と同じ。 debootstrap で作成して、apt-line に experimental を追加すること。

  2. /srv/chroot/experimental のシンボリックリンクを /etc/sbuild/chroot/experimental に作成する。

    $ sudo ln -s /srv/chroot/experimental /etc/sbuild/chroot/experimental
    
  3. /etc/schroot/schroot.conf に experimental の設定を追加する。

    [experimental]
    description=Debian experimental
    directory=/srv/chroot/experimental
    groups=sbuild
    root-groups=sbuild
    
  4. ~/.builddrc を設定する。

    @take_from_dists に experimental を追加。

    @take_from_dists = qw(unstable experimental);
    
  5. buildd を再起動

    再起動する前に、sbuild で動作確認しておいたほうがいい。

    $ sbuild -v -d experimental experimentalにあるパッケージ_パッケージのバージョン
    

auto-sign 機能の追加

debian-ports でも auto-sign機能が付いたので、サポートしてみる。

  1. buildd ユーザでGPG鍵を作る。RSA, 4096, 期限は120日。エントロピーが足りないとか言われる場合があるので

     dd if=/dev/urandom of=/tmp/mass bs=1M count=512
    

    としてディスクアクセスを発生してみたりする。

  2. buildd, sbuild をアップデート。201104版ぐらいからサポートしているらしい。

  3. ~/.builddrc に以下の行を追加。

    $sign_with = "0BADBEEF";

  4. 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を有効にしておくこと。