ikeike443のブログ

ソフトウェアビジネスに関心がある系のブログ

Jenkins(カエル本)に寄稿しました

じっくり読んでいたらすっかり遅くなってしまいました。。

Jenkins

Jenkins

寄稿しました

去る2月22日にオライリー・ジャパンさんから発売された『Jenkins』(通称カエル本)に、縁あって寄稿させていただきました。
”付録B プラグインの開発”という記事です。
帯にも記載されているとおり、Play! frameworkプラグインを例にして、プラグイン開発について簡単なチュートリアルを書かせてもらいました。


正直、Playみたいな(新しいけど)マイナーなフレームワークを題材にしていいんですか、という疑問があって、お話をくださった訳者の玉川さんには何度か確認したのですが、ぜひPlayで、とのことだったので、思い切って書かせていただきました。
ぜひ、手にとってお確かめください!

Jenkins

Jenkins

初心者から上級者までカバーする決定版

さて、この本は、先に出版された技術評論社さんの『Jenkins実践入門』と比較すると、中級者むけのやや難しい本、という紹介がされているようです。
ですが、私はそうは思っていません。
確かに、第2章の初めの一歩という章でいきなりMavenとGitが出てくるのは、日本のIT業界の現状を考えると厳しいかも知れませんが、インストールの仕方について説明は書いてありますし、Jenkinsを手にとって読もうと考えるような人(プロジェクトのリーダーだったり、ライブラリアンだったりリリースマネージャーだったりする人)であれば、仮にMavenやGitに馴染みがなくても、何とかできると思います。


この本は、初めてJenkinsに触れようとしている方や、継続的インテグレーションって聞いたことあるけどなんのことだっけ、という方のために、まず第1章でJenkinsと継続的インテグレーションについての概説から説き起こしてくれます。
目次についてはこちらを参照してください。(目次タブをクリック)

とりあえずJenkinsについて知りたい人は第2章まで、さらに第6章まで読めばかなり分かる

続く第2章ではとりあえずJenkinsをクイックに起動して一通り試してみるための方法について触れています。第3章では、各種OSにおけるJenkinsのインストールの仕方、Apacheのリバースプロキシの設定の仕方、TomcatなどJEEアプリケーションサーバでの動かし方、といったサーバの設定にもページを割いて丁寧に説明しています。
第4章ではJenkinsのシステム設定について、第5章ではビルドジョブの設定、第6章では自動テストの設定の仕方、コードカバレッジをとる方法、JMeterを使ったパフォーマンステストなどについて詳しく丁寧な解説があります。


初めてJenkinsに触れるという方は、第2章まで読めば、とりあえずJenkinsを動かして、一通りの流れを試すことが出来ます。まず概要を掴むには第2章までで充分です。
さらに第6章まで読めば、サーバのセットアップからビルドジョブの設定、自動テストのやり方までひと通り学ぶことが出来ます。
このように、ステップバイステップでJenkinsに慣れていくことが出来るように書かれています。
かなり丁寧に書かれているので、この本を読みながら設定すれば、きっと動かすことが出来るはずです。

セキュリティについての第7章、通知のバリエーションについてやたら詳しくなれる第8章

さらに、第7章ではセキュリティ、ユーザー権限管理についても詳しく説明があります。大きな組織でテストやリリースを管理されている場合、この章はかなり役立つのではないでしょうか。
第8章ではメールやIRCなどによる、ビルド結果の通知について掘り下げています。このあたりからこの本は少しずつマニアックな面を見せてきます。メールで使える変数の解説はもちろん、デスクトップ通知やSMSへの通知について触れ、ビルドラジエータという概念についても説明し始め、さらにはSoundsプラグインやSpeaksプラグインを使って、ビルド結果を音を鳴らしたり、コンピュータにしゃべらせて通知するなんていう方法も教えてくれます。(こんなの知らなかった。。)
さらに、XFDについても触れていて、お約束のNabaztagをフィーチャーしています。
Jenkinsによってテストやビルドを自動化していても、成功や失敗の事実をきちんと人間がキャッチできなければ意味がありません。
通知について1章を割いて熱く語るのもわかるなー、という感想をもちました。
特に、成功ビルドや失敗ビルドをまとめてメンバーの眼を引くような場所に(大型ディスプレイなどに)映しだしておく、というビルドラジエータという方法はいいなあと思いました。

徐々に高度に:ビルドプロモーション、分散ビルド、継続的デリバリ

