Posted at

go modulesとCircle CIのキャッシュを使ってビルド&テストを高速化する

go modulesの機能とCircle CIのキャッシュをうまく活用してビルドとテストを高速化してみます。

githubはこちら: https://github.com/atotto/circleci-golang-example


go modules

go modulesに関する詳細は:

があります。雑な説明だとパッケージを管理するためのツールです。go.modgo.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


image.png


おしまい

完成品はこちら。 .circleci/config.yml


資料