Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
20
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@atotto

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

資料

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
20
Help us understand the problem. What are the problem?