何をするのか
以下の作業をまるっとCircleCIでやる!
-
Go Meta Linterによる複数の静的解析の一括実行
- 十数種類ほどの解析をまとめて行ってくれる
-
goverallsとcoverallsによるテストのカバレッジ解析
- coverallsの行単位での網羅箇所は見やすく、テストを書くモチベーションが上がる!
-
goxとghrで、各種プラットフォーム用バイナリを作成してgithubにリリース
- githubのリリースタグに添付してくれる
参考にしたサイト
Go+Webアプリケーション+CircleCIで静的解析・テスト・バイナリリリースを効率良く行なう
殆どこちらの情報から得た内容なので、まずこちらを一読した方が良さそう
- 変更点は以下
- goverallsを追加 ( CircleCIでgoverallsする を参考に)
- 静的解析をGo Meta Linterに変更
- バイナリリリースを、タグ追加時のみに
前提
- GitHubにGoのソースコードがある
- coveralls登録済み
- CircleCI登録済み
GitHub tokenの作成
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の完成系を載せておく
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 が素晴らしい
go get -u github.com/alecthomas/gometalinter
gometalinter --install
gometalinter ./...
だけで10種類以上の静的解析が終わる!これ以上ないお手軽さだと思われる。
-
--deadline 30s
をつけているのは、静的解析に時間が掛かる場合にwarningを出さないようにするため
バイナリリリース
circle.yml
deployment:
release:
tag: /v.*/
としているのは、 v
から始まるtagが追加された場合だけ、releaseが動作するようにしたかったため
これは、masterへのpullreqだけでもリリースが動いてしまうを避けるのと、
必ずmaster更新時に必要かどうかというとそうでもないので
タグの追加は
git tag -a v1.0.2 -m 'version 1.0.2'
push origin v1.0.2
このような感じ
で、こんなの出来ました
これでお試しに作ったリポジトリがこちら