第9章でCheckStyleFindbugsといった静的解析ツールについて触れ、Sonarとの統合について説明した後、さらに高度な内容の説明に入っていきます。第10章ではパラメータ化ビルドジョブやマルチ構成ビルドジョブについての詳説、並列ビルドやビルドパイプライン、ビルドプロモーションといった本当に高度な、しかし大きなプロジェクトを成功させようと思ったら必ず必要になる知識が山盛りになっています。
第11章はJenkinsの分散ビルドについて詳しく知ることが出来ます。EC2プラグインや、CloudBeesのDEV@Cloudについても説明があります。プロジェクトが成長してスローテスト問題が顕在化してくると、複数ノードを使った分散ビルドを検討するようになります。分散ビルドがかなりイージーにセットアップ出来るのもJenkinsの特徴ですよね。
第12章ではさらに一歩進んで、デプロイの自動化と継続的デリバリについて触れられています。Mavenリポジトリへのデプロイや、アプリケーションのデプロイについて触れています。デプロイで問題になるのはアプリケーションの更新よりもデータベースの更新(スキーマの変更や出荷データの更新)だと思いますが、このあたりは軽く触れられているだけで、まだまだこれからの分野なのかな、と思わせます。継続的デリバリについてはそれだけで一冊本があるくらいですしね。。

メンテナンスについてもフォローしてるよ

この本が素晴らしいのは、第13章でJenkinsのメンテンナンスについてもきちんと目配せしていることです。ディスク使用量の監視やバックアップの仕方、ビルドジョブの移行(別のJenkinsインスタンスへビルドジョブだけを移行する)についても触れています。これは長期間継続的にJenkinsを使っていると必ず問題になるところです。
メンテナンスまでしっかりフォローしているのは本当にさすがという感じです。

付録までついてお腹いっぱい

さらに、付録AではMavenとAntで自動テストを書く方法、付録Bではプラグインを書く方法(僕の記事!)までフォローされていて、本当にお腹いっぱいになります。

Jenkinsについてのバイブル

Jenkinsを初めて使おうとしている人から、今使っている人まで、全てのJenkinsユーザーが常に傍らに常備しておくべきバイブル、それがこの『Jenkins』という本だと思います。


というわけでみなさん、今すぐ買いましょう!

Jenkins

Jenkins

Titanium Mobile + Jasmine + Jenkins でiPhoneアプリの自動テスト組んでみたよ

Jenkins Advent Calendar jp 2011の3日目です。


Titanium Mobile + Jasmine + Jenkins でiPhoneアプリの自動テスト組んでみた、っちゅう話をします。


本当はプラグインを作りたかったんですが、そこまで行かなかったので(言い訳だよ!)、せめて自動テストをどう組んだかの話をしますね。


Titaniumの自動テストを組みたい

最近Titanium Mobileを使ってiPhoneアプリなど作ってます。
f:id:ikeike443:20111202213606p:image
Titanium Mobileについてはもう説明もいらないと思いますが、Javascriptを使ってスマートフォンアプリ(特にiPhoneandroid)を開発することができるプラットフォームですね。


で、Jenkins野郎な私としては、Titaniumでも自動テストを組みたいんですよね。
Javascriptでテストってどう書くんだろう。


ふむふむ、色々あるね。


TitaniumにもDrillbitっていう組み込みのテストフレームワークがあるらしい。
http://developer.appcelerator.com/doc/mobile/drillbit
http://wiki.appcelerator.org/display/guides/Writing+Unit+Tests+with+Drillbit

でも、なんか動かないって言ってる人多いし、もうすこしメジャーっぽいテストフレームワークのほうがいいな。。
node.jsのテストも書かないといけないので、同じフレームワークを使えたほうがうれしいってのもあるし。


Jasmine可愛い

Jasmine
個人的にはこっちが本命。明確に RSpec-inspired.
Pivotal Labs がメンテナンスをしている。実はこれすごく重要。なぜなら JsUnit も pivotal/js-spec-server - GitHub も関係している Pivotal Labs があえて新しい JavaScript Testing Framework を作っているのだ。これが良くなくて一体何が良いのだ。
また、relevance/blue-ridge - GitHub というかなり気合いの入った Framework も今は「もうやらないから Jasmine 使え」って言ってるくらいなんだから、本命中の本命と言っていいと思う。
Pivotal Labs の名前を意識するようになったのはE和さんの中で流行っているという話を聞いてからだけど、jsUnit 自体は以前から知っていたので、これは正直期待しちゃうってもんだ。
http://aligach.net/diary/20101205.html

Jasmineよさそうじゃね。BDDってなんか濁点多くてカッコいいし、Pivotal Trackerも好きだし、よさそげ。


