jenkins+play!で気軽にci

65
Jenkins + Play! で気軽にCI!

Upload: takafumi-ikeda

Post on 07-Dec-2014

13.119 views

Category:

Technology


0 download

DESCRIPTION

Jenkins+Play!で気軽にCI第二回Jenkins勉強会5分で終わらなかったLT

TRANSCRIPT

Page 1: Jenkins+Play!で気軽にCI

Jenkins + Play! で気軽にCI!

Page 2: Jenkins+Play!で気軽にCI

自己紹介

● 池田尚史(いけだたかふみ)● Twitter @ikeike443● はてな id:ikeike443● 所属:シャノン● Play!の翻訳協力

(http://playdocja.appspot.com)

Page 3: Jenkins+Play!で気軽にCI

マーケティングSaaSの会社です

● セミナー、イベントに強いです

● デブサミ● Interop● TechCrunchJapan(Teclosion)● 他いっぱい

Page 4: Jenkins+Play!で気軽にCI

本題Jenkins + Play! で気軽にCIするためのプラグインを書きました

その紹介をかねてPlay!のCI事情を話します

Page 5: Jenkins+Play!で気軽にCI

その前に。。。

● Play! Framework って知ってますか?

● 試したことある方いらっしゃいますか?

● ツール、プロダクトを実装してリリースまでした方いらっしゃいますか?

Page 6: Jenkins+Play!で気軽にCI

● JavaをLLっぽく使うWebフレームワーク● Railsライクなフルスタック● 100% no XML● ServletもJSPも捨てちゃった*● RESTfulなAPIを書くのがとっても楽

Play! って?

Page 7: Jenkins+Play!で気軽にCI

っていうか、Play!と言えば。。。

Page 8: Jenkins+Play!で気軽にCI

ですよねー

Page 9: Jenkins+Play!で気軽にCI

でも今日はScalaの話はしません

Page 10: Jenkins+Play!で気軽にCI

Jenkins+Play!のCI事情の話をします

Page 11: Jenkins+Play!で気軽にCI

● CI目線で見たPlay!のいいところ悪いところ

● JenkinsをPlay!に統合するときどこが問題になるか

● 埋めるためにどんなプラグインを書いたか(書いているか)

あじぇんだ

Page 12: Jenkins+Play!で気軽にCI

● 単体テスト、結合テスト、受け入れテストを設定無しでさくっと書ける

● Coberturaプラグインでカバレッジも計測できる

● テストにおけるDBの扱いがCool● Fixtureもあるよ

Play! のいいところ by CI目線

Page 13: Jenkins+Play!で気軽にCI

● Unit Tests– Junitで各クラスを

● Functional Tests– Junit + HttpClient でコントローラを叩いて

● Selenium Test– ビルトインされたSelenium で受け入れテスト

用意されているテスト

Page 14: Jenkins+Play!で気軽にCI

import play.test.*;import org.junit.*; public class MyTest extends UnitTest { @Test public void aTest() { assertEquals(2, 1 + 1); // A really important thing to test } @Test public void testUsers() { assertEquals(3, Users.count()); } }

Unit Test

Page 15: Jenkins+Play!で気軽にCI

import play.test.*;import play.mvc.*;import play.mvc.Http.*;import org.junit.*; public class ApplicationTest extends FunctionalTest { @Test public void testTheHomePage() { Response response = GET("/"); assertStatus(200, response); } }

Functional Test

Page 16: Jenkins+Play!で気軽にCI

#{selenium 'Test security'} // Try to log in the administration area clearSession() open('/admin') assertTextPresent('Login') type('login', 'admin') type('password', 'secret') clickAndWait('signin') // Verify that the user in correctly logged in assertText('success', 'Welcom admin!') #{/selenium}※直接HTMLテーブルを書く方法でもできます

Selenium Test

Page 17: Jenkins+Play!で気軽にCI

$ play test

Page 18: Jenkins+Play!で気軽にCI
Page 19: Jenkins+Play!で気軽にCI

● Coberturaプラグインが用意されています

● 下記のように設定ファイルを書くだけで良い

# The cobertura test coverage module %test.play.tmp=none %test.module.cobertura=${play.path}/modules/cobertura %test.cobertura.silent=false

Coberturaも使えるよ

Page 20: Jenkins+Play!で気軽にCI
Page 21: Jenkins+Play!で気軽にCI

でも悩むのはDBの扱い。。

Page 22: Jenkins+Play!で気軽にCI

インメモリDB使えるよ

● 設定を下記のようにすると、テスト時のみHSQLDBにインメモリモードで接続してくれます

%test.db=mem

● これはとても便利

Page 23: Jenkins+Play!で気軽にCI

DDLは?

● 設定を下記のようにすると、テスト時のみ自動でCreateしてくれます

%test.jpa.ddl=create-drop

● スキーマ情報はモデルクラスにアノテーションを書いて表現します(JPA使ってます)

● 前述のインメモリDBと組み合わせると神

Page 24: Jenkins+Play!で気軽にCI

Fixtureも用意されてるよ!

@Before

public void setUp() {

Fixtures.deleteAll();

Fixtures.load("data.yml");

}

● Yamlでデータを用意して、テストクラスに上記のようにかけばいいです

● Seleniumでも使えます

Page 25: Jenkins+Play!で気軽にCI

要は、

● メモリ上に一時的にDBをCreate

● メモリ上のDBにテストデータを登録

● テストが終わったらDBをデータもろとも捨てる

(Dropいらず)

ということがいとも簡単に実現できる

Page 26: Jenkins+Play!で気軽にCI

とってもテストフレンドリー

Page 27: Jenkins+Play!で気軽にCI

● 依存関係管理の機構がない

● TestsRunnerはブラウザベースアプリとして実装されていて、CIとの親和性が低い

Play! の悪いところ by CI目線

Page 28: Jenkins+Play!で気軽にCI

● ディレクトリ構成がMavenを拒否しているapptestconflibpublic

● 作者のGuillaumeがMaven嫌い。ivy使えよ的な● 尚、Play!の次のリリースからはDependencyコマン

ドが追加されます(内部実装はivy使ってる)

依存関係管理の機構がない

Page 29: Jenkins+Play!で気軽にCI

TestsRunnerがブラウザアプリ

Page 30: Jenkins+Play!で気軽にCI

● ブラウザ立ち上げないといけないし、手動テストじゃね?? 

● Jenkinsで自動実行するの辛くないスか?

● そう思っていた時期が僕にもありました

TestsRunnerがブラウザアプリ

Page 31: Jenkins+Play!で気軽にCI

● 仮想フレームバッファ(Xfvb)があるよ!

ご心配なく

Page 32: Jenkins+Play!で気軽にCI

● 下記コマンドがあります

$ play auto-test

● 内部でHtmlUnitを使っています● 先程のTestsRunnerをバックグラウンドで走らせる

ことが出来ます● これでJenkinsで自動ビルド&テストが可能です

ご心配なく

Page 33: Jenkins+Play!で気軽にCI

● HtmlUnit is a "GUI-Less browser for Java programs". It models HTML documents and provides an API that allows you to invoke pages, fll out forms, click links, etc... just like you do in your "normal" browser.(http://htmlunit.sourceforge.net/)

● Jenkins内部のHudsonTestCaseの中にも組み込まれてますよね

HtmlUnitとは

Page 34: Jenkins+Play!で気軽にCI

● auto-testコマンドに、このHtmlUnitサポートがなかった

● つまり、自動テストをするためには、– CiサーバにXを入れるか– Xvfbを使って仮想のXを動かすか

のどちらかの対応が必要でした。。

ちなみに半年くらいまえまでは

Page 35: Jenkins+Play!で気軽にCI

● JUnit● HtmlUnit+Selenium● Cobertura● HSQLDB(インメモリ)● Fixture

を特別なセットアップなしに気軽に使える

● 依存関係管理は頑張りましょう。。。

ここまでおさらい

Page 36: Jenkins+Play!で気軽にCI

● ビルド&テストは気軽に出来るけど、CIサーバがない。

● Jenkins使おう

さてそこでJenkins

Page 37: Jenkins+Play!で気軽にCI

Play!をJenkinsで使う場合の問題点

● MavenでもAntでもない独自コマンドを使ってる

● テスト結果のフォーマットも独自

(っていうかHTML。。。)

Page 38: Jenkins+Play!で気軽にCI

とりあえず素朴にやってみよう

● 設定

Page 39: Jenkins+Play!で気軽にCI

結果

● ビルド結果

失敗したことしか分からん。。※女性の写真は無関係です。。

Page 40: Jenkins+Play!で気軽にCI

結果

● ワークスペースこうなった

Page 41: Jenkins+Play!で気軽にCI

なんかHTMLいっぱいあってこわい。。

Page 42: Jenkins+Play!で気軽にCI

このままじゃ

Page 43: Jenkins+Play!で気軽にCI

Play!はCIに向かないFW

( *´艸`)ププッ

Page 44: Jenkins+Play!で気軽にCI

とか言われちゃう。。

Page 45: Jenkins+Play!で気軽にCI

なのでプラグイン書きました

Page 46: Jenkins+Play!で気軽にCI

こんなふうに設定して

Page 47: Jenkins+Play!で気軽にCI

実行すると

Page 48: Jenkins+Play!で気軽にCI

こんなふうに結果を見られます

Page 49: Jenkins+Play!で気軽にCI

結果の詳細はこんな感じUnit Test

Selenium Test

Page 50: Jenkins+Play!で気軽にCI

テストがこけるとこうなります

Page 51: Jenkins+Play!で気軽にCI

テストがこけるとこうなります

Page 52: Jenkins+Play!で気軽にCI

このプラグインがあれば

Page 53: Jenkins+Play!で気軽にCI

Play!はCIに向かないFW

( *´艸`)ププッ

Page 54: Jenkins+Play!で気軽にCI

とか言われないで済む!

。。。はず

Page 55: Jenkins+Play!で気軽にCI

● JUnit● HtmlUnit+Selenium● Cobertura● HSQLDB(インメモリ)● Fixture

を特別なセットアップなしに気軽に使える

+カッコいいデザインのテスト結果!

このプラグインを使えば

Page 56: Jenkins+Play!で気軽にCI

依存関係管理は?…

Page 57: Jenkins+Play!で気軽にCI

プラグインの拡張で対応します!

Page 58: Jenkins+Play!で気軽にCI

Jenkinsのアップデートセンターに置いてあるので使ってみてくださ

い!

Page 59: Jenkins+Play!で気軽にCI

https://github.com/jenkinsci/play-plugin

コードはGithubにあります

Page 60: Jenkins+Play!で気軽にCI

Jenkins + Play! で気軽にCIしましょう!

Page 61: Jenkins+Play!で気軽にCI

ご静聴ありがとうございました

Page 62: Jenkins+Play!で気軽にCI

おまけ

Page 63: Jenkins+Play!で気軽にCI

● Play! はPaaSとの相性もいいです

● まずなによりPlay! 自体がPaaSを持っています

● RailsのHeroku的な位置づけ(機能全然足りてないですけど。。)

PaaSとの相性

Page 64: Jenkins+Play!で気軽にCI

https://www.playapps.net/

Page 65: Jenkins+Play!で気軽にCI

● GoogleAppEngine プラグインあり

● Stax Networks プラグインあり

● CloudeBees プラグインもある!?

※Staxは最近CloudBeesに買収された

PaaSとの相性