ちょっと話題の記事

無料で使える Go 言語の CI サービス『GolangCI』を使ってみる

public な GitHub リポジトリなら無料で使用できる Go 言語の CI サービス 『GolangCI』 の紹介です。
2018.10.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

GolangCI とは

GolangCI | Automated code review for Go

GolangCI は GitHub の Pull Request の問題を検知してコメントしてくれる Go 言語用の CI サービスです。

OSS で公開されており、public なリポジトリならなんと無料で使用することができます。

対応している Linter

GolangCI の Web ページに記載してあるものを書きます。

実際はもっと種類があるので、詳細は GitHub のドキュメント を見ましょう。

  • gofmt
  • goimports
  • go vet
  • golint
  • errcheck
    • チェックされていない error の検出
  • staticcheck
    • 静的解析チェック
  • unused
    • 使用されていない定数、変数、関数、Type を検出
  • gosimple
    • コードを簡素化できるとこを検出
  • gas
    • セキュリティの問題を検出
  • structcheck
    • 未使用の構造体フィールドを検出
  • varcheck
    • 未使用のグローバル変数と定数を検出
  • interfacer
    • 引数の型とかをインタフェースにしようみたいな提案をしてくれる
  • unconvert
    • 必要のないキャストの削除
  • ineffassign
    • 意味のない代入の検出
  • goconst
    • 定数で置き換えることができる繰り返し文字列を検出
  • deadcode
    • 未使用のコードを検出

注: Web ページでは上記 Linter がデフォルトで使用されると書いてありますが、GitHub ドキュメントの記載が最新で Web ページの方は更新されてないように見受けられました。(要検証)

使ってみる

準備

GolangCI の Web ページにアクセスして 「Signup via GitHub」 をクリックします。

クリックすると GitHub に遷移するので、権限を確認の上、承認してあげましょう。

GolangCI のサイトに戻り、どのリポジトリに適用するかの画面に遷移するので、適用したいリポジトリを選んで 「Connect」 を押します。

ここまで完了すれば GolangCI を使用する準備は完了です。

PR を投げてみる

適当な PR を投げて見ましょう。Linter の効果を確認するためにわざとダメなソースコードで PR を作成します。

package main

import (
    "errors"
    "fmt"
)

// 使用されない定数
const Url = "http://example.com"

type Person struct {
    name string
    // 使用されない
    age int
}

func main() {
    // 意味のない代入
    ineffassign := "hoge"
    ineffassign  = "ineffassign"

    fmt.Println(ineffassign)

    person := &Person{name:"hoge"}
    fmt.Println(person.name)

    // エラーチェックしない
    returnError()
}

func returnError() error {
    fmt.Println("return error")
    return errors.New("new error")
}

// 使用されない関数
func unused() {
    fmt.Println("unused")
}
$ go run main.go
ineffassign
hoge
return error

コンパイルが通るまでは確認できました。ではこのソースを push して PR を作成して見ます。

GolangCI に怒られました。内容を見て見ましょう。

しっかり意図した通りに怒られましたね。PR にコメントという形で指摘をしてくれるので GitHub 上で参照することができ、問題になった箇所のコードもわかりやすくなるのでいい感じです。

デフォルト以外の Linter を使用したい場合は .golangci.yml を記載することでカスタマイズも可能です。

修正する

怒られた箇所を修正(コメントアウト)して再度 push します。

通りましたね。

「Details」 をクリックすると GolangCI のページに遷移し、詳細なレポートを確認することができます。

以上が GolangCI の基本的な使い方になります。

最後に

いかがでしたでしょうか。個人的には導入がめっちゃ簡単で特に設定とかしなくても使える点とか、GitHub の PR にコメントで指摘してくれるのとかはとても良いなと感じました。public なリポジトリなら無料で使えるのでとりあえず感覚で自分のリポジトリに導入して見て使って見るのもおすすめです。

GolangCI は OSS なので Linter も普通に GitHub で公開されています。

golangci/golangci-lint

ドキュメントを読んでみると Go Meta Linter より高速に動作するとか、VScode などのエディタと統合できるよとか、ローカルや他の CI サービス上での動かし方とかも載ってるので、この記事を読んで興味が出た方はぜひ読んでみてください。