go modulesの機能とCircle CIのキャッシュをうまく活用してビルドとテストを高速化してみます。
githubはこちら: https://github.com/atotto/circleci-golang-example
go modules
go modulesに関する詳細は:
があります。雑な説明だとパッケージを管理するためのツールです。go.mod
とgo.sum
の2つのファイルで構成され、それぞれ、modulesと、modulesのサムが書かれています。go modulesを利用しておけば、どんな環境でも同じバイナリをはきだせるのがウリだと思います。
今年の夏までは export GO111MODULE=on
として環境変数を設定しておきましょう。
go modules をキャッシュする
go mod download
とすると、go.modなどに書かれた依存パッケージが $GOPATH/pkg/mod/
へキャッシュされます。このディレクトリをCircle CIの save_cache
に指定すれば良さそうです。
例:
version: 2
defaults: &defaults
jobs:
setup-build:
docker:
- image: golang:stretch
working_directory: /workspace
environment:
GOPATH: /
GOCACHE: /.cache/go-build
GO111MODULE: "on"
steps:
- run: go env
- checkout
- restore_cache:
keys:
- go-module-cache-v1-{{ checksum "/workspace/go.sum" }}
- go-module-cache-v1-
- run: go mod download
- save_cache:
key: go-module-cache-v1-{{ checksum "/workspace/go.sum" }}
paths:
- /pkg/mod/cache
- save_cache:
key: workspace-v1-{{ .Environment.CIRCLE_SHA1 }}
paths:
- /workspace
go modulesを利用しているので、 working_directory
を好きなところにできます。
restore_cache
の
go-module-cache-v1-{{ checksum "/workspace/go.sum" }}
で go.sum
のチェックサムを取り、すでにキャッシュしたものを採用します。
go-module-cache-v1-
で、それまでにキャッシュしたものを採用します。
チェックサムのキャッシュがなかった場合は、 最新のキャッシュから引っ張るので、順番に書いておくと良さそうです。
go test の結果をキャッシュする
Goのテストは一度実行した結果をキャッシュする機能がありますのでこれをキャッシュしてみます。
test:
docker:
- image: golang:stretch
working_directory: /workspace
environment:
GOPATH: /
GOCACHE: /.cache/go-build
GO111MODULE: "on"
steps:
- restore_cache:
keys:
- workspace-v1-{{ .Environment.CIRCLE_SHA1 }}
- restore_cache:
keys:
- go-module-cache-v1-{{ checksum "/workspace/go.sum" }}
- go-module-cache-v1-
- restore_cache:
keys:
- go-build-cache-v1-{{ .Branch }}-{{ .Revision }}
- go-build-cache-v1-{{ .Branch }}
- go-build-cache-v1
- run: go test -v ./...
- save_cache:
key: go-build-cache-v1-{{ .Branch }}-{{ .Revision }}
paths:
- /.cache/go-build
テスト実行前に、 setup-build
でキャッシュしたworkspaceと、go modulesのキャッシュをリストアします。
テスト結果は GOCACHE
で指定した場所にあるので、そのディレクトリごとキャッシュしておくと良いです。
ワークフローにする
workflows:
version: 2
test:
jobs:
- setup-build
- test:
requires:
- setup-build
おしまい
完成品はこちら。 .circleci/config.yml