version: 2.1

executors:
  go1_16:
    docker:
      - image: cimg/go:1.16
        environment:
          GO111MODULE: "on"
  go1_17:
    docker:
      - image: cimg/go:1.17
  go1_18:
    docker:
      - image: cimg/go:1.18

commands:
  gomod:
    steps:
      - restore_cache:
          keys: [deps-v2-]
      - run:
          name: Download go module dependencies
          command: go mod download
      - save_cache:
          key: deps-v2-{{ checksum "go.sum" }}-{{ checksum "go.sum" }}
          paths: [/home/circleci/go/pkg/mod]

jobs:
  lint:
    working_directory: /home/circleci/go/src/github.com/nspcc-dev/neo-go
    # TODO: temp workaround, need to upgrade to go1_18 after https://github.com/golangci/golangci-lint/issues/2649 is resolved.
    executor: go1_17
    steps:
      - checkout
      - gomod
      - run:
          name: go-lint
          command: |
            curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.44.2
            make lint

  test_1_16:
    working_directory: /home/circleci/go/src/github.com/nspcc-dev/neo-go
    executor: go1_16
    steps:
      - checkout
      - run: git submodule sync
      - run: git submodule update --init
      - gomod
      - run:
          command: go test -v -race ./...
          no_output_timeout: 15m

  test_1_17:
    working_directory: /home/circleci/go/src/github.com/nspcc-dev/neo-go
    executor: go1_17
    steps:
      - checkout
      - run: git submodule sync
      - run: git submodule update --init
      - gomod
      - run:
          command: go test -v -race ./...
          no_output_timeout: 15m

  test_1_18:
    working_directory: /home/circleci/go/src/github.com/nspcc-dev/neo-go
    executor: go1_18
    steps:
      - checkout
      - run: git submodule sync
      - run: git submodule update --init
      - gomod
      - run:
          command: go test -v -race ./...
          no_output_timeout: 15m

  build_cli:
    working_directory: /home/circleci/go/src/github.com/nspcc-dev/neo-go
    executor: go1_18
    steps:
      - checkout
      - gomod
      - run: make build
      - store_artifacts:
          path: bin
          destination: /

  build_image:
    working_directory: /home/circleci/go/src/github.com/nspcc-dev/neo-go
    executor: go1_18
    docker:
      - image: golang:1-alpine
    steps:
      - run: apk update && apk add git make curl tar
      - checkout
      - gomod
      - setup_remote_docker:
          version: 20.10.6
      - run:
          name: Install Docker client
          command: |
            set -x
            VER="20.10.6"
            curl -L -o /tmp/docker-$VER.tgz https://download.docker.com/linux/static/stable/x86_64/docker-$VER.tgz
            tar -xz -C /tmp -f /tmp/docker-$VER.tgz
            mv /tmp/docker/* /usr/bin
      - run: make image


workflows:
  version: 2
  workflow:
    jobs:
      - lint:
          filters:
            tags:
              only: v/[0-9]+\.[0-9]+\.[0-9]+/
      - test_1_16:
          filters:
            tags:
              only: v/[0-9]+\.[0-9]+\.[0-9]+/
      - test_1_17:
          filters:
            tags:
              only: v/[0-9]+\.[0-9]+\.[0-9]+/
      - test_1_18:
          filters:
            tags:
              only: v/[0-9]+\.[0-9]+\.[0-9]+/
      - build_cli:
          filters:
            tags:
              only: v/[0-9]+\.[0-9]+\.[0-9]+/
      - build_image:
          requires:
            - build_cli
          filters:
            tags:
              only: v/[0-9]+\.[0-9]+\.[0-9]+/