jenkins+play!で気軽にci

Post on 07-Dec-2014

13.119 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

Jenkins + Play! で気軽にCI!

自己紹介

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

(http://playdocja.appspot.com)

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

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

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

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

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

その前に。。。

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

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

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

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

Play! って?

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

ですよねー

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

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

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

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

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

あじぇんだ

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

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

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

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

● Unit Tests– Junitで各クラスを

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

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

用意されているテスト

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

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

#{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

$ play test

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

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

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

Coberturaも使えるよ

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

インメモリDB使えるよ

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

%test.db=mem

● これはとても便利

DDLは?

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

%test.jpa.ddl=create-drop

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

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

Fixtureも用意されてるよ!

@Before

public void setUp() {

Fixtures.deleteAll();

Fixtures.load("data.yml");

}

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

● Seleniumでも使えます

要は、

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

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

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

(Dropいらず)

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

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

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

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

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

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

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

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

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

TestsRunnerがブラウザアプリ

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

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

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

TestsRunnerがブラウザアプリ

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

ご心配なく

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

$ play auto-test

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

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

ご心配なく

● 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とは

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

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

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

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

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

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

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

ここまでおさらい

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

● Jenkins使おう

さてそこでJenkins

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

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

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

(っていうかHTML。。。)

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

● 設定

結果

● ビルド結果

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

結果

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

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

このままじゃ

Play!はCIに向かないFW

( *´艸`)ププッ

とか言われちゃう。。

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

こんなふうに設定して

実行すると

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

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

Selenium Test

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

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

このプラグインがあれば

Play!はCIに向かないFW

( *´艸`)ププッ

とか言われないで済む!

。。。はず

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

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

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

このプラグインを使えば

依存関係管理は?…

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

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

い!

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

コードはGithubにあります

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

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

おまけ

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

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

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

PaaSとの相性

https://www.playapps.net/

● GoogleAppEngine プラグインあり

● Stax Networks プラグインあり

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

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

PaaSとの相性

top related