version: 2.1 orbs: win: circleci/windows@2.2.0 references: environment: &ENVIRONMENT TEST_RESULTS_PATH: &TEST_RESULTS_PATH /tmp/test-results WIN_TEST_RESULTS: &WIN_TEST_RESULTS c:\Users\circleci\AppData\Local\Temp\test-results commands: run-gotests: parameters: cmd: type: string platform: type: string steps: - run: name: "Run go tests" command: | PACKAGE_NAMES=$(go list ./... | circleci tests split --split-by=timings --timings-type=classname) echo "Running $(echo $PACKAGE_NAMES | wc -w) packages" echo $PACKAGE_NAMES << parameters.cmd >> --format=short-verbose --junitfile $TEST_RESULTS_PATH/go-multierror/gotestsum-report.xml -- -p 2 -cover -coverprofile=<< parameters.platform >>_cov_$CIRCLE_NODE_INDEX.part $PACKAGE_NAMES jobs: linux-tests: docker: - image: docker.mirror.hashicorp.services/circleci/golang:<< parameters.go-version >> parameters: go-version: type: string environment: <<: *ENVIRONMENT parallelism: 4 steps: - run: go version - checkout - attach_workspace: at: . - run: mkdir -p $TEST_RESULTS_PATH/go-multierror # Restore go module cache if there is one - restore_cache: keys: - linux-gomod-cache-v1-{{ checksum "go.mod" }} - run: go mod download # Save go module cache if the go.mod file has changed - save_cache: key: linux-gomod-cache-v1-{{ checksum "go.mod" }} paths: - "/go/pkg/mod" # Check go fmt output because it does not report non-zero when there are fmt changes - run: name: check go fmt command: | files=$(go fmt ./...) if [ -n "$files" ]; then echo "The following file(s) do not conform to go fmt:" echo "$files" exit 1 fi # Run go tests with gotestsum - run-gotests: cmd: "gotestsum" platform: "linux" # Save coverage report parts - persist_to_workspace: root: . paths: - linux_cov_*.part - store_test_results: path: *TEST_RESULTS_PATH - store_artifacts: path: *TEST_RESULTS_PATH windows-tests: executor: name: win/default shell: bash --login -eo pipefail environment: <<: *ENVIRONMENT working_directory: c:\gopath\src\github.com\hashicorp\go-multierror parameters: go-version: type: string gotestsum-version: type: string steps: - run: git config --global core.autocrlf false - checkout - attach_workspace: at: . - run: name: Setup (remove pre-installed go) command: | rm -rf "c:\Go" mkdir -p $TEST_RESULTS_PATH/go-multierror - restore_cache: keys: - win-golang-<< parameters.go-version >>-cache-v1 - win-gomod-cache-{{ checksum "go.mod" }}-v1 - run: name: Install go version << parameters.go-version >> command: | if [ ! -d "c:\go" ]; then echo "Cache not found, installing new version of go" curl --fail --location https://dl.google.com/go/go<< parameters.go-version >>.windows-amd64.zip --output go.zip unzip go.zip -d "/c" fi - run: command: go mod download - save_cache: key: win-golang-<< parameters.go-version >>-cache-v1 paths: - /go - save_cache: key: win-gomod-cache-{{ checksum "go.mod" }}-v1 paths: - c:\Windows\system32\config\systemprofile\go\pkg\mod - run: name: Install gotestsum command: | curl --fail --location https://github.com/gotestyourself/gotestsum/releases/download/v<< parameters.gotestsum-version >>/gotestsum_<< parameters.gotestsum-version >>_windows_amd64.tar.gz --output gotestsum.tar.gz tar -xvzf gotestsum.tar.gz - run-gotests: cmd: "./gotestsum.exe" platform: "win" # Save coverage report parts - persist_to_workspace: root: . paths: - win_cov_*.part - store_test_results: path: *WIN_TEST_RESULTS - store_artifacts: path: *WIN_TEST_RESULTS workflows: go-multierror: jobs: - linux-tests: matrix: parameters: go-version: ["1.13", "1.14", "1.15"] name: linux-test-go-<< matrix.go-version >> - windows-tests: matrix: parameters: go-version: ["1.13", "1.14", "1.15"] gotestsum-version: ["1.6.2"] name: win-test-go-<< matrix.go-version >>