CircleCI config for multipackage Golang projects

Multipackage Golang project - project, consisting of several packages. When testing you usually do something like go test ./..., when getting all the dependencies - go get ./.... There may be or may not be a Go package at the root level. Examples: 1, 2.

If you are using glide or other package manager:

---
machine:
  environment:
    PROJECT_GOPATH: "${HOME}/.go_project"
    PROJECT_PARENT_PATH: "${PROJECT_GOPATH}/src/github.com/${CIRCLE_PROJECT_USERNAME}"
    PROJECT_PATH: "${PROJECT_PARENT_PATH}/${CIRCLE_PROJECT_REPONAME}"
    GOPATH: "${PROJECT_GOPATH}"
    GO15VENDOREXPERIMENT: 1

dependencies:
  cache_directories:
    - "~/.glide"
  pre:
    - go get -u -v github.com/Masterminds/glide
  override:
    - mkdir -p "$PROJECT_PARENT_PATH"
    - ln -sf "$HOME/$CIRCLE_PROJECT_REPONAME/" "$PROJECT_PATH"
    - cd "$PROJECT_PATH" && glide install
  post:
    - go version
    - glide -v

test:
  override:
    - cd "$PROJECT_PATH" && go test -v $(glide novendor)

Also, if you want to store your test’s output as CircleCI artifact on S3:

test:
  override:
    - cd "$PROJECT_PATH" && go test -v $(glide novendor) 2>&1 | tee test.log
  post:
    - cd "$PROJECT_PATH" && mv test.log "${CIRCLE_ARTIFACTS}"

$(glide novendor) could be replaced with $(shell go list ./... | grep -v '/vendor/'). The former is just shorter.

You might be asking yourself: where is the example using simple go get? I won’t give you one because I was not able to get go get working on CircleCI for our project.

The errors were as follows:

package _/home/ubuntu/.go_project/src/github.com/tendermint/tendermint/benchmarks: unrecognized import path "_/home/ubuntu/.go_project/src/github.com/tendermint/tendermint/benchmarks" (import path does not begin with hostname)
...

One small advice:

install yamllint and check your config file. If your config contains the syntax errors, CircleCI will output “Action failed: Configure the build”. Very descriptive, right?

Resources:

Comments

comments powered by Disqus