Jasmine
f:id:ikeike443:20111202212651p:image
花が可愛い。これにしよう。これにするよ!


jasmine-titaniumがあるよ!

既にjasmine-titaniumっていう素敵なものを書いてくれてる方がいました。ありがとうございます。
これでTitaniumをJasmineでテストすることができます。
でもこのままだと、テスト結果をコンソールに吐くか、
f:id:ikeike443:20111202213609p:image
iPhoneエミュレータで見るか、
f:id:ikeike443:20111202232709p:image
しかありません。
コンソールは見づらいし、iPhoneエミュレータは面白いけどCI向きじゃない。
さらに、エミュレータの場合、内部的にはWebViewを使ってHTMLを表示しているだけなせいか、requireが動かんのですよね。。そもそもテストが実行できないし!*1
もう一歩踏み込みたいです。やっぱりJenkins野郎としてはsurefireを吐かせてJenkinsにテスト結果を集計させたいですよね。


JasmineはReporterを別途定義してやることでテスト結果を差し替えられるので、surefireを吐くReporterを書いてやればいいよね。
っと思ってたら、jasmine.titanium.JUnitXmlReporter.jsってのが既にあったよ。すごいね世界って。
https://github.com/sgrimault/jasmine-titanium-reporters


jasmine-titaniumとjasmine.titanium.JUnitXmlReporterをつなげてみたよ

というわけで、つなげてみた。
https://github.com/ikeike443/jasmine-titanium


下記を修正した感じです。
https://github.com/ikeike443/jasmine-titanium/commit/dbde36696337a88ab074f039052916a6d5e7f86d

  • Reporterを足してオプションを増やしました。
  • libをTi.includeするのをやめました。specからrequireしてしまえばいいので。っていうかincludeすると名前空間が混ざってしまって困るです。
  • ライセンス関係の表記の仕方ってこれでいいんだっけ。。(プラグイン化するときにちゃんとします。。)


使い方は本家jasmine-titaniumとほぼ同じなんですが、ちょっとだけ違います。

まず、Titaniumのプロジェクトを作って、下記のようにして、vendor以下にjasmine-titaniumをcloneし、できたディレクトリの中に入って、.gitmodulesに定義されたsubmodule(jasmine自体とのリンクが貼ってある)のアップデートをします。

cd Resources
mkdir spec vendor
cd vendor
git clone https://github.com/ikeike443/jasmine-titanium.git
cd jasmine-titanium
git submodule init
git submodule update

次に、Titaniumプロジェクトのルートに.gitmodulesファイルを作り、下記のように保存します。要は、今度はアプリのプロジェクトとjasmine-titaniumのリンクを作るわけです。

[submodule "jasmine-titanium"]
        path=Resources/vendor/jasmine-titanium
        url=git://github.com/ikeike443/jasmine-titanium.git

テスト書くよ

さて、準備ができたのでテスト書きましょう。
テスト対象として、下記のようなコードがあったとします。

