.circleci/config.yml

Summary

Maintainability
Test Coverage
version: 2.1
defaults: &defaults
  working_directory: ~/repo
  docker:
    - image: circleci/ruby:2.6
      environment:
        BUNDLE_PATH: vendor/bundle

commands:
  prepare:
    description: "Common preparation steps"
    steps:
      - checkout
      - restore_cache:
          keys:
            - v1-dependencies-{{ checksum "Gemfile.lock" }}
            # fallback to using the latest cache if no exact match is found
            - v1-dependencies-
      - run:
          name: install bundler
          command: |
            gem install bundler -v 2.2.16

      - run:
          name: install dependencies
          command: |
            bundle config set path 'vendor/bundle'
            bundle install --jobs=4 --retry=3
      - save_cache:
          paths:
            - ./vendor/bundle
          key: v1-dependencies-{{ checksum "Gemfile.lock" }}

jobs:
  download_test_reporter:
    <<: *defaults
    steps:
      - run:
          name:  Download cc-test-reporter
          command: |
            mkdir -p tmp/
            curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./tmp/cc-test-reporter
            chmod +x ./tmp/cc-test-reporter
      - persist_to_workspace:
          root: tmp
          paths:
            - cc-test-reporter
  rspec:
    working_directory: ~/repo
    docker:
      - image: << parameters.image >>
        environment:
          BUNDLE_PATH: vendor/bundle
    parameters:
      image:
        type: string
    environment:
      COVERAGE: "1"
      CI: "1"
    steps:
      - prepare
      - attach_workspace:
          at: ~/repo/tmp
      - run:
          name: Rspec
          command: |
            bundle exec rspec

            ./tmp/cc-test-reporter format-coverage -t simplecov -o tmp/codeclimate.$CIRCLE_BUILD_NUM.json coverage/coverage.json
      - persist_to_workspace:
          root: tmp
          paths:
            - codeclimate.*.json
  rubocop:
    <<: *defaults
    steps:
      - prepare
      - run:
          name: Rubocop
          command: bundle exec rubocop
  upload-coverage:
    <<: *defaults
    environment:
      CC_TEST_REPORTER_ID: eba8148e38d4303f73466f347b7a2d1a592f8314a13c10787382eac08453201d
    steps:
      - attach_workspace:
          at: ~/repo/tmp
      - run:
          name: Upload coverage results to Code Climate
          # --parts flag must match the build matrix size
          command: |
            ./tmp/cc-test-reporter sum-coverage -o tmp/codeclimate.json --parts 3 tmp/codeclimate.*.json

            ./tmp/cc-test-reporter upload-coverage -i tmp/codeclimate.json

workflows:
  version: 2
  pipeline:
    jobs:
      - download_test_reporter
      - rspec:
          requires:
            - download_test_reporter
          matrix:
            parameters:
              image:
              - "circleci/ruby:2.6"
              - "circleci/ruby:2.7"
              - "circleci/ruby:3.0"
      - rubocop
      - upload-coverage:
          requires:
            - rspec