@kotyのブログ

.NETとかJavaとかPythonとか勉強会のこととかを、田舎者SEがつづります。記事のライセンスは"CC BY"でお願いします。

CruiseControl.NET Server

  • Installation
    • インストーラを実行するときに、「nsScm.dll」に問題があるというダイアログをMcAfee VisusScan8.0が出します。

「nsScm.dll」はNullSoft installer for installing servicesから提供されているライブラリです。
インストールを継続する簡単な方法は「CCServiceをインストールする (install CCService)」のチェックを外し、いったんインストールが完了した後にCCServiceを手動でインストールすることです。(訳注:手動でサービスをインストールするのって普通にするんだろうか・・・)

  • Result files
    • テスト結果ファイルはビルドが成功したときに表示され、失敗したときに表示されないのはなぜですか?

ccnet.configファイルにおいて、Merge TaskセクションをTasksブロックからPublishersブロックに移す必要があります。
なぜならTaskセクションにある最初のTaskの失敗は以降のタスクの実行を妨げるかもしれないからです。
もしこのTaskがMerge Taskなら、テスト結果ファイルがビルドに含まれないでしょう。PublishersセクションにあるすべてのTaskは、前のTaskの成否にかかわらず実行されます。

    • CCNetはTaskの実行中にときどきExceptionを発生させます。でもどこでExceptionが発生したのかについての情報がログにありません。たとえばTaskがタイムアウトしたときにこれは起こり得ます。この場合の良い対応策はそれぞれのTaskに対して厳密なタスクレベルのログを指定することです。そのログファイルにおいてMergeに失敗した場合、少なくともMerge前の実際のログは調べることができます。(失敗したタスクからMerge出力するという、前述のFAQも参照してください。)



ProjectA.build。
TargetX。
-l: projecta.targetx.log.xml…。
...


このタスクが失敗すると、CCNetはNAntログファイルにMergeを行いませんが、実行ディレクトリにあるprojecta.targetx.log.xmlを見に行くことで、NAntの生出力を見ることができます。

  • Debugging Server
    • ビルドが失敗しました。なぜだか分かりません。

CCNetはコマンドラインを介して外部のアプリケーションを統合します。したがってCCNetにより実行されるコマンドが正しいことは不可欠です。

  1. 最初にコマンドラインから、ビルドスクリプトを実行することができるかあるいはソース管理システムに接続することができるか検証します。
  2. うまくいっている、あるいはどんなコマンドラインが実行されているか分からない場合は、どんなコマンドを使っているのかをCCNetで知ることができます。

ccnet.exe.config(ccserviceで実行しているならccsrcice.exe.config)を開き、CruiseControlSwitchのトレースレベルを4に増加させます。(訳注:どのセクションか意味不明)
CCNetServerを再起動すると、CCNetServerが使っているコマンドがコンソールウィンドウ(そしてccnet.log)に書き出されます。このコマンドをコンソールウィンドウにコピー&ペーストして直接実行してみてください。

  1. それでもまだどこが問題か分からない場合、あるいはCCNetが作るコマンドが不正だと思う場合は、

1)実行したコマンド
2)その出力
3)ccnet.config
を明記してCCNet user メーリングリストに送ってください。

    • サーバーから提供されるいくつかの情報にアクセスしようとするのですが、できません。どこが間違っているのでしょうか?

ビルドラベルなどサーバからの情報をどのように使うかを示したメーリングリストやユーザのブログの多くの例は、
NAntタスク】および最初のReleaseCandidateからの日付がベースとなっています。
この時期周辺ではほとんどのプロパティ名が変わっています。たとえば"ccnet.label"は"CCNetLabel"に。
あなたが使っているTask(インストールしたCCNetのビルドに対して正確なマシンに理想的にインストールしてある(訳注:←意味不明))のドキュメントをチェックしてみてください。
そしてビルドスクリプトが、そのプロパティに対して正しい名前を使っているか確認してください。

    • ドキュメントによると、xxxxxxxx.yyyというファイルが必要なようです。そのファイルは配布物(訳注:zipのことでしょう)の中にありません。どこにありますか?

