Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

資料

groove-x
世界のどこにもない、心を満たすロボットを。私たちGROOVE Xは2015年に設立したスタートアップです。私たちの考えるロボットは、人々の生活に潤いを与える存在として、人が一緒にいたくなるような新世代の家庭用ロボットです。便利さや機能性ではなく、家族や伴侶として愛される存在になれるかどうか。 GROOVE Xが追求するのはあなたの感性の領域に訴えるロボットです。
https://groove-x.com/
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした