【追記あり】CircleCIを使ってJavaリポジトリの静的解析などのレポートを見る
我が社の(元)jenkinsおじさんがCircleCI推しなので、ちょっと調べてみることにしました。今更かよm9 という突っ込みは甘んじて。
なお、今回はプロジェクトの構成側に問題があって、まだCircleCIには移行していません。検証内容のまとめです。
何のために
私のチームの技術基盤はJavaやC#です。特にJavaの場合は静的解析ツールが結構充実しており、ビルド時などに様々なメトリクスを取ることができます。レポーティングプラグインもあるし、この辺りはjenkinsの方がまだ優位性があるのかなあ、と思ってました。ちなみに現状レポートが出るようにしてあるのは以下について。
まあ、常に見たい訳ではないです。当面は週次のチームミーティングなどでメトリクスを確認して、危ない所がないかどうか位は意識合わせをしておきたい、という使い方を想定してます。
CircleCIの $CIRCLE_TEST_REPORTS
を使う
CircleCIではテストレポートのためのディレクトリが用意されていて、そこにレポートファイルを放り込めば実行結果にタブが追加されてレポートを参照できるようになるようです。ここのhtml形式で出力すれば問題ない気がします。
プロジェクトの構成
- java 8
- gradle 2.2.1
- jersy 2.6
circle.yml
の追加
とりあえず、構成とドキュメントを元に以下のような circle.yml
を作成してコミット。
machine: java: version: oraclejdk8 timezone: Asia/Tokyo test: post: - cp -r build/reports/* $CIRCLE_TEST_REPORTS/
すると以下のような権限エラーではじかれました。
export TERM="dumb" if [ -e ./gradlew ]; then ./gradlew dependencies;else gradle dependencies;fi export TERM="dumb" if [ -e ./gradlew ]; then ./gradlew dependencies;else gradle dependencies;fi returned exit code 126 bash: line 2: ./gradlew: Permission denied Action failed: gradle dependencies
とりあえず gradlew
に実行権限を追加してみます。
machine: java: version: oraclejdk8 timezone: Asia/Tokyo dependencies: pre: - chmod -x ./gradlew test: post: - cp -r build/reports/* $CIRCLE_TEST_REPORTS/
そうすると以下のような感じ。gradle-wrapperが見つからないというか、中途半端に gradlew
だけ作られている状態のようです(なんでそんなことになってるんだか)。
export TERM="dumb" if [ -e ./gradlew ]; then ./gradlew dependencies;else gradle dependencies;fi export TERM="dumb" if [ -e ./gradlew ]; then ./gradlew dependencies;else gradle dependencies;fi returned exit code 1 Error: Could not find or load main class org.gradle.wrapper.GradleWrapperMain Action failed: gradle dependencies
というわけで、 build.gradle
に以下を追加して gradle wrapper
タスクを実行します。
task wrapper(type: Wrapper) { gradleVersion = ‘2.2.1' }
出力されたファイルをコミットします。
- gradle/
- gradle/gradle-wrapper.jar
- gradle/gradle-wrapper.properties
これでようやくテストタスクが動く状態になりました。
が、ここでプロジェクトの問題発生。テストに使うデータベースの接続先が社内固定でかつSQLServerしか対応してなかったです(テスト動かすまで忘れてた)。とりあえず、テスト落ちても良いから、レポーティングだけ確認する目的で最後まで実行してみました。
Artifactタブ
テストタスク実行後に出力されたファイル群が、正しくコピーされていれば実行結果に「Artifact」タブが表示され、配下のレポートファイル群がツリー形式で表示されます。htmlファイルであれば参照することも可能で、Jacocoのテストレポートもいつもの形式で表示されました。
今回はテストがこけたのでテストレポートしか出力されませんでしたが、コピーは build/reports
ディレクトリ配下をまとめて実施しているので、他のレポートが出力されても参照できそうです。
これから
jenkinsとの運用の手間の違いなんかを考えると、テスト時のデータベースをH2でインメモリにするなり、ネイティブクエリ使ってる所を排除するなりしていってCircleCIで回す前提の変更をしていった方が良さそうです。それから、findbugsのレポートがデフォルトのxmlのままになっているので、htmlで出力するように修正が必要かと。
CircleCI、ブランチをpushしたら問答無用でビルドしてくれるので非常に楽ですね。レポートファイルも今までと同じように見れます。jenkinsのようにダッシュボードはないですが、運用上の大きな問題にはならない気がします。必要であれば、レポートを集約してダッシュボード的に見せるhtmlファイルを作っておけば良いだけの話ですし。
メトリクス収集にも見込みがたったこともありますし、mavenとH2使ってるプロジェクトの方ではCircleCIの運用を開始することにしました(はじめからこっちでやっとけばよかった)。
【追記】
mavenとH2で使っているプロジェクトでテストとレポーティングを試してみました。結果、問題なくレポートの参照までできました。
index.html
をクリックするとmaven-site-pluginで出力したレポートサイトが確認できます。最終的に circle.yml
は以下のようになりました。
machine: java: version: oraclejdk7 timezone: Asia/Tokyo test: pre: - cp -f ./src/main/resources/META-INF/persistence_SevTest.xml ./src/main/resources/META-INF/persistence.xml override: - mvn site post: - cp -r ./target/site/* $CIRCLE_TEST_REPORTS/
レポートを出すために、テストで実行するタスクを mvn site
に変更しています *1 。テスト実行後に target/site
以下に出力されるレポート類を $CIRCLE_TEST_REPORTS
にコピーしています。
*1:デフォルトはtest-integration。これで出るのか確証が持てなかったので、念のためsiteタスクに変更