読者です 読者をやめる 読者になる 読者になる

冥冥乃志

ソフトウェア開発会社でチームマネージャをしているエンジニアの雑記。アウトプットは少なめです。

follow us in feedly

【追記あり】CircleCIを使ってJavaリポジトリの静的解析などのレポートを見る

Programming その他

我が社の(元)jenkinsおじさんがCircleCI推しなので、ちょっと調べてみることにしました。今更かよm9 という突っ込みは甘んじて。

なお、今回はプロジェクトの構成側に問題があって、まだCircleCIには移行していません。検証内容のまとめです。

何のために

私のチームの技術基盤はJavaC#です。特に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で使っているプロジェクトでテストとレポーティングを試してみました。結果、問題なくレポートの参照までできました。

f:id:mao_instantlife:20150826145455p:plain

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タスクに変更