2012年2月7日

Buildbot を使ってみる

Buildbot はソフトウェア開発におけるチェックアウト、ビルド、テストというサイクルの自動化を支援してくれます。 Python 自体の継続ビルドや、Chronium のビルドツールとして利用されています。

Buildbot の概要についてはこちらの記事にまとめられています。 (実際のコードはちょっと古くなってしまっています)

Note

この記事は、Python の学習資料の中に盛り込もうとしたけど難しそうだからやっぱりやめた、 というもので、結論や発展性はありません。要するに書きかけの没ネタです。 (何かのメモになれば)

これまでのまとめ :

Buildbot をインストールする

まずはソフトウェアをインストールします。 pip を使ってインストールできます。

$ virtualenv --distribute buildbot-sample
$ cd buildbot-sample
$ source bin/activate
(buildbot-sample) $ pip install buildbot

bin ディレクトリ (Windows の場合は Scripts フォルダ) に buildbot コマンドがインストールされます。

virtualenv って何?という場合は環境構築の資料を見直してください。

マスターノードを作成する

次に、マスターノードを作成します。

(buildbot-sample) $ buildbot create-master master
mkdir /Users/shigeru/projects/buildbot-sample/master
chdir /Users/shigeru/projects/buildbot-sample/master
creating master.cfg.sample
populating public_html/
creating Makefile.sample
creating database
buildmaster configured in /Users/shigeru/projects/buildbot-sample/master

設定ファイルや起動スクリプトなどが生成されます。 master の中を見てみましょう。

(buildbot-sample) $ ls master/
Makefile.sample  buildbot.tac     master.cfg.sample       public_html/     state.sqlite

設定ファイルはサンプルになっていますので、 .sample を取り除いたものに変更します。

(buildbot-sample) $ mv master/master.cfg.sample master/master.cfg

このサンプル設定で起動させてみます。 (Pyflakes というツールのレポジトリを監視する設定になっています)

(buildbot-sample) $ buildbot start $VIRTUAL_ENV/master
Following twistd.log until startup finished..
2012-02-02 23:56:01+0900 [-] Log opened.
2012-02-02 23:56:01+0900 [-] twistd 11.0.0 (/Users/shigeru/projects/buildbot-sample/bin/python 2.7.1) starting up.
2012-02-02 23:56:01+0900 [-] reactor class: twisted.internet.selectreactor.SelectReactor.
2012-02-02 23:56:01+0900 [-] Applying patch for http://twistedmatrix.com/trac/ticket/5079
2012-02-02 23:56:01+0900 [-] Creating BuildMaster -- buildbot.version: 0.8.5
2012-02-02 23:56:01+0900 [-] loading configuration from /Users/shigeru/projects/buildbot-sample/master/master.cfg
2012-02-02 23:56:01+0900 [-] configuration update started
2012-02-02 23:56:02+0900 [-] setting database journal mode to 'wal'
2012-02-02 23:56:02+0900 [-] Using SQLite Version (3, 7, 5)
2012-02-02 23:56:02+0900 [-] twisted.spread.pb.PBServerFactory starting on 9989
2012-02-02 23:56:02+0900 [-] Starting factory <twisted.spread.pb.PBServerFactory instance at 0x107f08488>
2012-02-02 23:56:02+0900 [-] adding new builder runtests for category None
2012-02-02 23:56:02+0900 [-] trying to load status pickle from /Users/shigeru/projects/buildbot-sample/master/runtests/builder
2012-02-02 23:56:02+0900 [-] no saved status pickle, creating a new one
2012-02-02 23:56:02+0900 [-] added builder runtests in category None
2012-02-02 23:56:02+0900 [-] setBuilders._add: [<buildbot.process.botmaster.BuildRequestDistributor instance at 0x107cf6950>, <BuildSlave 'example-slave', current builders: >] ['runtests']
2012-02-02 23:56:02+0900 [-] adding IStatusReceiver <WebStatus on port tcp:8010 at 0x107d43128>
2012-02-02 23:56:02+0900 [-] buildbot.status.web.baseweb.RotateLogSite starting on 8010
2012-02-02 23:56:02+0900 [-] Starting factory <buildbot.status.web.baseweb.RotateLogSite instance at 0x107f590e0>
2012-02-02 23:56:02+0900 [-] Setting up http.log rotating 10 files of 10000000 bytes each
2012-02-02 23:56:02+0900 [-] WebStatus using (/Users/shigeru/projects/buildbot-sample/master/public_html)
2012-02-02 23:56:02+0900 [-] removing 0 old schedulers, updating 0, and adding 1
2012-02-02 23:56:02+0900 [-] adding 1 new changesources, removing 0
2012-02-02 23:56:02+0900 [-] gitpoller: using workdir '/Users/shigeru/projects/buildbot-sample/master/gitpoller-workdir'
2012-02-02 23:56:02+0900 [-] gitpoller: initializing working dir from git://github.com/buildbot/pyflakes.git
2012-02-02 23:56:02+0900 [-] configuration update complete
The buildmaster appears to have (re)started correctly.