ウェブサイトのドキュメントは、最も最近のReleaseではなく最も最近のBuiltバージョンに関連している、という古典的な見落としをしているようです。
あなたがインストールしたCCNetのインストールフォルダの/docフォルダを、ご質問のファイルは参照しているのであれば、
メーリングリストで尋ねてみてください。ドキュメントの問題を発見したかもしれません。
そのフォルダでなく、オンラインのドキュメントを参照しているのなら、より最近のビルドを試してみてください。
最近のビルドを試すことをを選択するなら、CCNetLiveからのビルドがCCNetの公式にリリースされたバージョンより多くのバグを含む可能性があることを意識してください。

    • ビルドが失敗したときに、成功したとCruiseControl.NETが通知するのはなぜですか?

NAntMSBuildさらにはDevenvのような外部ツールを起動したとき、CCNetはそのプロセスが正常終了したか否かの判断をするために
そのツールの戻り値である"ErrorLevel"環境変数を使います。
そのようなツールの大半は、タスクが成功したならゼロを返し、失敗を通知するためにゼロでない値を通常返します。
そしてCCNetはゼロでない値をみつけたとき、そのタスクの失敗を通知します。
もしそのツールが規約を尊重していないなら(例えばMicrosoftのFXCop)、CCNetは不正に失敗(あるいは成功)を通知します。

そのツールがどんなErrorLevelを返しているのかを調べる簡単な方法は下記のようなちょっとしたバッチファイルを使うことです。
VerifyToolReturn.bat
C:\Path\To\Your\Tool.exe -Command -Line -Parameters "As triggered by CruiseControl.Net"
Echo %ErrorLevel%


このバッチファイルをコマンドプロンプトから実行し応答をチェックしてください。
これは、ツールが誤った値を(おそらく)返しているのが問題なのか、CCNetにバグがあるかを確認するものです。

戻り値がゼロでないことを、コマンドプロンプトを使って確認できているにもかかわらず、CCNetで失敗と認識されない、という報告があります。
これは次のようなことで回避可能かもしれません。
1.そのコマンドを単純に実行し、exit %errorlevel%を実行するバッチファイルを作る。
2."cmd /c batch-file"というように、そのバッチファイルを実行するようCCNetプロジェクト(訳注:ccnet.configのことと思われる)を変更する

  • Operation flow of CCNet

厳密な処理順序は以下の通りです。

1)トリガーが起動するのを待つ。
2)最後のビルドからの変更リストをソース管理システムに問い合わせる。
3)変更があったとき、あるいは"force the build"とトリガーが言うとき。
3.1)ビルドのためのラベルを生成する。
3.2)指定された順序でビルド前タスクを実行する。エラーの場合はビルドは失敗する。
3.3)ソース管理システムからソースを取得する。
3.4)指定された順番でビルドタスクを実行する。エラーの場合はビルドは失敗する。
3.5)リポジトリがラベル付けされているなら
3.5.1)ソース管理システムにそのラベルを適用させる(訳注:これって何のこと?)
3.6)publisherタスクを実行する
4)1)に行く

  • The ccnet.config file
    • CCNet serverを開始したときに使っていないノードがエラーしてしまうのはなぜ?

ccnet.configファイルに不正な要素や属性が含まれている場合、この警告が出るかもしれません。
インストール媒体にあるドキュメント(/docフォルダにある)をダブルチェック(訳注:よく見ろ(゚Д゚)ゴルアってこと?)してください。
オンラインのドキュメントは、あなたがインストールしたCCNetよりも最近のバージョンを反映していることに注意してください。
あなたのサーバーのバージョンでは実装されていないタスクやプロパティを使おうとすると、このようなエラーが出るかもしれません。

I get the error "INTERNAL ERROR: ExpandableObjectConverter cannot convert from System.String." when using

Multi source contorol ブロックの内部にsourcecontrolブロックを使おうとすると、このエラーは起きます。
この要素の名前は、あなたがsourcecontrol要素を使うときにtype属性に置くものと同じものの代わりであるべきです。(訳注:意味不明)
詳しい説明や例は【Multi Source Control Block】を参照してください。

    • プロジェクトプロパティは構成内(訳注:ccnet.configファイル内?)の重複を減らすのに使えますか?

