CircleCI
coverage
Slack

CircleCIで計測したカバレッジ変化をSlackに晒す

More than 1 year has passed since last update.

しばらく前に CI ツールを Jenkins から CircleCI にスイッチしたのですが、

Jenkinsで収集したカバレッジの変化情報をSlackに投稿する

でやっていた Slack への通知ができなくなったことで「テストを書く」という意識が少々低下した感じがしたので、同様の内容を CircleCI で実装しました。

晒す可視化するのはけっこう大事。

Slack.png

artifacts に保存しているカバレッジ情報の XML を元に比較を行い、変化を通知します。
ブランチが複数ある場合は、そのブランチの1つ前のビルド(直前とは限らない)を優先して比較するようにしています。
ブランチの初回ビルドの場合や1つ前のビルドの artifacts にカバレッジ情報が見つからなかった場合は、ビルド番号を1つづつ減らして過去に遡ります(最大5回)。

メッセージ内のリンクは次の通りです。

  • プロジェクト名: CircleCI のプロジェクトトップへのリンク
  • ビルド番号: 該当ビルドへのリンク
  • Commit ID: github の該当 commit へのリンク

対応しているカバレッジ情報 XML のフォーマットは、cobertura, jacoco です。

JS 系では、jscoverage や istanbul 等が cobertura 形式をサポートしています。
Java や Scala は jacoco を使います。

前提条件

既に CircleCI 上でカバレッジ情報を計測、artifacts に XML が登録されていることとします。

設定手順

Slack の Webhook URL の取得

既に CircleCI の Integration を追加している前提です。
まだ未設定であれば、通常の連携設定を先に行っておいてください。

まず、 Slack の Apps & Custom Integration から Installed Apps に移動し、「Circle CI」を選択します。

Configure_Apps___Sprocket_Slack.png

CircleCI の App 詳細画面がでるので、設定済みの configuration の編集ボタンを押します。

Configure_Circle_CI___Sprocket_Slack.png

すると、詳細設定が表示されますので、Webhook URL をコピーしておきます。

Circle_CI___Sprocket_Slack.png

CircleCI の設定

API Permissions の設定

前回のビルド情報の取得に CircleCI の API を利用しているので、その API 用のトークンを生成します。

自分が所有するリポジトリ(github のリポジトリの前半が自分のユーザ名)の場合は、ビルド時のコンテナ内からそのまま CircleCI の API をコールできるのですが、チーム用のリポジトリの場合は API アクセスにトークンが必要になります。

自分が所有するリポジトリの場合は、この設定は必要ありませんのでスキップしてください。

Project Settings -> Permissions -> API Permissions に移動します。
API トークンの種別は Build Artifacts を選択、Label は適当に付けてトークンを生成します。

Project_settings_-_u-minor_circleci-test_-_CircleCI.png

トークンが生成されたら、コピーしておきます。

Project_settings_-_u-minor_circleci-test_-_CircleCI.png

Environment Variables の設定

Project Settings -> Tweaks -> Environment Variables に移動します。

  • Name: SLACK_ENDPOINT
  • Value: コピーした Webhook URL

を入力し、保存します。

Project_settings_-_u-minor_circleci-test_-_CircleCI.png

API トークンを生成した場合は、続けて

  • Name: CIRCLE_TOKEN
  • Value: コピーした API トークン

を入力し、保存しておきます。

Project_settings_-_u-minor_circleci-test_-_CircleCI.png

Test Commands の設定

Project Settings -> Test Commands -> Test Commands に移動します。
Post-test commands に以下の内容を入力します。

curl -s -L https://gist.githubusercontent.com/u-minor/8cb27fa9c04163142ebd/raw/circleci-coverage-slack | bash -s

Project_settings_-_u-minor_circleci-test_-_CircleCI.png

ここまでの設定がうまく行けば、ビルド -> テスト(カバレッジ計測)完了後に Slack に結果が通知されます。

補足

XML のファイル名が coverage.xml で終わらない場合

artifacts 内のカバレッジ情報のファイル名は coverage.xml で終わるものを探しています。
このファイル名で終わらない場合は、Environment Variables に以下の内容を追加でセットします。

  • Name: COVERAGE_FILE
  • Value: XML ファイル名

jacoco を利用する場合

デフォルトでは cobertura 形式とみなして処理します。
jacoco 形式の場合は Test Commands の最後の bash コマンドを bash -s jacoco に変更します。

curl -s -L https://gist.githubusercontent.com/u-minor/8cb27fa9c04163142ebd/raw/circleci-coverage-slack | bash -s jacoco

またカバレッジ情報ファイル名が標準で jacoco.xml となるため、COVERAGE_FILE 環境変数も追加します。

  • Name: COVERAGE_FILE
  • Value: jacoco.xml

2016/03/11 追記

Post-test commands だと build やテストに失敗しても実行されてしまうので、テスト成功時のみ実行するのであれば、circle.yml の deployment セクションに以下のように追記する必要があります。

circle.yml
deployment:
  report_coverage:
    branch: /.*/
    commands:
      - curl -s -L https://gist.githubusercontent.com/u-minor/8cb27fa9c04163142ebd/raw/circleci-coverage-slack | bash -s