マスターが起動すると、プロセスIDが書かれたファイルとログファイル、 レポジトリをポーリングする作業用ディレクトリ、それからテストディレクトリが生成されます。

(buildbot-sample) $ ls master/
Makefile.sample    gitpoller-workdir/ master.cfg         runtests/          twistd.log
buildbot.tac       http.log           public_html/       state.sqlite       twistd.pid

マスターの情報は HTTP で閲覧できます。 master.cfgbuildbotURL というパラメータを確認します。

(buildbot-sample) $ grep buildbotURL master/master.cfg
# the 'buildbotURL' string should point to the location where the buildbot's
c['buildbotURL'] = "http://localhost:8010/"

Webブラウザで確認すると、以下のように表示できるはずです。

スレーブノードを作成する

次に、スレーブを設定します。 まずはスレーブ用のソフトウェアをインストールします。 (buildslave というコマンドがインストールされます)

(buildbot-sample) $ pip install  buildbot-slave

スレーブからマスターに接続します。 ユーザー名とパスワードは master.cfg に書かれているものに揃えます。 まずは確認しましょう。

(buildbot-sample) $ grep "'slaves'" master/master.cfg
# The 'slaves' list defines the set of recognized buildslaves. Each element is
c['slaves'] = [BuildSlave("example-slave", "pass")]

続いて buildslave コマンドでディレクトリを作成し、接続します。

(buildbot-sample) $ buildslave create-slave slave localhost:9989 example-slave pass
mkdir /Users/shigeru/projects/buildbot-sample/slave
chdir /Users/shigeru/projects/buildbot-sample/slave
mkdir /Users/shigeru/projects/buildbot-sample/slave/info
Creating info/admin, you need to edit it appropriately
Creating info/host, you need to edit it appropriately
Not creating info/access_uri - add it if you wish
Please edit the files in /Users/shigeru/projects/buildbot-sample/slave/info appropriately.
buildslave configured in /Users/shigeru/projects/buildbot-sample/slave

(buildbot-sample) $ buildslave start $VIRTUAL_ENV/slave
Following twistd.log until startup finished..
2012-02-03 00:21:49+0900 [-] Log opened.
2012-02-03 00:21:49+0900 [-] twistd 11.0.0 (/Users/shigeru/projects/buildbot-sample/bin/python 2.7.1) starting up.
2012-02-03 00:21:49+0900 [-] reactor class: twisted.internet.selectreactor.SelectReactor.
2012-02-03 00:21:49+0900 [-] Starting BuildSlave -- version: 0.8.5
2012-02-03 00:21:49+0900 [-] recording hostname in twistd.hostname

The buildslave took more than 10 seconds to start, so we were unable to
confirm that it started correctly. Please 'tail twistd.log' and look for a
line that says 'configuration update complete' to verify correct startup.

マスターとスレーブのログを見ると、お互いを認識できていることが分かります。

