version: 2 # global environment variables # '& ' syntax is a YAML thing for creating referenceable documents env-shared: &env-shared environment: GOFLAGS: "-mod=vendor" # build steps shared across different jobs build-shared: &build-shared steps: - checkout - run: name: Run gofmt -s command: | if [ $(find . ! -path "./vendor/*" -name "*.go" -exec gofmt -s -d {} \;|wc -l) -gt 0 ]; then find . ! -path "./vendor/*" -name "*.go" -exec gofmt -s -d {} \; exit 1; fi - restore_cache: keys: - pkg-cache-{{ checksum "go.sum" }}-v5 - run: name: Run tests command: | go test -v ./... - run: name: Get gox # -mod=vendor doesn't work with go get while in source tree with go.mod in it working_directory: "/tmp" command: | go get github.com/mitchellh/gox - run: name: Compile project on every platform command: | gox -parallel 10 -os "linux freebsd" -osarch "darwin/i386 darwin/amd64 windows/i386 windows/amd64" - save_cache: key: pkg-cache-{{ checksum "go.sum" }}-v5 paths: - ~/.cache/go-build jobs: # matrix build jobs run on every commit # building on versioned Go and the latest one # '<<: *' syntax is a YAML thing for including documents "golang:1.17": <<: *env-shared <<: *build-shared docker: - image: circleci/golang:1.17 "golang:latest": <<: *env-shared <<: *build-shared docker: - image: circleci/golang:latest # release job run only when a commit is tagged release: <<: *env-shared docker: - image: circleci/golang:1.17 steps: - checkout - run: name: Run gorelease command: | curl -sL https://git.io/goreleaser | bash - run: name: Update docs command: | ./.circleci/update_docs.sh workflows: version: 2 build: jobs: # build matrix - "golang:1.17" - "golang:latest" release: jobs: - release: filters: tags: only: /v[0-9]+(\.[0-9]+)*/ branches: ignore: /.*/