CCNETの最近のブログ記事
Cruise Control .NETを使って継続的インテグレーションを始めるにあたり、どうしてもやっておきたかったことがある。
それは、「ビルドの結果をランプを使って目視する」ということだ。というか正直に白状すれば、「ランプで結果を目視」がしたかったから継続的インテグレーションをやってみようと思い立ったのだけど。まさに「本末転倒」「手段が目的になっている」わけだ。でも、なんでもいいんだ、これ面白くない?って言えればw
パトライトの雄姿。
ちょっと緑がまぶしかったので、現在は半透明テープを何重か巻きつけて明るさを抑えてある。
購入したのはパトライト社の「PHE-3FB」。RS232CでPCと接続できる。イーサネットに繋がるモデルもあったけどシリアルインタフェースモデルを選んだ。より安かったので。
同社の通販サイト「ぱっとクル」で購入。大体35000円。
(今改めて確認したら、イーサネットに繋がるモデルしかリストにない・・・・シリアルインタフェースは人気ないんだろうか。)
ランプの点灯・消灯・点滅(あとブザー)に必要なプロトコルの説明が付属していて、プログラムは自分でやってね、という製品。
※使用は自己責任で。何が起こっても作者は責任を負いかねます。
使っているCCNETが未だに1.0.1なので、最新版のCCNETだと動かないかも??
それは、「ビルドの結果をランプを使って目視する」ということだ。というか正直に白状すれば、「ランプで結果を目視」がしたかったから継続的インテグレーションをやってみようと思い立ったのだけど。まさに「本末転倒」「手段が目的になっている」わけだ。でも、なんでもいいんだ、これ面白くない?って言えればw
パトライトの雄姿。ちょっと緑がまぶしかったので、現在は半透明テープを何重か巻きつけて明るさを抑えてある。
購入したのはパトライト社の「PHE-3FB」。RS232CでPCと接続できる。イーサネットに繋がるモデルもあったけどシリアルインタフェースモデルを選んだ。より安かったので。
同社の通販サイト「ぱっとクル」で購入。大体35000円。
(今改めて確認したら、イーサネットに繋がるモデルしかリストにない・・・・シリアルインタフェースは人気ないんだろうか。)
ランプの点灯・消灯・点滅(あとブザー)に必要なプロトコルの説明が付属していて、プログラムは自分でやってね、という製品。
構成を考える
- ビルドサーバはWindowsで、Cruise Control .NETが稼動している。
- ランプのコントロールプログラムはunix上のスクリプトでさらっと書いてさっさと動かしたい。
- tracでプロジェクトwebを運用しているlinuxサーバにシリアルポートがついている。
- cgiはGETでパラメータ指定。
- 赤・緑・黄のそれぞれのランプを、点灯・点滅・消灯の状態にすることができる。
- ブザー制御について、ブザーがけたたましすぎるのと、夜間ビルドで失敗してブザー鳴りっぱなし、というのも困るので実装しない。
- CCNETからcgiの呼び出しは、コマンドラインツールでさくっと実現する。
- 単一のファイルで実行できるcURL.exe for Windowsを使用することにした。
- 「Cruise Control .NETとsubversionで文字化け」のiconv.exeでお世話になったKaoriYa.netにまたまたお世話になります。
- cgiはperlで書き(なんでもいいけど)、シリアルポートへの出力は/dev/ttyS0を用いる。
実装
cgiスクリプト(perl)※使用は自己責任で。何が起こっても作者は責任を負いかねます。
- これを適当なURLで参照できるようにwebサーバ内に配置する。http://サーバ/pat0/のような。
- パラメータは「r」「g」「y」でそれぞれ赤・緑・黄のLEDに対応する。
- 指定できる値は、それぞれ「on(点灯)」「blink(点滅)」「off(消灯)」
- 例:赤だけ点灯=http://サーバ/pat0/?r=on&g=off&y=off
- 例:黄だけ点滅=http://サーバ/pat0/?r=off&g=off&y=blink
- シリアルポートの設定をしていないので・・・
- 事前に設定しておくか、制御コードを追加してください。設定すべき状態はPHE-3FBのマニュアルに書いてある。9600baud
- ここではFedora Core 5を使っているが、デフォルトのままで動くようだ。
- 参照するシリアルポートが/dev/ttyS0固定なので・・・
- 適宜変更するか、コンフィギュレーション可能にしてください。
- /dev/ttyS0はownerがrootでgroupがuucp。otherには読み書き権がないので・・・
- 今にしてみればsuexecを使うかotherにrwを付与すればよかったのかもしれないが、apacheユーザをuucpグループに加えた。
セットアップ
後は、CCNETから呼び出しできるようにccnet.configを設定する。使っているCCNETが未だに1.0.1なので、最新版のCCNETだと動かないかも??
- ビルドタスクの最初にビルド中を表す「黄」点灯状態に。
<tasks> <exec> <executable>pat.bat</executable> <buildArgs>begin</buildArgs> <buildTimeoutSeconds>30</buildTimeoutSeconds> </exec>
- pat.batの中身は以下のとおり。パス/URL関係は環境に合わせて適宜。
@echo off set STATUS="%CCNetIntegrationStatus%" set url=http://linuxサーバ/pat0/? if "%1" == "begin" ( set para="%url%r=off&g=off&y=on" ) else ( if %STATUS% == "Success" ( set para="%url%r=off&g=on&y=off" ) else ( set para="%url%r=on&g=off&y=off" ) ) curl.exe -s %para% > nul
- ビルド結果のpublish時に再度ランプ点灯。
ビルド成功なら緑、ビルド失敗なら赤を点灯させる。状態の判定は、pat.batの中で変数環境CCNetIntegrationStatusを参照して行っている。<publishers> <xmllogger logDir="log" /> <exec> <executable>pat.bat</executable> <buildTimeoutSeconds>30</buildTimeoutSeconds> </exec>
VisualStudioで作成したプロジェクトをCruiseControl.NETを用いてdaily build→Nunitで自動テストしている。ソースコード管理にはsubversionを使っており、ビルドの度に最新バージョンをチェックアウトしている。
導入したもの
subversionリポジトリから最新バージョンを取り出すためにsvn.exeを用いるのだが、環境変数APR_ICONV_PATHに値が設定されていなければならない。この環境変数は上記svn.exeをインストールするとインストーラによって「システムの環境変数」に設定されているのだが、後から起動したサービスには適用されないようだ。一度Windowsを再起動した。
CCNETがsvnを使ってワーキングコピーを最新化する際、↓のようなコマンドラインで実行されるのだが、ログに日本語が含まれると出力内容が文字化けしてしまう。
文字化けするだけならWebダッシュボードのビルドレポートが悲しくなる程度の問題で済むのだが、どうも文字化けの影響でタグの部分が正しく解釈されないケースがあり、well-formedなXMLと判断されないことがある。こうなるとビルドが失敗してしまうので困る。
そこでadhocにsvn.exeの出力を単純にUTF-8→MSKANJIに変換するbatを間に挟むことにした。
encoding="utf-8"なのに実体はMSKANJIなXMLが吐き出されるのはちょっと気持ちが悪いがCCNET(厳密には.NET Frameworkか)が気にせず読んでくれるのでヨシとする。
- NUnit
- http://www.nunit.org/から。
- 今回対象としているプロジェクトは.NET1.1用のため、NUnitも合わせて1.1用をDL
- 今回使用したのは2.2.8
- Nant
- http://nant.sourceforge.net/から。
- 今回使用したのは0.85rc4
- Cruise Control .NET
- http://ccnet.thoughtworks.com/から。
- 今回使用したのは1.0.1
- CCNET Webダッシュボード日本語化も導入した。
- svn.exe(コマンドラインで使えるもの)
- http://subversion.tigris.org/から。
- 今回使用したのは1.3.2
- IIS
- コンパネ→プログラムの追加と削除→Windowsコンポーネントの追加と削除
CCNETサービスからsvn.exeが実行できない
インストール直後につい忘れてしまう。subversionリポジトリから最新バージョンを取り出すためにsvn.exeを用いるのだが、環境変数APR_ICONV_PATHに値が設定されていなければならない。この環境変数は上記svn.exeをインストールするとインストーラによって「システムの環境変数」に設定されているのだが、後から起動したサービスには適用されないようだ。一度Windowsを再起動した。
初回チェックアウトは手作業
これはCCNETのマニュアルに書いてあるが、一度チェックアウトを行って二回目以降は「svn update」で取り出せる状況を作って置かなければならない。svn.exeの出力が文字化けする
ここがハイライト。CCNETがsvnを使ってワーキングコピーを最新化する際、↓のようなコマンドラインで実行されるのだが、ログに日本語が含まれると出力内容が文字化けしてしまう。
svnのパス log リポジトリURL -r "{2006-08-15T06:42:36Z}:{2006-08-22T14:02:39Z}" --verbose --xml --non-interactiveコマンドラインで直接実行してみると、コマンドの実行結果はUTF-8で出力されているっぽい。これをCCNETが読み込む際、「nativeなエンコード(=CP932)→UTF-8?にエンコードを変換しようとして化ける」という流れなのだろう。
文字化けするだけならWebダッシュボードのビルドレポートが悲しくなる程度の問題で済むのだが、どうも文字化けの影響でタグの部分が正しく解釈されないケースがあり、well-formedなXMLと判断されないことがある。こうなるとビルドが失敗してしまうので困る。
そこでadhocにsvn.exeの出力を単純にUTF-8→MSKANJIに変換するbatを間に挟むことにした。
- エンコードの変換にはコマンドライン実行できるiconvを用いた。(この辺unixだと苦労が少ないんだけどなー)
- KaoriYa.netから入手。
- 今回使用したのは「Libiconv DLL 1.10-20060516 for Windows」。このアーカイブに同梱されているiconv.dllとiconv.exeをどこか適当な場所に置く。
- 以下のようなbatファイルを作って適当な場所に置く。
@set SVN="C:\Program Files\Subversion\bin\svn.exe"
@if "%1" == "log" %SVN% %* | iconv.exe -f utf-8 -t MS_KANJI
@if "%1" NEQ "log" %SVN% %*
- パスに空白入っているとダメだけど。ま、環境にあわせてよしなに。
- 「log」以外のサブコマンドの場合は変換していない。その他のサブコマンドの出力はnativeエンコードになるようなので。
- ccnet.configのsourcecontrol要素にsvn.batの所在を指定する。
<sourcecontrol type="svn">
<trunkUrl>リポジトリのURL</trunkUrl>
<executable>svn.batのパス</executable>
</sourcecontrol>
encoding="utf-8"なのに実体はMSKANJIなXMLが吐き出されるのはちょっと気持ちが悪いがCCNET(厳密には.NET Frameworkか)が気にせず読んでくれるのでヨシとする。
