version: 2

jobs:

  lint:
    working_directory: /work
    docker: [{image: 'docker:17.06-git'}]
    steps:
      - checkout
      - setup_remote_docker:
            reusable: true
            exclusive: false
      - run:
          command: docker version
      - run:
          name: "Lint"
          command: |
            dockerfile=dockerfiles/Dockerfile.lint
            echo "COPY . ." >> $dockerfile
            docker build -f $dockerfile --tag cli-linter:$CIRCLE_BUILD_NUM .
            docker run --rm cli-linter:$CIRCLE_BUILD_NUM

  cross:
    working_directory: /work
    docker: [{image: 'docker:17.06-git'}]
    parallelism: 3
    steps:
      - checkout
      - setup_remote_docker:
            reusable: true
            exclusive: false
      - run:
          name: "Cross"
          command: |
            dockerfile=dockerfiles/Dockerfile.cross
            echo "COPY . ." >> $dockerfile
            docker build -f $dockerfile --tag cli-builder:$CIRCLE_BUILD_NUM .
            name=cross-$CIRCLE_BUILD_NUM-$CIRCLE_NODE_INDEX
            docker run \
                -e CROSS_GROUP=$CIRCLE_NODE_INDEX \
                --name $name cli-builder:$CIRCLE_BUILD_NUM \
                make cross
            docker cp \
                $name:/go/src/github.com/docker/cli/build \
                /work/build
      - store_artifacts:
          path: /work/build

  test:
    working_directory: /work
    docker: [{image: 'docker:17.06-git'}]
    steps:
      - checkout
      - setup_remote_docker:
            reusable: true
            exclusive: false
      - run:
          name: "Unit Test with Coverage"
          command: |
            dockerfile=dockerfiles/Dockerfile.dev
            echo "COPY . ." >> $dockerfile
            docker build -f $dockerfile --tag cli-builder:$CIRCLE_BUILD_NUM .
            docker run --name \
                test-$CIRCLE_BUILD_NUM cli-builder:$CIRCLE_BUILD_NUM \
                make test-coverage

      - run:
          name: "Upload to Codecov"
          command: |
            docker cp \
                test-$CIRCLE_BUILD_NUM:/go/src/github.com/docker/cli/coverage.txt \
                coverage.txt
            apk add -U bash curl
            curl -s https://codecov.io/bash | bash

  validate:
    working_directory: /work
    docker: [{image: 'docker:17.06-git'}]
    steps:
      - checkout
      - setup_remote_docker:
            reusable: true
            exclusive: false
      - run:
          name: "Validate Vendor, Docs, and Code Generation"
          command: |
            dockerfile=dockerfiles/Dockerfile.dev
            echo "COPY . ." >> $dockerfile
            rm -f .dockerignore # include .git
            docker build -f $dockerfile --tag cli-builder-with-git:$CIRCLE_BUILD_NUM .
            docker run --rm cli-builder-with-git:$CIRCLE_BUILD_NUM \
                make -B vendor compose-jsonschema manpages yamldocs
  shellcheck:
    working_directory: /work
    docker: [{image: 'docker:17.06-git'}]
    steps:
      - checkout
      - setup_remote_docker
      - run:
          name: "Run shellcheck"
          command: |
            dockerfile=dockerfiles/Dockerfile.shellcheck
            echo "COPY . ." >> $dockerfile
            docker build -f $dockerfile --tag cli-validator:$CIRCLE_BUILD_NUM .
            docker run --rm cli-validator:$CIRCLE_BUILD_NUM \
                make -B shellcheck
workflows:
  version: 2
  ci:
    jobs:
      - lint
      - cross
      - test
      - validate
      - shellcheck
