version: 2

jobs:
  litmus_daily:
    machine: true
    steps:
      - attach_workspace:
          at: ~/project
      - run: docker login -u=$QUAY_USER -p=$QUAY_PASS quay.io
      - run: docker run --entrypoint "./run_litmus_tests_oss.sh" -e ONE_TEST=src/cloud/rest_api/smoke/test_smoke.py -e BINARYPATH=/Litmus/result/bin/linux/influxd -e BOLTPATH=/Litmus/result/influxd_test/influxd.bolt -e ENGINEPATH=/Litmus/result/influxd_test --net host -v /var/run/docker.sock:/var/run/docker.sock -v ~/project:/Litmus/result quay.io/influxdb/litmus:latest
      - run:
          name: Litmus Smoke Tests Success
          when: on_success
          command: bash ~/project/etc/litmus_success_notify.sh Smoke
          path: ~/project
      - run:
          name: Litmus Smoke Tests Fail
          when: on_fail
          command: bash ~/project/etc/litmus_fail_notify.sh Smoke
      - store_artifacts:
          path: ~/project
          destination: raw-daily-output
      - store_test_results:
          path: ~/project
          destination: daily-junit
  litmus_nightly:
    machine: true
    steps:
      - attach_workspace:
          at: ~/project
      - run: docker login -u=$QUAY_USER -p=$QUAY_PASS quay.io
      - run: docker run --entrypoint "./run_litmus_tests_oss.sh" -e TEST_LIST=tests_lists/gateway_api_tests.list -e DOCKERIMAGE=true --net host -v /var/run/docker.sock:/var/run/docker.sock -v ~/project:/Litmus/result quay.io/influxdb/litmus:latest
      - run:
          name: Litmus Nightly Tests Success
          when: on_success
          command: bash ~/project/etc/litmus_success_notify.sh Nightly
      - run:
          name: Litmus Nightly Tests Fail
          when: on_fail
          command: bash ~/project/etc/litmus_fail_notify.sh Nightly
      - store_artifacts:
          path: ~/project
          destination: raw-nightly-output
      - store_test_results:
          path: ~/project
          destination: nightly-junit
  e2e:
    docker:
      - image: circleci/golang:1.12-node-browsers
    environment:
      GOCACHE: /tmp/go-cache
      GOFLAGS: '-mod=readonly -p=4' # Go on Circle thinks 32 CPUs are available, but there aren't.
    working_directory: /go/src/github.com/influxdata/influxdb
    steps:
      - checkout

      # Speed up `make build` by restoring caches from previous runs.
      - restore_cache:
          name: Restoring GOCACHE
          keys:
            - influxdb-gocache- # Just match the most recent Go cache.
      - restore_cache:
          name: Restoring GOPATH/pkg/mod
          keys:
            - influxdb-gomod-{{ checksum "go.sum" }} # Just match the go.sum checksum cache.
      - run: sudo apt-get install -y netcat-openbsd
      - run: sudo apt-get install -y bzr
      - run: make protoc
      - run: make build
      - run:
          command: ./bin/linux/influxd --store=memory --e2e-testing=true
          background: true
      - run: make e2e
      - store_test_results:
          path: ui/junit-results
          destination: junit-results
      - store_artifacts:
          path: ui/cypress/videos
          destination: videos
      - store_artifacts:
          path: ui/cypress/screenshots
          destination: screenshots
  jstest:
    docker:
      - image: circleci/golang:1.12-node-browsers
    working_directory: /go/src/github.com/influxdata/influxdb
    steps:
      - checkout
      - run: make node_modules
      - run: make ui_client
      - run: make test-js
      - run: make chronograf_lint

  gotest:
    docker:
      - image: circleci/golang:1.12
    environment:
      GOCACHE: /tmp/go-cache
      GOFLAGS: '-mod=readonly -p=2' # Go on Circle thinks 32 CPUs are available, but there aren't.
      TEST_RESULTS: /tmp/test-results
    working_directory: /go/src/github.com/influxdata/influxdb
    steps:
      - checkout

      # Populate GOCACHE.
      - restore_cache:
          name: Restoring GOCACHE
          keys:
            - influxdb-gocache-{{ .Branch }}-{{ .Revision }} # Matches when retrying a single run.
            - influxdb-gocache-{{ .Branch }}- # Matches a new commit on an existing branch.
            - influxdb-gocache- # Matches a new branch.
      # Populate GOPATH/pkg.
      - restore_cache:
          name: Restoring GOPATH/pkg/mod
          keys:
            - influxdb-gomod-{{ checksum "go.sum" }} # Matches based on go.sum checksum.
      - run: sudo apt-get install -y bzr
      - run: mkdir -p $TEST_RESULTS
      - run: make test-go # This uses the test cache so it may succeed or fail quickly.
      - run: make vet
      - run: make checkfmt
      - run: make checktidy
      - run: GOTRACEBACK=all GO111MODULE=on gotestsum --format standard-verbose --junitfile /tmp/test-results/gotestsum.xml -- -race -count=1 ./...
      # TODO add these checks to the Makefile
      # - run: go get -v -t -d ./...
      - run: GO111MODULE=on go mod vendor # staticcheck looks in vendor for dependencies.
      - run: GO111MODULE=on go install honnef.co/go/tools/cmd/staticcheck # Install staticcheck from the version we specify in go.mod.
      - run: staticcheck ./...

      - save_cache:
          name: Saving GOCACHE
          key: influxdb-gocache-{{ .Branch }}-{{ .Revision }}
          paths:
            - /tmp/go-cache
          when: always
      - save_cache:
          name: Saving GOPATH/pkg/mod
          key: influxdb-gomod-{{ checksum "go.sum" }}
          paths:
            - /go/pkg/mod
          when: always
      - store_artifacts: # Upload test summary for display in Artifacts: https://circleci.com/docs/2.0/artifacts/
          path: /tmp/test-results
          destination: raw-test-output
      - store_test_results: # Upload test results for display in Test Summary: https://circleci.com/docs/2.0/collect-test-data/
          path: /tmp/test-results
  build:
    docker:
      - image: circleci/golang:1.12-node-browsers
    environment:
      GOCACHE: /tmp/go-cache
      GOFLAGS: '-mod=readonly -p=4' # Go on Circle thinks 32 CPUs are available, but there aren't.
    working_directory: /go/src/github.com/influxdata/influxdb
    steps:
      - checkout
      - run: sudo apt-get install -y bzr
      - run: make checkcommit

      # Speed up `make build` by restoring caches from previous runs.
      - restore_cache:
          name: Restoring GOCACHE
          keys:
            - influxdb-gocache- # Just match the most recent Go cache.
      - restore_cache:
          name: Restoring GOPATH/pkg/mod
          keys:
            - influxdb-gomod-{{ checksum "go.sum" }} # Just match the go.sum checksum cache.
      - run: make protoc
      - run: make build
      - persist_to_workspace:
          root: .
          paths:
            - project
            - bin/linux/influxd
            - bin/linux/influx
            - etc/litmus_success_notify.sh
            - etc/litmus_fail_notify.sh
  deploy-nightly:
    docker:
      - image: circleci/golang:1.12-node-browsers
    environment:
      GOCACHE: /tmp/go-cache
      GOFLAGS: '-mod=readonly -p=4' # Go on Circle thinks 32 CPUs are available, but there aren't.
    working_directory: /go/src/github.com/influxdata/influxdb
    steps:
      - checkout

      # Speed up `make nightly` by restoring caches from previous runs.
      - restore_cache:
          name: Restoring GOCACHE
          keys:
            - influxdb-gocache- # Just match the most recent Go cache.
      - restore_cache:
          name: Restoring GOPATH/pkg/mod
          keys:
            - influxdb-gomod-{{ checksum "go.sum" }} # Just match the go.sum checksum cache.
      - setup_remote_docker
      - run:
          name: 'Docker Login'
          command: docker login -u "$QUAY_USER" -p $QUAY_PASS quay.io
      - run: sudo apt-get install -y bzr
      - run: make protoc # installs protoc
      - run:
          name: 'Build nightly'
          command: make nightly
      - persist_to_workspace:
          root: .
          paths:
            - etc/litmus_success_notify.sh
            - etc/litmus_fail_notify.sh

  release:
    docker:
      - image: circleci/golang:1.12-node-browsers
    environment:
      GOCACHE: /tmp/go-cache
      GOFLAGS: '-mod=readonly -p=4' # Go on Circle thinks 32 CPUs are available, but there aren't.
      DOCKER_VERSION: 2.0.0-alpha
    working_directory: /go/src/github.com/influxdata/influxdb
    steps:
      - checkout

      # Speed up `make nightly` by restoring caches from previous runs.
      - restore_cache:
          name: Restoring GOCACHE
          keys:
            - influxdb-gocache- # Just match the most recent Go cache.
      - restore_cache:
          name: Restoring GOPATH/pkg/mod
          keys:
            - influxdb-gomod-{{ checksum "go.sum" }} # Just match the go.sum checksum cache.
      - setup_remote_docker
      - run:
          name: 'Docker Login'
          command: docker login -u "$QUAY_USER" -p $QUAY_PASS quay.io
      - run: sudo apt-get install -y bzr
      - run: make protoc # installs protoc
      - run:
          name: 'Build release'
          command: make release

workflows:
  version: 2
  build:
    jobs:
      - gotest
      - jstest
      - build
      - litmus_daily:
          requires:
            - build
          filters:
            branches:
              only: /^(?!pull\/).*$/
  e2e:
    jobs:
      - e2e
  nightly:
    triggers:
      - schedule:
          cron: '0 7 * * *'
          filters:
            branches:
              only:
                - master
    jobs:
      - gotest
      - jstest
      - deploy-nightly:
          requires:
            - gotest
            - jstest
          filters:
            branches:
              only: master
      - litmus_nightly:
          requires:
            - deploy-nightly

  release:
    jobs:
      - gotest:
          filters:
            branches:
              ignore: /.*/
            tags:
              only: /^v[0-9]+\.[0-9]+\.[0-9]+-alpha\.[0-9]+$/

      - jstest:
          filters:
            branches:
              ignore: /.*/
            tags:
              only: /^v[0-9]+\.[0-9]+\.[0-9]+-alpha\.[0-9]+$/
      - release:
          requires:
            - gotest
            - jstest
          filters:
            branches:
              ignore: /.*/
            tags:
              only: /^v[0-9]+\.[0-9]+\.[0-9]+-alpha\.[0-9]+$/