VisualStudioで作成したプロジェクトをCruiseControl.NETを用いてdaily build→Nunitで自動テストしている。ソースコード管理にはsubversionを使っており、ビルドの度に最新バージョンをチェックアウトしている。

導入したもの

CCNETの設定で問題になったこと。

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か)が気にせず読んでくれるのでヨシとする。        
Powered by Google App Engine

このブログ記事について

このページは、tckzが2006年8月22日 23:23に書いたブログ記事です。

ひとつ前のブログ記事は「ペルソナ3 ペルソナ合体検索」です。

次のブログ記事は「USB機器を作る - 思いつき編」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 5.04