golangの静的解析,カバレッジ解析,バイナリリリースをCircleCIで簡単に整える


## 何をするのか

以下の作業をまるっとCircleCIでやる！

* [Go Meta Linter](https://github.com/alecthomas/gometalinter)による複数の静的解析の一括実行
  * 十数種類ほどの解析をまとめて行ってくれる
* [goveralls](https://github.com/mattn/goveralls)と[coveralls](https://coveralls.io)によるテストのカバレッジ解析
  * coverallsの行単位での網羅箇所は見やすく、テストを書くモチベーションが上がる！
* [gox](https://github.com/mitchellh/gox)と[ghr](https://github.com/tcnksm/ghr)で、各種プラットフォーム用バイナリを作成してgithubにリリース
  * githubのリリースタグに添付してくれる


## 参考にしたサイト

[Go+Webアプリケーション+CircleCIで静的解析・テスト・バイナリリリースを効率良く行なう](http://qiita.com/kaneshin/items/163626c09c1ad9818c6c)

殆どこちらの情報から得た内容なので、まずこちらを一読した方が良さそう

* 変更点は以下
  1. goverallsを追加 ( [CircleCIでgoverallsする](http://qiita.com/kyokomi/items/363ee3e785311a577c20) を参考に)
  2. 静的解析をGo Meta Linterに変更
  3. バイナリリリースを、タグ追加時のみに 



## 前提

* GitHubにGoのソースコードがある
* coveralls登録済み
* CircleCI登録済み

## GitHub tokenの作成

[Creating a token](https://help.github.com/articles/creating-an-access-token-for-command-line-use/#creating-a-token) の手順通りに進める
途中の```scopes```の設定は、```repo```の大項目だけにチェックを付けること、他の権限は不要



## coverallsサイトでの作業

repo_tokenの取得

左にある```REPOS```タブを開いて、右上に出る```ADD REPOS```より、
```RE-SYNC REPOS```でgithubのリポジトリ一覧を同期して、
対象のリポジトリを```ON```にする。
ONにすると```DETAILS```ボタンが出るのでそちらをクリック

```
repo_token: xxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
のように表示されいてるこちらを使います。



## circle.yml の作成

最初にcircle.ymlの完成系を載せておく

```yaml:circle.yml
# circle.yml
machine:
  environment:
    CHECKOUT_PATH: $HOME/$CIRCLE_PROJECT_REPONAME
  post:
    - echo "export BUILD_DATE=\"`date +%FT%T%z`\"" >> ~/.circlerc
    - cat ~/.circlerc|sed 's/.*GITHUB_TOKEN.*//g'|sed 's/.*COVERALLS_TOKEN.*//g'
dependencies:
  pre:
    - git tag -l
    - go get github.com/axw/gocov/gocov
    - go get github.com/mattn/goveralls
    - go get -u github.com/alecthomas/gometalinter
    - gometalinter --install
test:
  override:
    - go get -v -t ./...
    - test -z "$(gofmt -s -l . | tee /dev/stderr)"
    - gometalinter --deadline 30s ./...
    - go test -race -test.v ./...
    - goveralls -v -service=circle-ci -repotoken $COVERALLS_TOKEN ./tcpproxy
deployment:
  release:
     tag: /v.*/
     commands:
     - go get github.com/mitchellh/gox
     - go get github.com/tcnksm/ghr
     - gox --osarch "linux/amd64 darwin/amd64" -ldflags "-X main.Version=$(git describe --always --dirty) -X main.Date=$BUILD_DATE" -output "dist/${CIRCLE_PROJECT_REPONAME}_{{.OS}}_{{.Arch}}"
     - ghr -t $GITHUB_TOKEN -u $CIRCLE_PROJECT_USERNAME -r $CIRCLE_PROJECT_REPONAME --replace `git describe --tags` dist/

```

#### 補足

 * goveralls の```./tcpproxy```は、解析させたいディレクトリを指定しているので変更の余地あり（手抜きだ）
 * その他の部分については依存がないよう汎用的に書いたつもり

#### [Go Meta Linter](https://github.com/alecthomas/gometalinter) が素晴らしい

```bash:
go get -u github.com/alecthomas/gometalinter
gometalinter --install
gometalinter ./...
```
だけで10種類以上の静的解析が終わる！これ以上ないお手軽さだと思われる。

* ```--deadline 30s``` をつけているのは、静的解析に時間が掛かる場合にwarningを出さないようにするため

#### バイナリリリース

```yaml:circle.yml
deployment:
  release:
     tag: /v.*/
```
としているのは、 ```v```から始まるtagが追加された場合だけ、releaseが動作するようにしたかったため
これは、masterへのpullreqだけでもリリースが動いてしまうを避けるのと、
必ずmaster更新時に必要かどうかというとそうでもないので

タグの追加は

```bash:
git tag -a v1.0.2 -m 'version 1.0.2'
push origin v1.0.2
```
このような感じ  

## で、こんなの出来ました

これでお試しに作ったリポジトリがこちら

https://github.com/masahide/iriguchikun