Golang で lint と test をしたい時の CircleCI の config.yml

https://brandfolder.com/circleci

TL;DR

https://gist.github.com/d-kuro/664bdc199ad8c95bbde8f9259e168f39

やりたいこと

  • Go Modules を用いた依存関係の解決
  • lint
  • test

これだけ。最低限実行しなきゃいけないものだけできていればいいかなという感じ。

Go Modules

commands:
go_mod_download:
steps:
- restore_cache:
name: Restore go modules cache
keys:
- go-modules-{{ checksum "go.sum" }}

- run: go mod download

- save_cache:
name: Save go modules cache
key: go-modules-{{ checksum "go.sum" }}
paths:
- "/go/pkg/mod"

go mod download というコマンドを使って依存パッケージのダウンロードを行います。事前にGO111MODULE という環境変数に on を突っ込んでおきます。

Go Modules でダウンロードしたあれこれの保存場所は $GOPATH/pkg/mod になるのでそこをキャッシュするようにしています。

Lint

https://github.com/golangci/golangci-lint

Lint は GolangCI-Lint を実行します。

GolangCI-Lint は Golang のいろんな Linter をまとめて実行してくれるやつです。ここら辺の話は「GolangCI を使ってコードの品質を保ちながら快適な Golang 生活を送る話」というタイトルである勉強会で LT をしているので、その資料をそのまま貼ります。

https://speakerdeck.com/daikurosawa/golangci

今回は複数人で開発する用に最低限の Linter を実行するようにしています。

  • goimports
  • golint
  • govet
  • errcheck
  • staticcheck

Test

特別書くことがない。

race オプションをつけとくとデータ競合を検知してくれます。

まとめ

最低限の Lint と Test だけならこれを使い回せば大丈夫かなって思ってます。CircleCI 2.1 のことを完全に理解してないのでもっといい書き方とかあれば改善していきたい。

おまけ

Go Modules を用いた依存解決は CircleCI Orbs が公開されていたりします。

https://circleci.com/orbs/registry/orb/timakin/go-module

--

--

--

SoftwareEngineer

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Dai Kurosawa

Dai Kurosawa

SoftwareEngineer

More from Medium

How to Use Sync.WaitGroup to Wait Goroutines in Go?

Golang Errgroup Package

Golang — basic unit testing and benchmarking

golang: NewReader vs NewBufferString