Buildbot はソフトウェア開発におけるチェックアウト、ビルド、テストというサイクルの自動化を支援してくれます。 Python 自体の継続ビルドや、Chronium のビルドツールとして利用されています。
Buildbot の概要についてはこちらの記事にまとめられています。 (実際のコードはちょっと古くなってしまっています)
- Buildbot による継続的インテグレーション - IBM developerWorks
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.cfg の buildbotURL というパラメータを確認します。
(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 に関してはこの辺を参考にしてください。
0 件のコメント:
コメントを投稿