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: