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


mokemokechicken氏の [gitでPushする度にKarma-CoverageのCoverageの値をJenkinsで計測し、その増減をIdobataに投稿する](http://qiita.com/mokemokechicken/items/af4ceab8df321d545058) に触発されて、最近自分のチーム内情報共有に活用している [Slack](https://slack.com/) でもやってみました。

Gitlab + Jenkins + 何かしらのCoverage + Slack という組み合わせになります。
ここでは [JenkinsでNode.jsのテスト＆カバレッジレポートを管理する](http://qiita.com/u-minor/items/a28743b29d08147827e1) で出力したカバレッジ情報を使っていますが、Cobertura形式であればプロジェクトの言語は問わないはずです。

## できること

gitのcommit treeを考慮した上で前回のカバレッジ結果からの変化を計算し、増加・変化なし・減少の3パターンの報告をSlack上の指定のchannelに投稿します。
「Open」の部分はJenkins上の特定ビルドへのリンクとなっていて、詳細がすぐに確認できるようになっています。

これにより、テストコードを書かずにpushするとカバレッジを下げたことがチーム内で晒されるので、ツッコミを受けないよう頑張る方向に意識が働くようになります。たぶん。

![Slack.png](https://qiita-image-store.s3.amazonaws.com/0/15611/55885072-6d1a-876f-6ee6-f861e0a85141.png "Slack.png")
![Slack.png](https://qiita-image-store.s3.amazonaws.com/0/15611/629cda3c-fc3a-1ba1-f879-1dc35bb01171.png "Slack.png")
![Slack.png](https://qiita-image-store.s3.amazonaws.com/0/15611/c6042a09-24fe-c44d-2ffd-9a4236857e19.png "Slack.png")

## 設定手順

Gitlabへのpush -> Jenkinsのビルド実行、カバレッジ情報出力までの手順は割愛します。

[GitLab と Jenkins を連携する (1)](http://qiita.com/garbagetown/items/fe055dcfd8e0c090e610)
[JenkinsでNode.jsのテスト＆カバレッジレポートを管理する](http://qiita.com/u-minor/items/a28743b29d08147827e1)
あたりを参考にしてください。
また、[gitでPushする度にKarma-CoverageのCoverageの値をJenkinsで計測し、その増減をIdobataに投稿する](http://qiita.com/mokemokechicken/items/af4ceab8df321d545058) のJenkinsの設定までを行っておきます（特にRubyのインストール）。

### Slackの設定

Slackのintegration設定のページに行き、Jenkins CIを追加します。

![slack_integrations.png](https://qiita-image-store.s3.amazonaws.com/0/15611/e0a14065-7aa2-dabb-249f-57cf6c942cdc.png "slack_integrations.png")

channelを選択し、「Add Jenkins Integration」ボタンを押します。

> ここでとりあえずデフォルトのchannelは設定しますが、実際には投稿時に変更可能です。

![slack_add_instegration.png](https://qiita-image-store.s3.amazonaws.com/0/15611/1d971cdc-20eb-57aa-acab-a3f849752bd6.png "slack_add_instegration.png")

その後、Jenkins側の設定のインストラクションが表示されますが、無視してOKです。
重要なのは、左のメニュー下部に表示されるtokenで、これをコピーしておきます。

![slack_token.png](https://qiita-image-store.s3.amazonaws.com/0/15611/7c4d24c5-1a9c-2c76-c11e-51c0d91219e8.png "slack_token.png")

### Jenkinsのビルド手順の追加

Jenkinsのジョブ設定でビルド手順の追加を行い、単体テストを行った後に以下のシェルスクリプトを記載します。

> 環境変数の各部分は、自分のドメインやtokenに置き換えてください。

```bash
export COVERAGE_DIR=.coverage
export SLACK_ENDPOINT=https://<YOUR_SLACK_TEAM_DOMAIN>.slack.com/services/hooks/jenkins-ci
export SLACK_TOKEN=<YOUR_SLACK_TOKEN>
export SLACK_CHANNEL=<YOUR_SLACK_CHANNEL>
curl -s -L https://gist.githubusercontent.com/u-minor/d285e58a5c92e54d7188/raw/cobertura_slack.sh | sh -s coverage/cobertura-coverage.xml
```

![jenkins_shell.png](https://qiita-image-store.s3.amazonaws.com/0/15611/7890cda1-ba01-c22a-a0cb-088c77911a22.png "jenkins_shell.png")

## スクリプトの内容について

基本的な処理内容は、
[gitでPushする度にKarma-CoverageのCoverageの値をJenkinsで計測し、その増減をIdobataに投稿する](http://qiita.com/mokemokechicken/items/af4ceab8df321d545058)
に記載のスクリプトとほぼ同一です。

相違点は、

* レポートファイルを新規に`COVERAGE_DIR`の場所に複製し、履歴はこのディレクトリで管理している
  * レポートファイルがあるディレクトリがcleanされても大丈夫なように
* idobataからslackへの投稿に切り替えている

となります。

## おまけ

Slackへの投稿は、シンプルなテキスト投稿の他に、今回のような複雑なフォーマットのメッセージを投稿することができます。
背景色を変えることはできませんがcolor barで似たような表現が実現できるので、活用範囲は広そうです。

監視スクリプトをちょっと改変して、障害等の際にメールでの通知の他にSlackへの通知を追加したりしていますが、なかなか便利でオススメです。