---
version: 2.1

orbs:
  prometheus: prometheus/prometheus@0.4.0
  go: circleci/go@0.2.0
  win: circleci/windows@2.3.0

executors:
  # Whenever the Go version is updated here, .promu.yml
  # should also be updated.
  golang:
    docker:
    - image: circleci/golang:1.13-node

  fuzzit:
    docker:
      - image: fuzzitdev/golang:1.12.7-buster

jobs:
  test:
    executor: golang

    steps:
    - prometheus/setup_environment
    - go/load-cache:
        key: v1
    - restore_cache:
        keys:
        - v1-npm-deps-{{ checksum "web/ui/react-app/yarn.lock" }}
        - v1-npm-deps-
    - run:
        command: make
        environment:
          # Run garbage collection more aggressively to avoid getting OOMed during the lint phase.
          GOGC: "20"
          # By default Go uses GOMAXPROCS but a Circle CI executor has many
          # cores (> 30) while the CPU and RAM resources are throttled. If we
          # don't limit this to the number of allocated cores, the job is
          # likely to get OOMed and killed.
          GOOPTS: "-p 2"
          GOMAXPROCS: "2"
    - prometheus/check_proto:
        version: "3.11.4"
    - prometheus/store_artifact:
        file: prometheus
    - prometheus/store_artifact:
        file: promtool
    - go/save-cache:
        key: v1
    - save_cache:
        key: v1-npm-deps-{{ checksum "web/ui/react-app/yarn.lock" }}
        paths:
        - web/ui/react-app/node_modules
    - store_test_results:
        path: test-results
  test_windows:
    executor: win/default
    working_directory: /go/src/github.com/prometheus/prometheus
    steps:
    - checkout
    - run:
        shell: bash
        command: |
          (cd web/ui && GOOS= GOARCH= go generate -mod=vendor)
          go test -mod=vendor -test.v `go list ./...|grep -Exv "(github.com/prometheus/prometheus/discovery.*|github.com/prometheus/prometheus/config|github.com/prometheus/prometheus/web)"`
        environment:
          GOGC: "20"
          GOOPTS: "-p 2 -mod=vendor"
  fuzzit_regression:
    executor: fuzzit
    working_directory: /go/src/github.com/prometheus/prometheus
    steps:
      - checkout
      - setup_remote_docker
      - run: ./fuzzit.sh local-regression
  fuzzit_fuzzing:
    executor: fuzzit
    working_directory: /go/src/github.com/prometheus/prometheus
    steps:
      - checkout
      - setup_remote_docker
      - run: ./fuzzit.sh fuzzing

  makefile_sync:
    executor: golang
    steps:
    - checkout
    - run: ./scripts/sync_makefiles.sh

workflows:
  version: 2
  prometheus:
    jobs:
    - test:
        filters:
          tags:
            only: /.*/
    - test_windows:
        filters:
          tags:
            only: /.*/
    - fuzzit_regression:
        filters:
          tags:
            only: /.*/
    - prometheus/build:
        name: build
        filters:
          tags:
            only: /.*/
    - prometheus/publish_master:
        context: org-context
        requires:
        - test
        - build
        filters:
          branches:
            only: master
        image: circleci/golang:1-node
    - prometheus/publish_release:
        context: org-context
        requires:
        - test
        - build
        filters:
          tags:
            only: /^v[0-9]+(\.[0-9]+){2}(-.+|[^-.]*)$/
          branches:
            ignore: /.*/
        image: circleci/golang:1-node
  nightly:
    triggers:
      - schedule:
          cron: "0 0 * * *"
          filters:
            branches:
              only:
                - master
    jobs:
    - makefile_sync:
        context: org-context
    - fuzzit_fuzzing:
        context: org-context
