レビューしたMastering Jenkinsが出ました
レビュアーとして参加した本としては3冊目になると思いますが、またPactpubから本が出ました。
Jenkins中級者向けに、主に大きな組織にどうやってJenkinsを導入してCIを実現していくかという観点で書かれています。セキュリティ要件を満たすためのアレコレについて触れつつ、一方でCDに関する目配せもあって中々意欲的な本だと思います。
英語ですが、それでもいいという方は買ってみてもいいんではないでしょうか。
Kindleでも入手できます。
- 作者: Jonathan McAllister
- 出版社/メーカー: Packt Publishing
- 発売日: 2015/10/27
- メディア: Kindle版
- この商品を含むブログを見る
レビュアーとして関わった『Jenkins Continuous Integration Cookbook Second Edtion』が届きました
昨年、上記のようにお伝えした本がようやく手許に届きました。
レビュアーとして参加した本が届きました! pic.twitter.com/PY0zQq3GGy
— Takafumi Ikeda (@ikeike443) 2015, 3月 13
クレジットもされてるようです。
クレジット確認 pic.twitter.com/zJaeMoT8Pb
— Takafumi Ikeda (@ikeike443) 2015, 3月 13
英語が苦にならない人はJenkinsのレシピ集として一冊持っておいてもいいのではないでしょうか。
Jenkins Continuous Integration Cookbook - Second Edition
- 作者: Alan Mark Berg
- 出版社/メーカー: Packt Publishing
- 発売日: 2015/01/30
- メディア: ペーパーバック
- この商品を含むブログを見る
Kindle版もあります。
Jenkins Continuous Integration Cookbook - Second Edition
- 作者: Alan Mark Berg
- 出版社/メーカー: Packt Publishing
- 発売日: 2015/01/30
- メディア: Kindle版
- この商品を含むブログを見る
書籍のレビューって、基本無償労働です。クレジットしてもらえるくらいが報酬といえば報酬です。
不憫に思った方のために、ウィッシュリストも貼っておきます。
www.amazon.co.jp
懲りずにまたもう一冊の洋書のレビューやってんだけどね。。。
レビュアーとして関わった "Jenkins Continuous Integration Cookbook"が来年1月に出ます
下記の本をレビューしました。2012年に出た本のアップデート版です。
Jenkins Continuous Integration Cookbook - Second Edition | Packt
ちなみにレビュアーとしては2冊目です。なぜかまた洋書という。。英語喋れないのに英語の本レビューしている俺氏。日本の技術者に友だちがいない俺氏。。
ちなみに1冊めのレビューは下記でした。
レビュアーとして参加したPlay Frameworkのスターターガイド(洋書)が出ました - ikeike443のブログ
内容的には、Jenkinsのレシピ集で、どちらかと言うと大規模なエンタープライズ案件においてどう設定して運用するかみたいな話が多いです。
目次的には下記のイメージ(のはず)。
- Integrate Jenkins with LDAP and SSO solutions
- Maintain and secure Jenkins
- Run an integration server firing automatic functional and performance tests
- Communicate through social media and by plotting custom data
- Skin Jenkins to your corporate look and feel
- Refine the use of code metrics to improve quality
- Write your first custom Jenkins plug-in
- Apply tweaks to optimize your use of Jenkins
まだ製本されたものをもらってないのでアレなんですが、若干内容的に古めの部分がありましたが、レビューで指摘したので最新版にアップデートされて来るのではないでしょうか。
英語が読めて、Jenkinsのレシピを色々読んで参考にしたいという人には、悪くない選択肢じゃないでしょうか。
日本語技術書のレビューを一度はやってみたいです。。誰かオファーしてください。。
Jenkins + Maven3.2.1 で IllegalAccessError on AbstractMapBasedMultimap
メモ。時間があるときに調べる。
Maven3.2.1とJenkins1.581のCoreとで依存しているGuavaのバージョンが違っていることが遠因になっていくつかのプラグインが動かなくなっている。(下記参照)
[#JENKINS-22252] Maven 3.2.1: IllegalAccessError on AbstractMapBasedMultimap - Jenkins JIRA
JenkinsでMavenプロジェクトを作って静的解析をしていて下記のようなエラーが出ていたらこの問題に該当すると思って良さそう。PMD, CheckStyle, FindBugs全て同じ。静的解析以外でも問題が起きそうだけど、今のところ聞いてない。
java.io.IOException: Remote call on channel failed at hudson.remoting.Channel.call(Channel.java:748) at hudson.remoting.RemoteInvocationHandler.invoke(RemoteInvocationHandler.java:168) at com.sun.proxy.$Proxy7.execute(Unknown Source) at hudson.maven.MavenBuildProxy$Filter.execute(MavenBuildProxy.java:206) at hudson.plugins.analysis.core.HealthAwareReporter.registerResultsOnMaster(HealthAwareReporter.java:325) at hudson.plugins.analysis.core.HealthAwareReporter.postExecute(HealthAwareReporter.java:316) at hudson.maven.Maven3Builder$MavenExecutionListener.recordMojoEnded(Maven3Builder.java:628) at hudson.maven.Maven3Builder$MavenExecutionListener.mojoSucceeded(Maven3Builder.java:610) at hudson.maven.Maven3Builder$JenkinsEventSpy.onEvent(Maven3Builder.java:306) ... Caused by: java.lang.LinkageError: Failed to load com.google.common.collect.AbstractMapBasedMultimap at hudson.remoting.RemoteClassLoader.loadClassFile(RemoteClassLoader.java:326) at hudson.remoting.RemoteClassLoader.findClass(RemoteClassLoader.java:236) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:270) at hudson.remoting.MultiClassLoaderSerializer$Input.resolveClass(MultiClassLoaderSerializer.java:113) ... Caused by: java.lang.IllegalAccessError: class com.google.common.collect.AbstractMapBasedMultimap cannot access its superclass com.google.common.collect.AbstractMultimap at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:800) at java.lang.ClassLoader.defineClass(ClassLoader.java:643) at hudson.remoting.RemoteClassLoader.loadClassFile(RemoteClassLoader.java:322) ... 39 more
Workaroundとしては、Mavenプロジェクトをやめてフリースタイルプロジェクトで作るか、Mavenのバージョンを3.0.5くらいまで落とせば一応動く。細かいバージョンの組み合わせは試してないが、まあ3.0.5まで落とせば大丈夫っぽい、という程度の理解をしている。
これ結構直すのは面倒そうだなあ。JenkinsのGuavaバージョンをあげるのか、各プラグイン側でWorkaroundな修正を入れるのか。。
Play2 + Scala のカバレッジツールで一番マシなのは scct かな?
この記事は Play or Scala Advent Calendar 2012 12/10 分の記事です。
使ってる Play のバージョンは 2.0.4 です。Scala のバージョンは 2.9.1 ですよ。
なんかjacoco4sbtだめ
以前jacocoとjenkinsの記事を書いたんですが、jacocoだと余計なカバレッジまで計測してしまう(下記画像参照)ので困っていました。play new して作ったプロジェクトに、 GET / するテストを書いただけなのでカバレッジ100%になるはずなのに、異常にカバー率が低い。。
この場合RoutesやらReverseやらのPlayがジェネレートしているコードが邪魔なので、下記のように除外設定を書けば少しはましになりますが。
//Build.scala jacoco.excludes in jacoco.Config := Seq( "views.html.*", "Routes*", "*Reverse*", "views**", "routes*" )
でもまだまだダメ。例えばApplication.scalaのレポートをみると、、なんじゃこりゃー。。
Controllerトレイトの実装まで全部カバレッジレポートの対象にしちゃうので見にくくてしょうがない。
scctかな?
で、scctを試してみました。
潔いくらいドキュメントがない! のですが、導入は簡単です。機能も少ないし。
ちなみに Usage のところに sbt0.12 以上って書いてあるけど、無視しました。*1
使い方
Build.scalaはこう。
import sbt._ import Keys._ import PlayProject._ object ApplicationBuild extends Build { val appName = "coveragesample" val appVersion = "1.0-SNAPSHOT" lazy val s = Defaults.defaultSettings ++ Seq(ScctPlugin.instrumentSettings: _*) val appDependencies = Seq( // Add your project dependencies here, ) val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA, settings = s).settings( // Add your own project settings here parallelExecution in test := false ) }
ポイントは、
- scctの設定を追記する
lazy val s = Defaults.defaultSettings ++ Seq(ScctPlugin.instrumentSettings: _*)
- PlayProjectのsettingsプロパティに上記設定をセット(settings=sのところね)
val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA, settings = s)
です。*2
あと、parallelExecution in test := false も忘れない様につけておきましょう。これをつけないとテストが並列で実行されてしまいます。困りますよね? 僕は困ります。*3
で、plugins.sbtあたりにこう。
resolvers += Classpaths.typesafeResolver resolvers += "scct-github-repository" at "http://mtkopone.github.com/scct/maven-repo" addSbtPlugin("reaktor" %% "sbt-scct" % "0.2-SNAPSHOT")
これで下記のように実行すればいいです。
$ play scct:test
下記のような結果が得られます。
RoutesやReverseが含まれちゃってるのはjacocoのときと変わりませんが、Application.scalaの中を覗くと、余計なものが含まれてなくて綺麗だね!
さらにscctさんはcobertura互換のxmlも吐いてくれてます。なのでこいつをJenkinsに食わせましょう。
Jenkinsにセット
手順としては
- 事前準備:必要な(Jenkinsの)プラグインが入ってなければいれておく
Coberturaプラグインが入ってない場合はいれておきましょう。他にもGitを使うのであればGitのプラグインなどを入れましょう。
- フリースタイルジョブを作る
- "設定 > ビルド > シェルの実行" を選択し、下記をセット
/path/to/play-2.0.4/play clean /path/to/play-2.0.4/play test /path/to/play-2.0.4/play scct:test
パスは適切に設定してくださいね。
play test と play scct:test と、テストを2回実行しているのには理由があって、play testはJUnitのXMLを吐くため、play scct:testはカバレッジレポートを吐き出すため、です。ダサいですね。ごめんなさい。。
2つ合わせて下記の感じで。
Coberturaプラグインのインストールを忘れてると"ビルド後の処理 > Coberturaカバレッジレポートを集計" が出てこないので注意。
その他、SCMからコードを取得してくる設定とかは適宜やってください。
設定を上手いことやって実行すると、下記のような結果が得られます。カバレッジの推移も見れますね。
Application.scalaのレポートもバッチリですね。
JUnitの結果も集計できています。いつからデグったのかとか、わかり易くていいですね。
課題
手が回らなかったけど、いずれ解決したい課題
まとめ
Routes やら Reverse やらのジェネレートされたコードがカバレッジ対象に含まれちゃうのは jacoco と変わりませんが、フレームワークのコード(Controller トレイトなど)が混ざらない分、scctの方がマシそうです。
多分除外設定書くのも難しくないし。
内部では Scala Compiler Plugin として実装されているので、コード読むのも面白いです。
みんなでパッチ送って育てましょう。
2012/12/10 19:00追記
なんか、Playプラグインを使ってると scct:test がうまく動かないみたいです。会社のメンバーが教えてくれました。
play.plugins とか、その辺のファイルがないって怒られるっぽい。
なので、下記のようなスクリプトを会社の人が書いてくれました。play test と play scct:test の間に実行するといいみたいです。
#!/bin/bash [ -z "$1" ] && echo "Usage: $0 PATH_TO_PLAY_COMMAND" && exit -1 echo "exec: $1 scct:compile" $1 scct:compile echo "... copy some files for scct:test" for i in `find ./target/scala-2.9.1/classes -type f`; do TARG=`echo $i | sed -e "s/\/classes\//\/scct-classes\//"`; [ -f $TARG ] || echo "Copy $i"; [ -f $TARG ] || [ -d `dirname $TARG` ] || mkdir -p `dirname $TARG`; [ -f $TARG ] || /bin/cp $i $TARG; done echo "exec: $1 scct:test" $1 scct:test
使い方としてはこんな感じ
export PATH=/usr/java/jdk1.6.0_37/bin/:$PATH /usr/local/play-2.0.4/play clean /usr/local/play-2.0.4/play test ./scct-test.sh /usr/local/play-2.0.4/play
根本的には、play-scct プラグインを書かないといけないですが、それはまた別の機会に。。(早ければ年末!)
*1:Play2.0.4 は sbt0.11.3 を使用しています
*2:ちなみにこの辺の settings とかの書き方って、いろんな書き方ができるので実は上記のとおりに書かなくてもいいのです。奥が深いというか、sbtを理解すればいろいろ捗るのかもしれないので覚えてみてはいかがでしょうか。
*3:sbtさんは親切でつけてるんだと思うけど、勝手にテストを並列に実行されて嬉しい人いるんだろうか。。それが必要なときはCIサーバを増やしてCIサーバ側(要はJenkins)で並列実行するんだから余計なことしないでいいと僕は思うんだけど。。
*4:これはscct自体に機能がない。既に要望は上がってるんだけど、本人にヤル気がなさそう。なんで必要なのか分からんって、言うけど、Playには必要なんだよ!! https://github.com/mtkopone/scct/issues/31
Play2 Scala + jacoco4sbt + jenkins でカバレッジを取る
Play2 Scalaで作ったプロジェクトをJenkins上で自動テストするのは簡単。フリースタイルジョブで作ってシェルの実行のところに下記のように書いてやれば普通に動く。JUnitスタイルのXMLを吐いてくれるので、テスト結果をJenkins上で綺麗に整形してみることができる。
play clean play test
でもカバレッジとなると話は別で、Play1の時のようにCoberturaプラグインが用意されてるわけでもなく、上手い方法があるのかどうかよく分からない。
でもって、Scalaでカバレッジ計測ができるツールないかなと探してたんだけど、メンテが止まってるのが数個見つかったくらいでいいのがなかった、んだけど、一個いい感じのを見つけた。
jacoco4sbt
https://bitbucket.org/jmhofer/jacoco4sbt/wiki/Home
jacocoの for sbt ということで、sbtプラグインとして書かれている。そこそこメンテもされてるよう。
jacoco4sbtをPlayで動かそう
そのままだと上手く動かないんだけど、下記の記事を参考にすると何とかなる。
http://ronalleva.com/2012/04/25/jacoco-and-play.html
記事の内容としては、jacocoというかsbtはデフォルトだとテストを並列に実行してしまう、けどもPlayは並列実行の設定をオフにしているため、jacocoだけ並列に動こうとして上手くいかないけどどうしたらいいのか、ってもの。
これを見ると、jacoco4sbtをPlayと共存させるための設定方法がよく分かる。(っていうかPeter Hausel*1に聞いた、って記事中にあるね。。)
詳しくは記事を見ればわかると思うけど、参考までに最終的に僕の設定がどうなったかを書いておく。
Build.scala
import sbt._ import Keys._ import PlayProject._ import de.johoop.jacoco4sbt.JacocoPlugin._ import de.johoop.jacoco4sbt.XMLReport import de.johoop.jacoco4sbt.HTMLReport object ApplicationBuild extends Build { val appName = "Hoge" val appVersion = "1.0-SNAPSHOT" lazy val s = Defaults.defaultSettings ++ Seq(jacoco.settings:_*) val appDependencies = Seq( // Add your project dependencies here, ) val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA, settings = s ).settings( // Add your own project settings here // for jacoco parallelExecution in jacoco.Config := false, jacoco.reportFormats in jacoco.Config := Seq(XMLReport("utf-8"), HTMLReport("utf-8")), jacoco.outputDirectory in jacoco.Config := new File("target/coverage/") ) }
Build.scalaに上記のように書いてやれば、jacocoに対していろいろ設定できる。jacoco.settingsをsに追記してやって、そのsをPlayProjectの引数として渡してるね。こんなことできるんだ。。
ここでは記事と同じく parallelExecutionをオフにしたほか、カバレッジレポートのスタイルをXMLとHTMLの2本立てにして*2、レポートの出力先をtarget/coverage/に変更した。
plugins.sbt
// Comment to get more information during initialization logLevel := Level.Warn // The Typesafe repository resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/" // Use the Play sbt plugin for Play projects addSbtPlugin("play" % "sbt-plugin" % "2.0.3") // jacoco resolvers += "Sonatype" at "https://oss.sonatype.org/content/groups/scala-tools/" libraryDependencies ++= Seq( "org.jacoco" % "org.jacoco.core" % "0.5.9.201207300726" artifacts(Artifact("org.jacoco.core", "jar", "jar")), "org.jacoco" % "org.jacoco.report" % "0.5.9.201207300726" artifacts(Artifact("org.jacoco.report", "jar", "jar")) ) addSbtPlugin("de.johoop" % "jacoco4sbt" % "1.2.3")
plugins.sbtに、上記のようにjacoco4sdbtの設定を追記。バージョンはこのブログを書いている時点のものなので、適当に読み替えてほしい。
それから、jacocoが吐き出すXMLをJenkinsに解釈させるために、Jenkinsのjacoco Pluginも入れた。
Jenkinsではシェルの実行に下記のような記述をした。
play test play jacoco:cover
ちなみに、running(TestServer(xxx))を使ってHTTPスタックのテストを書いてカバレッジをとろうとすると上手くいかない。これは今調査中。
Enjoy!
- 作者: John Ferguson Smart,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/02/22
- メディア: 大型本
- 購入: 12人 クリック: 304回
- この商品を含むブログ (26件) を見る
Jenkins実践入門 ?ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)
- 作者: 佐藤聖規,和田貴久,河村雅人,米沢弘樹,山岸啓,川口耕介
- 出版社/メーカー: 技術評論社
- 発売日: 2011/11/11
- メディア: 単行本(ソフトカバー)
- 購入: 24人 クリック: 430回
- この商品を含むブログ (50件) を見る
Jenkins ユーザーカンファレンスに行った
すごい遅いけど、ブログ書いてなかったので書く。
先日行われた Jenkins ユーザーカンファレンスに、会社でスポンサードして、かつうちのQAマネージャーをだまくらかしてスピーカーとして送り込んできました。(「50人くらいの勉強会だよー」って言ってだました)
下記がその時の様子を記したブログです。ご興味のある方はぜひどうぞ。
http://shanon-tech.blogspot.jp/2012/07/awsselenium.html
なかなか評判良かったようです。騙してスピーカーとして送り込んだかいがありました。ちなみにスポンサードはしていますが、彼の講演はスポンサー枠ではありません。なんとなくそうしました。。
とりあえず僕は以前寄稿させていただいたJenkins本の作者にあいさつすることを第一目標としてたので、それが無事達成で来てよかったです。
(左からJenkins本作者のJohn、翻訳者の玉川さん、僕、です)
飲み会の席では、僕が書いたプラグイン開発の記事を英訳してJohnが無料配布してるPDFに載せようって話も出ました。それは楽しそうですね!
このあと2次会まで参加して、川口さんといろいろ話せて楽しかったです。
- 作者: John Ferguson Smart,Sky株式会社玉川竜司
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/02/22
- メディア: 大型本
- 購入: 12人 クリック: 299回
- この商品を含むブログ (26件) を見る