LoginSignup
30
28

More than 5 years have passed since last update.

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

Posted at

何をするのか

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

  • Go Meta Linterによる複数の静的解析の一括実行
    • 十数種類ほどの解析をまとめて行ってくれる
  • goverallscoverallsによるテストのカバレッジ解析
    • coverallsの行単位での網羅箇所は見やすく、テストを書くモチベーションが上がる!
  • goxghrで、各種プラットフォーム用バイナリを作成してgithubにリリース
    • githubのリリースタグに添付してくれる

参考にしたサイト

Go+Webアプリケーション+CircleCIで静的解析・テスト・バイナリリリースを効率良く行なう

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

  • 変更点は以下
    1. goverallsを追加 ( CircleCIでgoverallsする を参考に)
    2. 静的解析をGo Meta Linterに変更
    3. バイナリリリースを、タグ追加時のみに

前提

  • 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

このような感じ

で、こんなの出来ました

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

30
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
28