CircleCI で checkstyle と FindBugs によるコード解析を実行し、その結果を Github にコメントする方法

# この記事で説明すること
要するにこういうこと
![イメージ図.png](https://qiita-image-store.s3.amazonaws.com/0/39426/14e04f4d-0f4d-3eaa-8471-00c29b94a462.png)
コード解析には checkstyle と Findbugs を使用する。

また、大量の警告メッセージが Github にコメントされるのを防ぐため、
masterブランチと比較して差分のあるファイルに対する警告だけをコメントするようにする。

# 前提
- Github のリポジトリは作成済みであること。
- 分析対象リポジトリのビルドスクリプトも作成済みであること（本記事では ant を利用している）。
- checkstyle の設定ファイルも、`checkstyle.xml`という名前でリポジトリに追加済みであること。

# 手順
## 1. Gemfileを配置する。
以下のように記述し、プロジェクトのトップディレクトリに保存する。

```:Gemfile
source 'https://rubygems.org'

gem 'findbugs_translate_checkstyle_format', '>= 0.2.6'
gem 'checkstyle_filter-git'
gem 'saddler'
gem 'saddler-reporter-github'
```

## 2. コード解析を実行するシェルを記述する
以下のようなシェルを、プロジェクトのトップディレクトリに保存する。

```sh:run_static_analyzer.sh
#!/bin/bash
set -v

# master ブランチを分析対象から除外する。
DEFAULT_BRANCH="master"
if [ "${CIRCLE_BRANCH}" !=  "${DEFAULT_BRANCH}" ]; then

    # .java ファイルに変更がなければ、動作を終了する。
    LIST=`git diff --name-only origin/${DEFAULT_BRANCH} | grep -e '.java$'`
    if [ -z "$LIST" ]; then
        echo "No java file has changed."
        exit 0
    fi

    # checkstyle による分析を実行する。(※)
    echo $LIST \
    | xargs java -Duser.language=ja -classpath $HOME/checkstyle/checkstyle-6.19-all.jar com.puppycrawl.tools.checkstyle.Main -c checkstyle.xml -f xml -o result.xml

    bundle exec checkstyle_filter-git diff origin/${DEFAULT_BRANCH} < result.xml \
    | bundle exec saddler report \
        --require saddler/reporter/github \
        --reporter Saddler::Reporter::Github::CommitReviewComment

    # Findbugs による分析を実行する。
    java -Duser.language=ja -jar $HOME/findbugs/lib/findbugs.jar -textui -sourcepath src/ -xml bin/ \
    | bundle exec findbugs_translate_checkstyle_format translate \
    | bundle exec checkstyle_filter-git diff origin/${DEFAULT_BRANCH} \
    | bundle exec saddler report \
        --require saddler/reporter/github \
        --reporter Saddler::Reporter::Github::CommitReviewComment
fi
exit 0
```
※ http://qiita.com/kmotoki/items/3b819175860328a0374d

## 3. circle.yml を記述する
以下のように記述し、プロジェクトのトップディレクトリに保存する。

```yaml:circle.yml
machine:
    timezone: Asia/Tokyo
    ruby:
        version: 2.2.0
    java:
        version: openjdk7
    environment:
        _JAVA_OPTIONS: "-Xms1024m -Xmx2048m"

dependencies:
    override:
        - gem update bundler
        - gem install --no-document findbugs_translate_checkstyle_format checkstyle_filter-git saddler saddler-reporter-github
        - mkdir $HOME/checkstyle
        - curl -sL https://sourceforge.net/projects/checkstyle/files/checkstyle/6.19/checkstyle-6.19-bin.tar.gz | tar xz --strip=1 -C $HOME/checkstyle
        - mkdir $HOME/findbugs
        - curl -sL http://prdownloads.sourceforge.net/findbugs/findbugs-3.0.1.tar.gz | tar xz --strip=1 -C $HOME/findbugs

compile:
    override:
        - ant -buildfile build.xml

test:
    override:
        - ./run_static_analyzer.sh
```

## 4. Github のアクセストークンを作成する
Github のプロフィールページから"Edit profile" - "Personal access tokens"ページに遷移する。
右上の"Generate new token"ボタンをクリックする。
![to_access_token_page.png](https://qiita-image-store.s3.amazonaws.com/0/39426/7b461354-329c-c578-eac7-1133f25e3f0a.png)



"Select scopes"欄から、"repo"にチェックを付け、一番下の"Generate token"ボタンをクリックする。
（"Token description"欄への入力は任意）
![generate_new_token.png](https://qiita-image-store.s3.amazonaws.com/0/39426/b4e26f26-d20e-4450-703a-204ae5c97f02.png)

生成されたアクセストークンが表示されるので、メモしておく。
なお、**一度 作成したアクセストークンの値を後で確認することはできない。**
**絶対に失くさないこと。**

## 5. CircleCI 上にプロジェクトを作成する。
左のメニューの"Projects"ボタンをクリックし、右上の"Add project"ボタンをクリックする。
作成したいプロジェクトを選択する。
![add_project.png](https://qiita-image-store.s3.amazonaws.com/0/39426/aeaeb7a6-09fc-9ba0-6bad-852f12e8d3a4.png)

## 6. アクセストークンを登録する。
勝手にビルドが始まるが、無視して右上の"Project Settings"ボタンをクリックする。
![to_setting_page.png](https://qiita-image-store.s3.amazonaws.com/0/39426/bd70fd9b-940d-b550-6cb9-e01de63bbf2a.png)

"Environment Variables" - "Add Variable"ボタンをクリックし、
以下の値を登録する。

- Name : 'GITHUB_ACCESS_TOKEN'
- Value : 手順3. で作成したアクセストークン

![register_environment_variable.png](https://qiita-image-store.s3.amazonaws.com/0/39426/1185ceb3-a56e-8ab1-56cf-3db2b18a4624.png)

以上

# 参考
以下のツールを利用させていただいております。
ツールの作成者に感謝します。
[CheckstyleFilter::Git](https://github.com/packsaddle/ruby-checkstyle_filter-git)
[Saddler](https://github.com/packsaddle/ruby-saddler)
[Saddler::Reporter::Github](https://github.com/packsaddle/ruby-saddler-reporter-github)
[FindbugsTranslateCheckstyleFormat](https://github.com/noboru-i/findbugs_translate_checkstyle_format)

サンプルのリポジトリ↓ https://github.com/kmotoki/circleci_sample/commit/ffb91e16d62055665af8a9208bbd0ca7b8b6d225