//db.js
(function() {
    exports.dbutil = function() {
        var self = this;
        self.dbName = 'hoge.db';
        self.getName = function(){
            return self.dbName;
        };
        self.open = function () {
            self.db = Titanium.Database.open(self.dbName);
        };

        self.close = function () {
            self.db.close();
        };
})();

こいつのテストをspec以下に書きます。

//db_spec.js
describe("db", function() {
  var db;
  var dbutil;
  beforeEach(function() {
        db = new (require('models/db').dbutil);
  });

  it("name should be hoge.db", function() {
    expect(db.getName()).toEqual('hoge.db');
  });
});

とりあえずDB名があってるかどうかのテストを書いて見ました。
jasmineのテストは書き方がわかりやすくていいですね。


さて、ここまでできたらJenkinsの設定をしましょうぜ!


Jenkinsの設定しましょうぜ!!

フリースタイルのジョブを作って、バージョン管理からGitを選択(Gitプラグインは入ってますよね!)。
f:id:ikeike443:20111202213610p:image
Gitじゃなくてももちろんいいんですが、今回はGit前提で話を進めます。


次に、ビルド「シェルの実行」を選んで下記を設定。

git submodule init
git submodule update
cd Resources/vendor/jasmine-titanium
git submodule init
git submodule update
cd ../../
python vendor/jasmine-titanium/script/specs.py -r jenkins

さっき作った.gitmodulesの設定をもとに、submoduleを更新してやってから、specs.pyを実行します。
なんかcdを繰り返しててダサいですが気にしない。


さあ実行ですよ! えぃ!
f:id:ikeike443:20111202213611p:image


iPhoneエミュレータが立ち上がったよ! うまく行ったっぽい!
f:id:ikeike443:20111202213612p:image



さて、テスト結果は集計できてるでしょうか。。
f:id:ikeike443:20111202231318p:image
おおっ


f:id:ikeike443:20111202231315p:image
おおおっ


f:id:ikeike443:20111202231316p:image
おおおおっっ


f:id:ikeike443:20111202231317p:image
おおー。出来てるじゃん!


まとめとお断り

というわけで、jasmine-titaniumとJenkinsを使ってiPhoneアプリのCI環境をちょろっと作って見ました。
プロビジョニングファイルのインストールとか、AppStoreへの申請とか、CIとして整備したいことはまだまだありますが、まずはテストを自動化することが出来ました。


尚、今回紹介したこの方法はまだ全然荒削りです。例えばエミュレータのプロセスをちゃんと殺してないので、自動テストの実行後、エミュレータは上がりっぱなしです。。(えー。。)
設定も色々面倒臭いので、もう少し時間をとって、プラグイン化するところまで行きたいなーと思います。


ともあれ、今回は、Titanium+Jasmine+JenkinsでiPhoneアプリを自動化するよ! の巻でした。


次のJenkins勉強会までにはプラグイン化してしましたいですね。本家本元の@masuidriveさんはRubyでTitanium-Jenkinsプラグインを書いてるという噂も聞くので、そっちの方がすごいものになってるとは思いますが。。


さて、明日は@linoさんです。Jenkins実践入門の作者ならではの話を期待してます!!

*1:ブラウザ上でTitaniumのrequireと同じ挙動をするrequireの実装があったら教えて欲しいです。。Require.jsはうまく行かなかった。。

The JenkinsPluginTotallySimpelGuideの翻訳(意訳) #jenkinsja

Jenkinsの公式Wikiに、The JenkinsPluginTotallySimpelGuideという、Jenkinsプラグイン開発入門に良さげな記事があったので、取り急ぎ翻訳してみました。

かなり適当に意訳しました。
下記に公開しておくのでご参考程度に。
https://www.evernote.com/shard/s18/sh/ca603adc-3200-45e3-aac2-6244fe8ae400/69be9f6c1a773383136e48cfd33440cc

※後ほどJenkins日本語Wikiに転載します

Jenkins plugin for Playframeworkをアップデートしました

Jenkins plugin for Playframeworkを0.0.5にアップデートし、先ほどJenkinsのリポジトリにアップロードしました。
おそらく数日中にみなさんのJenkinsからインストール出来るようになると思います。

アップデート内容

従来Playframeworkのパスの設定は、Jenkins全体で一つしか持てませんでしたが、これをジョブごとに変更できるようにしました。

経緯とか以下雑記

Jenkins plugin for Playframeworkをリリースしてから、大分放置してたのですが、なんだか最近このプラグインに対する質問が、TwitterやGithub上で少し来るようになっていました。

Playframeworkのユーザーが増えてる感じがあり、嬉しい限りですね。

特に多かったのが、ジョブごとにPlay!のバージョンを変えたいというニーズで、そうだよなあと思いつつ、なんとなく手を付けてなかったのですが、先日、ついにpull requestが来ました。

pull requestを送ってくれたのはCloudbeesに所属している@IvanMeredithさん。

IvanはPlayframeworkをCloudbeesにデプロイ出来るようにするプラグインなんかも書いてて、Cloudbeesのサイトにこんな記事も書いてます。

なぜだかとってもPlayframeworkが好きらしい。Cloudbees内部でも彼の周りの何人かはPlayframeworkにいれこんでいるという話。いいですなー。


っちゅうわけでよければ使ってください。


…そういえばIvanからplay-cloudbeesを使ったレポートをブログに書いてよ、って言われてたような気もするけど、アレどうなったんだっけ。。

第二回Jenkins勉強会でLTしてきました

PlayframeworkとJenkinsについてしゃべってきました。
LTって初めてで、5分で終わるかと思ったら終わりませんでした。。
よかったら下記から見てみてください。

Playについての詳細な内容についてはまた別途ブログに書こうと思います。

もっとPlayframeworkについて話す機会がほしいなあ。。
JGGUGid:kiy0takaさんにPlayのユーザーグループ作れば、みたいなことも言われたんですけど、仲間が全然いない。。
JGGUGに混ぜさしてもらってしゃべる機会がほしいなー。。

懇親会ではid:kkawaさん、T4Jの@yusukeyさんや@fujibeeさん、さぼてんまんさんとお話できてよかったです。

ではまた。