haya14busa

haya14busa’s memo

Go の CI で Lint と カバレッジ回して非人間的部分のレビューを自動化する in 2016年

この記事は Go (その3) Advent Calendar 2016 の24日目の記事です.(代打) メリークリスマス!

本記事では Go 言語プロジェクトの CI で回すと便利な各種lintの紹介やカバレッジ計測の方法について紹介します.

Go 言語おすすめ linter

Go の lint 一覧といえば gometalinter じゃん? みたいな話もあると思うのですが,CIで回すには個別のいい linterを明示的に回すほうが良いかと思います. ということで 僕が普段使ってるオススメ linter の紹介です.

go vet

Vet examines Go source code and reports suspicious constructs, such as Printf calls whose arguments do not align with the format string. Vet uses heuristics that do not guarantee all reports are genuine problems, but it can find errors not caught by the compilers.

Go 言語標準でついているlintツールで,コンパイラが検出しないエラーを検出できます. false positive な結果も無いようにデザインされているのでエラーがリポートされた場合は安心してCIをfailにできます. go vet に検出されたエラーはほぼ100%直したほうがよいでしょう.

golint

Golint differs from gofmt. Gofmt reformats Go source code, whereas golint prints out style mistakes. Golint differs from govet. Govet is concerned with correctness, whereas golint is concerned with coding style.

gofmtがコードのリフォーマットを,govetがコードの正確性をチェックするのに対して,golint は Go のソースコードの “コーディングスタイル” の問題を報告します.これはエラーというよりも “suggestion” に近く, 基本的に従っていたほうがGoの慣習に沿った確実によいコードになるのですが, まれに,いやここの関数はコメント書かなくても絶対いいよね…とかいうケースもあり 若干消耗することもあるので星4です.

errcheck

errcheck は関数のエラーの返り値をハンドリングチェックしているかどうかを静的に解析してくれるツールです. エラーを捨てた状態の場合思わぬ動作(nilになってたりだとか)するので,これをチェックしてくれるのは大変嬉しいです.

ただし,少し実際直さなくてもいいという意味でのfalse positive が多くCIで動かすには工夫が必要で星3です.エラーをチェックしてくれるという便利度は満点. なお,最近は標準ライブラリで必ずエラーnilとして返ってくるような関数についてはリポートしないという false positive を減らす工夫もされているようです.

staticcheck

staticcheck は一言で言うとサードパーティーの go vetです.go vet でチェックされていないようなことを静的に解析してくれます. (例えば正規表現がvalidかチェックしてくれるかなどなど…たくさん項目があるのでREADMEを見てみてください.)

作者の dominikh さん は Go 言語の開発にも関わっていて,dominikh さん製Go lint ツールは個人的には 信頼できる印象です.github/go の issue でも go vet のissueなどに, staticcheck は実際こういうのチェックしてるけどと言った感じで参照されてたりするのを見かけます.

そして次の2つのツールも dominikh さん製です.

gosimple

TODO: すいませんもうチョット追記しますが,一旦アドベントカレンダー25締め切りのために登録します!

Comments