(buildbot-sample) $ tail {master,slave}/twistd.log
==> master/twistd.log <==
2012-02-03 00:11:03+0900 [-] gitpoller: no changes, no catch_up
2012-02-03 00:16:02+0900 [-] gitpoller: polling git repo at git://github.com/buildbot/pyflakes.git
2012-02-03 00:16:04+0900 [-] gitpoller: no changes, no catch_up
2012-02-03 00:21:02+0900 [-] gitpoller: polling git repo at git://github.com/buildbot/pyflakes.git
2012-02-03 00:21:06+0900 [-] gitpoller: no changes, no catch_up
2012-02-03 00:22:19+0900 [Broker,0,127.0.0.1] slave 'example-slave' attaching from IPv4Address(TCP, '127.0.0.1', 58503)
2012-02-03 00:22:19+0900 [Broker,0,127.0.0.1] Starting buildslave keepalive timer for 'example-slave'
2012-02-03 00:22:19+0900 [Broker,0,127.0.0.1] Got slaveinfo from 'example-slave'
2012-02-03 00:22:19+0900 [Broker,0,127.0.0.1] bot attached
2012-02-03 00:22:19+0900 [Broker,0,127.0.0.1] Buildslave example-slave attached to runtests

==> slave/twistd.log <==
2012-02-03 00:21:49+0900 [-] twistd 11.0.0 (/Users/shigeru/projects/buildbot-sample/bin/python 2.7.1) starting up.
2012-02-03 00:21:49+0900 [-] reactor class: twisted.internet.selectreactor.SelectReactor.
2012-02-03 00:21:49+0900 [-] Starting BuildSlave -- version: 0.8.5
2012-02-03 00:21:49+0900 [-] recording hostname in twistd.hostname
2012-02-03 00:22:19+0900 [-] Starting factory <buildslave.bot.BotFactory instance at 0x105243878>
2012-02-03 00:22:19+0900 [-] Connecting to localhost:9989
2012-02-03 00:22:19+0900 [Broker,client] message from master: attached
2012-02-03 00:22:19+0900 [Broker,client] SlaveBuilder.remote_print(runtests): message from master: attached
2012-02-03 00:22:19+0900 [Broker,client] Connected to localhost:9989; slave is ready
2012-02-03 00:22:19+0900 [Broker,client] sending application-level keepalives every 600 seconds

Webブラウザでマスターを確認すると、スレーブノードが増えています。

ビルドを実行する

Webブラウザの方からスレーブノードを選択して辿って行くと、ビルドできるようになっています。 実際にビルドしてみると、右のスクリーンショットのような結果を得られます。 (よく分からない場合は、リンクをぽちぽちとクリックしてみましょう)

それぞれのステップの標準出力などは記録されており、後からすべてを確認できます。

これでセットアップと動作確認は終わりました。 プロジェクト個別の設定は、プロジェクトサイトにあるドキュメントを参照してください。

終わりに

ソフトウェアを開発する上で、CI (Continuous Integration) をサポートするツールも使えた方が良いことは間違いないでしょう。 しかし、ソフトウェアの依存性が複雑だったり、対象とするツールの範囲が広いことなどもあり、 導入するにはそれなりに知識が必要なだったりもします。

それでは専任のビルドスレーブな人を育成しましょう、という流れもあるかもしれませんが、 チーム開発における CI は個々のチームメンバーの理解があってこそです。 知識は勉強すれば何とかなりますが、ツールを導入することによってどのような効果が見込めるのか? という部分を共有できるか否かが一番の肝だったりします。

このため、トップダウンで開発手法を改善しても早晩に形骸化してしまうのかな、と。

Buildbot はマルチプラットフォームに対応するソフトウェアの CI には良い選択肢だと思いますが、 そもそもそんなソフトウェアが多くはないかもなぁ〜というのが、没ネタにした理由です。 とりあえずは Jenkins を導入した方が管理やメンタルモデルの適応は簡単そうです。

あと蛇足になりますが、Buildbot は低レイヤーで Twisted を使っています。 Twisted に関してはこの辺を参考にしてください。

コメントを投稿