2013年2月27日水曜日

[Jenkins] ノードやラベルを指定して実行する

標準的な Jenkins の設定ページでは、
「実行するノードを制限」にチェックを入れて、ラベル式を指定することでノード制限をかけれました。

しかし、同じラベルがついているノードでも、
特定のノードでしか発生しない失敗が出ることがあります。

その場合、設定画面で逐一設定を変更する必要がありました。

NodeLabel Parameter Plugin という選択
NodeLabel Parameter Plugin を使うことで、ノードやラベルをパラメータとして扱うことができるようになります。

設定方法

プロジェクトの設定ページを開き、「ビルドのパラメータ化」をチェックします。
NodeLabel Parameter Plugin をインストールしたことで、「パラメータの追加」に「Node」と「Label」が追加されています。


こちらを選択して各々設定をします。

Node の場合
デフォルトノードと実行を許可するノードを設定します。
(許可ノードを飛び飛びで複数選択する方法がわからない・・・)


設定を保存し、プロジェクトを実行すると以下のような選択ページが出ます。


ここで、実行させたいノードを選択し「ビルド」ボタンを押すだけです。

Label の場合

ラベルの場合は、デフォルトのラベル式を設定します。

プロジェクトを実行すると、以下のようなテキストボックスが出るので


デフォルト以外で実行したい場合は、ここを編集して「ビルド」ボタンを押します。

注意点
どちらも「実行するノードを制限」を上書き動作するみたいです。(試してみた感じ)
あとは、「Node」と「Label」両方設定した場合に、「Label」設定が優先されるっぽい。(そんな気がする)




何はともあれ、jenkins がどんどん便利になりますね。

2013年2月22日金曜日

[Visual Studio]コードを修正せずに変数の値をログ出力する方法

ふとした時に変数の値がどのようになっているか、確認したいことってありますよね。

おそらく皆さんブレークポイントを設置して、
停止した状態でローカルウィンドウやウォッチウィンドウを見て確認するのではないでしょうか。


だけど、止めずに確認したい時もありませんか?
一時的な値ではなく変化を知りたい時はありませんか?

そんな時は printf 追加してプリントデバッグ!
という方法もありますが、再ビルドが必要なので時間がかかってメンドクサイです。

そこで、Visual Studio でソースを変更せずブレークポイントで停止させることもなく(※)、変数の値を出力させる方法を紹介します。(※ 内部的には停止している)

サンプルプログラム
int factorial(int n)
{
    if( n == 0 ) return 1;
    n = n * factorial(n-1);
    return n;
}
int main(int, char**)
{
    return factorial(10);
}
今回はこのコードの
return n;
のとこでの変数 n の値を出力します。

設定
まずは、ブレークポイントを設置します。

次に、ブレークポイントの赤いマークを右クリックすると、
コンテキストメニューに「ヒット時(W)...」メニューがでるので選択します。


クリックするとダイアログが出るので、そちらの「メッセージを表示する(P)」にチェックを入れます。
下のエディットボックスに、ブレークポイントにヒットしたときに出力する文字列を入力します。


こちらには、通常の文字列以外に
{x}式評価(中括弧の中に式)
$ADDRESS現在の命令アドレス
$CALLER呼び出し元関数名
$CALLSTACK呼び出し履歴
$FUNCTION現在の関数名
$PIDプロセスID
$PNAMEプロセス名
$TIDスレッドID
$TNAMEスレッド名
が使用できるようです。

今回は変数 n の値が知りたいので、
{n}
と入力しました。

「続けて実行する(C)」にはチェックを入れておいてください。
これにチェックを入れておくと、ブレークポイントにヒットしても停止せずそのまま継続してくれます。

設定は以上です。
実行した結果がこちらになります。


ブレークポイントには他にも色々設定できるので試してみてください。
それでは!


2013年2月18日月曜日

[Jenkins] DNS MultiCast を停止する方法

なぜかJenkinsを起動させたらパケットロスが多発しまくったのを無理やり直した話

きっかけはこちらの記事。
(Jenkins には Auto-discovering という機能があるそうです。)

Jenkins が原因で社内ネットワークが重たくなるという現象が起こっていたため対応することになり、
色々手こずったのでメモを残しておきます。
(※結論だけ知りたい方は下のほうだけ見れば OK です。)

Jenkins システムの設定
とりあえず、システムの設定画面にはなさそう…
PC の設定でブロックするようにできないか試してみることにしました。

パケットフィルター
iptables
Windows で Jenkins を動かしているので、iptables は使えない。

netsh routing ip
netsh routing ip add filter ~で、フィルターかけられるという情報を見つけたが、
Windows 7 では使えなかった…
(XP ならできるみたいだけど…)

ファイアーウォール
ファイアーウォールの「送信の規則」を設定したらできると思って試すもうまくいかず…

設定の仕方が悪いのだろうけど、調べる時間もあまりないので
原点に戻って Jenkins 側で制御できないか再調査することにしました。

Class DNSMultiCast
Jenkins の API ドキュメントを探してたら、まさに!なクラスを発見! DNSMultiCast

"DNSMultiCast Jenkins" で検索したらそれらしい情報がいっぱい出てきた!

日本Jenkinsユーザー会 | Google Groups
Jenkins users - How to use -dhudson.DNSMultiCast.disable and ...

DNS MultiCast を停止する方法
DNS マルチキャストを無効にするには、Jenkins の起動時に
-Dhudson.DNSMultiCast.disabled=true
を指定するようです。
詳しくは Jenkins 公式の Features controlled by system properties を見てください。

実際に試して見ました。

もちろん、見た目に変化はありません。
設定が反映されているかスクリプトコンソールを使って確認します。
スクリプトコンソールを開いたら
println(hudson.DNSMultiCast.disabled)
と入力し、実行します。

ちゃんと disabled が true になりました。

これで、UDP マルチキャストが停止するはずです。