.log

miscellaneous memorandum

Jenkinsは主人も使役する有能な執事

September 13, 2012

さあ、やっとJenkinsにたどり着きました。 といっても、すでにインストールはしてあるし動作も確認しているので、基本的な部分はクリアされています。今回は、CentOSにインストールされているJenkinsをベースにして、.NETのプロジェクトをビルドさせるというところにチャレンジしてみます。

Jenkinsは、インストールされているサーバーだけではなく、他のサーバーやPCなどを使って作業を分散させることができます。Linuxのサーバー上でできる作業はそのままJenkinsの入っているサーバーでやって、.NETのプロジェクトは別のWindows環境の端末でビルド作業などをする、ということができたり、すごく大きくて複雑なプロジェクトだとビルドやら自動テストだけでも時間がかかるので複数の端末で分散して作業をすることができるわけですね。

仮想マシンのLinux上に管理させて、結局ホストマシンのWindowsに戻ってきて作業させる、とか実質的な部分では「人生380度変わりました。ぐるっと回って20度しか変わってないやん」みたいになってますけど、手段のためには目的は問わないのです。

設定

端末間の連携方法はいくつかあるんですが、「JNLP経由でスレーブを起動」する方法が簡単です。 やることといえば、JenkinsのMSBuildプラグインを入れて、[Jenkinsの管理]-[ノードの管理]でノードを追加したあと、画面の指示に従ってslave-agentを起動してやるだけです。後は、ジョブを作るときにMSBuildを指定してあげれば動きます。

引っかかったところ

とりあえず、お約束のごとくslave-agentからJenkinsに接続できないわけです。

こういう指示が出ますので、とりあえず2番目の方法を使ってコマンドラインから

javaws http://192.168.1.105:8080/computer/Windows7/slave-agent.jnlp

とやるんですが、

で、リトライを繰り返した結果……

こうなります。 Linux側でポートが空いてないのでこうなってしまいます。 とりあえずポートを開けてやれば解決するのですが、Jenkinsの初期設定ではポートがランダムに使われてしまいますので固定してしまいます。

[Jenkinsの管理]-[システムの管理]の[セキュリティを有効化]にチェックをすると、ポートを固定する設定が出てきます。

ここで、[JNLPスレーブ用TCPポート番号]を設定できます。 とりあえず適当に9000ぐらいを入れて保存します。

あとはCentOS側で、/etc/sysconfig/iptablesに下記を追加します。

-A INPUT -p tcp -m state --state NEW -m tcp --dport 9000 -j ACCEPT

その後、

/etc/rc.d/init.d/iptables restart

です。

つながりました。心なしか、Jenkins氏もうれしそうです。

接続されていれば、Jenkinsのノード管理のところに×がなくなります。この状態であれば、スレーブの端末側に作業をさせることができます。

スレーブでのビルド

あとは、手順に従ってジョブを作ればいいわけですが、一個気をつけないといけないのは、現在ジョブを実行できるノードはCentOSのmasterとWindows7のslaveの2つなのですが、.NETのプロジェクトについてはslaveだけに作業させる設定をしないといけません。

ノードの設定のところに「ラベル」という項目がありますが、slaveノードのラベル部分になにか入力しておき、ジョブの設定の「実行するノードを制限」(こいつもチェックしないと詳細部分が出てきません)にノードで設定したラベルを入力しておきます。 これをやっておくと、確実にWindows側でジョブが実行されるようになります。

とりあえずソースをSubversionに登録して、Jenkinsからビルド実行してみますと、ちゃんとWindows側の指定したフォルダにソースがチェックアウトされ、ビルドまでされることが確認できました。

あとは、定期的に実行するなり、ソースが更新されたら実行されるようにするなり、MSBuild以外にもバッチファイルを実行したりとかもできますし、もう設定次第で何でもできる状態になりました。

やっと一回りできる状態になりました。

これからは、.NETプロジェクトで自動テストだとかその他諸々をやらせてみるとか、その他の開発環境で使ってみるとか、実際に開発業務を行う上でどう使うのかというあたりに踏み込んでいくことにしようかと思います。

あと、テストケースを管理するところも連携させるようにする方法を考えたいところですね。これだけドキュメント形式でせこせこ書いて更新する、というのもなんかいけてないでしょう。 実際ツールとしては、TestLink(http://testlink.sourceforge.net/docs/testLink.php)というものがあっていろいろ紹介はされてるんですが、なんか仕組みもUIもちょっとめんどくさくて取っつきづらい感じになっていたのであきらめました。 代わりに、同じようなことをするredmine_impasse(https://github.com/kawasima/redmine_impasse)というRedmineプラグインを見つけたので、これは時間を見つけて試したいと思ってます(Redmineのプラグインでうまくいった試しがないので、なんか「今すぐやろう」という気にならない)。