LoginSignup
29
20

More than 5 years have passed since last update.

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

Posted at

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

資料

29
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
20