NAntMSBuild内で使うプロパティ(例えば$(workingDirectory)はCCNetバージョン1.4RC1以降からサポートされています。
詳しくは【Configuration Processor】ドキュメントを参照してください。
それ以前のバージョンでは、XML DTDエンティティ(例えば&workingDirectory)を使うことで重複を減らすことができます。

  • Using the CCNet Service
    • サービスで起動した場合、私のビルドは環境変数を見つけることができません。手動またはコマンドラインサーバで起動した場合は、うまく動きます。

あなたはおそらくSYSTEMアカウントあるいは、あなたのアカウントとは異なる何らかのアカウントで、CCNetサービスを実行しているのでしょう。
MSWindowsの多くの環境変数は、ユーザーごとに設定されています。これは、あなたと同じ変数をSYSTEMアカウントが持っていないかもしれないことを意味しています。
環境によって、それらの環境変数の定義を「システム全体」に移したいかもしれません。
もうひとつの案は、サービスをあなたのアカウントであるいはCCNet用の独立したアカウントで実行することです
結局NAntのようないくつかのタスクは自分自身のために環境変数を明確に(訳注:誤植explictly→explicitlyか?)作ることができます。
(しかしこれらはほかのCCNetタスクでは通らないでしょう)

    • 私のビルドは失敗するのですが、なぜだか分かりません

1.CCServiceを通してビルドを実行する際のトラブルなら、すべての作業がCCNetコンソールを通して動くことを確認してください。
たいていの場合コンソールアプリケーションは設定やデバッグがより簡単です。
2.コンソール版は動いて、サービスだと動かない場合、ユーザーが直面した共通の問題の解決策についての【CCService】ページを参照してください。

  • Source Control Integration
    • Visual Source Safe
      • なぜCCNetがサービス起動しているときにSourceControlブロックがエラーして、コマンド起動したときにうまく動くのですか?

VSSにアクセスするためには、CCNeサーバーからVSSサーバーの共有フォルダにアクセスできなければなりません。
デフォルトではCCNetサービスはローカルシステムユーザーアカウントを使うよう設定されており、
そのアカウントは他のマシンへのアクセス権を持っていません。(訳注:そうなの?)
CCNetがVSSにアクセスできるために、VSSのマシンにネットワークアクセスできるユーザーに、サービスの起動アカウントを変更しなければいけません。
これより詳細については、【Service】や【Visual Source Safe Source Control Block】セクションを参照してください。

    • All Source Control Packages
      • ビルドプロセスは、ソースコード管理下で1つかそれ以上のファイルを更新しています。

CruiseControl.NETは私のコードが変わったと考え、再びビルドを行います。どうすればこのサイクルを停止できますか?
この問題はビルド用の情報を含んだAssemblyInfo.cs(あるいはそれに似たもの)が更新されることに、たいていは関係しています。
単純な解決策は、これらのファイルがソース管理下に置かれていないことを確認することです。しかし通常はビルド時に生成されています。
不幸にも、これはこの問題を解決する適切な方法ではないかもしれません。
そのような状況では、ビルドプロセス中にそれらのファイルの変更を除外するために、【Filtered Surce Control Block】
を参照すると良いかもしれません。

  • Triggers
    • 手動起動したときのみビルドするようにするには、どうすればいいですか?(訳注:訳自信なし)

空のタグを使ってください。詳しくは【Trigger Blocks】を参照してください。

  • Tasks
    • CCNetにたとえいくつかが失敗したとしてもすべてのテストを実行させたいのですが、どのようにやればいいのですか?

CIの本質のひとつが、ビルドが失敗したことはできる限り早く通知されることです。
これは、【Project Configuration Block】内のセクションのひとつでも失敗をCCNetに通知したら、
CCNetは残りのタスクをスキップしセクションのエントリーを引き続き実行することを意味します。
もし何かより複雑なことをしたいのなら、ビルドタスクを制御するためにNAntMSBuildのようなツールを使うことをお勧めします。
【Using 「CruiseControl.NET」 with NUnit】ページを参照してください。
複数のテストケースを実行するためのNAntNUnitの使い方を示した例があります。

  • Multiple Projects
    • 一度にプロジェクトをひとつだけ、CCNetにビルドさせるにはどうすればいいですか?

【Integration Queues】サポートを使用することができます。ひとつ以上のプロジェクトを同じキューに配置しているのなら、
それらのうちひとつのみが一度に実行されることを、CCNetは確認するでしょう。(訳注:意味不明)