Go言語利用のレポジトリをInspecodeで静的解析＋テストしてみる

# Inspecodeとは？

[Inspecode](https://rocro.com/inspecode)は、CodeClimateやSideCIのような静的コード解析サービスの一種です。[ドキュメント](https://inspecode.rocro.com/help/tools.html)にあるように、かなり多くの言語とツールに対応しているのが特徴です。あと静的コード解析と言いつつ、Go言語やJavascriptに関してはテストの実行もできちゃってます。

今回はGo言語を利用したレポジトリに対して、Inspecodeで静的コード解析＋テスト実行をしてみます。

# Disclaimer

僕はInspecodeの開発に関わっています。日本語のチュートリアルが全然ないので試しにQiitaに投稿してみました。

# 使用するレポジトリ

[gitleaks](https://github.com/zricethezav/gitleaks)という、gitに秘密情報をコミットしていないかチェックしてくれるツールのレポジトリを対象にしてみます。

# 手順

## 1. [gitleaks](https://github.com/zricethezav/gitleaks)のレポジトリをForkする

   <img width="1017" alt="Screen Shot 2018-03-08 at 23.16.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/118939/1efb53b1-7770-66ff-f4d8-1d6fb85311c3.png">

   Organization配下にForkすると後で面倒なので、個人アカウント配下にForkするのがおすすめです。。

## 2. 設定ファイルを追加する

以下の設定ファイルを`rocro.yml`という名前でgitレポジトリ直下に追加します。設定ファイルなしでもある程度は動くのですが、今回はテストも実行したいのであらかじめ作っておきます。

```
inspecode:
  gofmt:
    thresholds:
      num-issues: 0
  golint:
    thresholds:
      num-issues: 0
  goimports:
    thresholds:
      num-issues: 0
  go-test:
    thresholds:
      num-issues: 0
```

使用したいツールと、解析ジョブを失敗とみなすIssues数のしきい値を指定しています。例えば今回の設定だと、いずれかのツールが一つでもIssueを指摘したら、ジョブ失敗とします。

他にもGo言語では[以下のツール](https://inspecode.rocro.com/help/tools.html#go)が使えるので、必要に応じて追加してみて下さい。

<img width="264" alt="Screen Shot 2018-03-08 at 23.39.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/118939/fd81ac4d-a0e5-8421-0d93-0a8327c8e95b.png">

## 3. InspecodeにSign in/up

[こちらのページ](https://rocro.com/inspecode)からSign in/upできます。GitHubアカウントが必要です。

## 4. gitleaksレポジトリを登録する

TopページからRepositories一覧ページを開いて、

<img width="477" alt="Screen Shot 2018-03-08 at 23.26.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/118939/0cbfe79f-596e-f767-b290-0d790ae9944c.png">

gitleaksのレポジトリを登録します。

<img width="689" alt="Screen Shot 2018-03-08 at 23.28.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/118939/f2129d89-438e-7de8-8d4c-af14354449d5.png">

登録すると、自動で最初の解析ジョブが実行されます。

## 5. 解析ジョブを開く

Reports一覧ページを開いて、

<img width="479" alt="Screen Shot 2018-03-08 at 23.30.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/118939/f5da75aa-35da-3079-c0cb-8fe62abf22eb.png">

Loadingアイコンを押します。

<img width="494" alt="Screen Shot 2018-03-09 at 12.00.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/118939/3f38a466-2e6e-f8ab-9a5e-90d850666450.png">

## 6. 解析ジョブの内容を確認する

以下のように、ツールごとに実行の成否が表示されます。`go test`は成功、`gofmt`、`goimports`、`golint`は失敗していることがわかります。

<img width="1038" alt="Screen Shot 2018-03-09 at 12.03.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/118939/63de0cec-93bc-a745-04ed-f129c3412282.png">

`gofmt`などが失敗しているのは、ツールがIssueを指摘したためと考えられます。指摘したIssueをみるために、「View Report」ボタンを押します。

<img width="410" alt="Screen Shot 2018-03-09 at 12.06.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/118939/9d19d10f-35f9-8a79-50bd-63b40fb53552.png">

## 7. レポートを確認する

以下のような形式で解析結果を確認できます。

<img width="1061" alt="Screen Shot 2018-03-09 at 12.08.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/118939/88724b39-a9d2-ff16-1e0d-535992d0a055.png">

Issuesタブを開くと、ツールの指摘したIssuesが一覧できます。

<img width="477" src="https://i.imgur.com/Nj9yiQO.png">

gofmtやgoimportsがIssueを指摘しています。

解析ジョブの成否はGitHubにも自動的に反映されるので、Pull Requestから確認することもできます。

<img src="https://i.imgur.com/DVuuabl.png">

# まとめ

Inspecodeを使って、Go言語を利用したレポジトリに対して静的コード解析＋テスト実行をしてみました。最後に、今回は紹介できなかった機能を少し並べておきます。。

* [設定ファイル中の`ignore`](https://inspecode.rocro.com/help/configuration/global.html#experimental-file-filters)で特定のディレクトリを解析対象から除外できる
* [設定ファイル中の`runtime`](https://inspecode.rocro.com/help/runtimes/go.html)でGoのバージョンを指定できる。まだ1.10対応されてないですが。。
* Issueを自動修正するPull Requestの発行。[ツール一覧](https://inspecode.rocro.com/help/tools.html#go)で`auto-fix`が付いているツールが対象です。設定方法は各ツールのドキュメントを見て下さい。