KnapsackPro/knapsack_pro-ruby

View on GitHub
.circleci/config.yml

Summary

Maintainability
Test Coverage
version: 2.1

commands:
  setup_knapsack_pro_ruby:
    steps:
      - checkout
      - restore_cache:
          keys:
          - v1-bundler-ruby-{{ checksum "knapsack_pro.gemspec" }}
          - v1-bundler-ruby-
      - run:
          command: |
            bundle config set --local path './vendor/bundle'
            bundle install --jobs=4 --retry=3
      - save_cache:
          paths:
            - ./vendor/bundle
          key: v1-bundler-ruby-{{ checksum "knapsack_pro.gemspec" }}

  setup_rails_app_with_knapsack_pro:
    parameters:
      path:
        type: string
      ruby:
        type: string
      rspec:
        type: string
        default: ""
    steps:
      - run:
          working_directory: << parameters.path >>
          command: |
            git clone --depth 1 --branch $CIRCLE_BRANCH --single-branch git@github.com:KnapsackPro/rails-app-with-knapsack_pro.git ./ || git clone --depth 1 git@github.com:KnapsackPro/rails-app-with-knapsack_pro.git ./
            if [[ "<< parameters.rspec >>" != "" ]]; then
              sed -i 's/.*gem.*rspec-core.*/gem "rspec-core", "<< parameters.rspec >>"/g' ./Gemfile
              echo "Updated RSpec version in Gemfile"
            fi
      - restore_cache:
          keys:
          - v1-bundler-rails-{{ checksum "Gemfile.lock" }}-ruby-<< parameters.ruby >>-rspec-<< parameters.rspec >>
          - v1-bundler-rails-{{ checksum "Gemfile.lock" }}-ruby-<< parameters.ruby >>-
          - v1-bundler-rails-{{ checksum "Gemfile.lock" }}-
          - v1-bundler-rails-
      - run:
          working_directory: << parameters.path >>
          command: |
            bundle config set --local path './vendor/bundle'
            bundle install --jobs=4 --retry=3
      - save_cache:
          paths:
            - << parameters.path >>/vendor/bundle
          key: v1-bundler-rails-{{ checksum "Gemfile.lock" }}-ruby-<< parameters.ruby >>-rspec-<< parameters.rspec >>

jobs:
  unit:
    parallelism: 1
    working_directory: ~/knapsack_pro-ruby
    resource_class: small
    docker:
      - image: cimg/ruby:3.3
    steps:
      - setup_knapsack_pro_ruby
      - run: gem install rubocop
      - run: rubocop --fail-level A --only Style/FrozenStringLiteralComment,Layout/EmptyLineAfterMagicComment lib/
      - run: bundle exec rspec spec
      - run: bundle exec ruby spec/knapsack_pro/formatters/time_tracker_specs.rb

  integration-rspec:
    parallelism: 1
    working_directory: ~/knapsack_pro-ruby
    resource_class: small
    parameters:
      ruby:
        type: string
      rspec:
        type: string
    docker:
      - image: cimg/ruby:<< parameters.ruby >>
    steps:
      - checkout
      - run:
          command: |
            if [[ "<< parameters.rspec >>" != "" ]]; then
              sed -i 's/.*gem.*rspec-core.*/gem "rspec-core", "<< parameters.rspec >>"/g' ./Gemfile
              echo "Updated RSpec version in Gemfile"
            fi
      - restore_cache:
          keys:
          - v1-bundler-gem-{{ checksum "knapsack_pro.gemspec" }}-ruby-<< parameters.ruby >>-rspec-<< parameters.rspec >>
          - v1-bundler-gem-{{ checksum "knapsack_pro.gemspec" }}-ruby-<< parameters.ruby >>-
          - v1-bundler-gem-{{ checksum "knapsack_pro.gemspec" }}-
          - v1-bundler-gem-
      - run:
          command: |
            bundle config set --local path './vendor/bundle'
            bundle install --jobs=4 --retry=3
      - save_cache:
          paths:
            - ./vendor/bundle
          key: v1-bundler-gem-{{ checksum "knapsack_pro.gemspec" }}-ruby-<< parameters.ruby >>-rspec-<< parameters.rspec >>
      - run:
          command: |
            ruby --version
            bundle exec rspec --version
            RSPEC=$(bundle exec rspec --version | grep rspec-core | head -n1 | cut -d " " -f5)
            [ $RSPEC != << parameters.rspec >> ] && exit 1 || echo "Correct version of RSpec installed: $RSPEC"
      - run: bundle exec rspec spec/integration/runners/queue/rspec_runner_spec.rb

  e2e-regular-rspec:
    parallelism: 2
    working_directory: ~/knapsack_pro-ruby
    resource_class: small
    parameters:
      ruby:
        type: string
      rspec:
        type: string
    docker:
      - image: cimg/ruby:<< parameters.ruby >>-browsers
        environment:
          PGHOST: 127.0.0.1
          PGUSER: rails-app-with-knapsack_pro
          RAILS_ENV: test
          RACK_ENV: test
          KNAPSACK_PRO_ENDPOINT: https://api-staging.knapsackpro.com
          KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC: $KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC
          EXTRA_TEST_FILES_DELAY: 10
      - image: cimg/postgres:14.7
        environment:
          POSTGRES_DB: rails-app-with-knapsack_pro_test
          POSTGRES_PASSWORD: password
          POSTGRES_USER: rails-app-with-knapsack_pro
    steps:
      - setup_knapsack_pro_ruby
      - setup_rails_app_with_knapsack_pro:
          path: ~/rails-app-with-knapsack_pro
          ruby: << parameters.ruby >>
          rspec: << parameters.rspec >>
      - run: dockerize -wait tcp://localhost:5432 -timeout 1m
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: |
            ruby --version
            bundle exec rspec --version
            RSPEC=$(bundle exec rspec --version | grep rspec-core | head -n1 | cut -d " " -f5)
            [ $RSPEC != << parameters.rspec >> ] && exit 1 || echo "Correct version of RSpec installed: $RSPEC"
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: bin/rails db:setup
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: |
            export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--regular"
            bundle exec rake knapsack_pro:rspec
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: |
            # retry the same split ||
            export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--regular"
            bundle exec rake knapsack_pro:rspec
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: |
            # fallback ||
            export KNAPSACK_PRO_ENDPOINT=https://api-fake.knapsackpro.com
            export KNAPSACK_PRO_MAX_REQUEST_RETRIES=1
            bundle exec rake knapsack_pro:rspec
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: |
            # split by test examples ||
            export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--regular--split"
            export KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES=true
            bundle exec rake knapsack_pro:rspec
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: |
            # split custom files by test examples ||
            export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--regular--split-custom-files"
            export KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES=true
            export KNAPSACK_PRO_SLOW_TEST_FILE_PATTERN="spec/features/calculator_spec.rb"
            bundle exec rake knapsack_pro:rspec

  e2e-queue-rspec:
    parameters:
      ruby:
        type: string
      rspec:
        type: string
    parallelism: 2
    working_directory: ~/knapsack_pro-ruby
    resource_class: small
    docker:
      - image: cimg/ruby:<< parameters.ruby >>-browsers
        environment:
          PGHOST: 127.0.0.1
          PGUSER: rails-app-with-knapsack_pro
          RAILS_ENV: test
          RACK_ENV: test
          KNAPSACK_PRO_ENDPOINT: https://api-staging.knapsackpro.com
          KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC: $KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC
          EXTRA_TEST_FILES_DELAY: 10
      - image: cimg/postgres:14.7
        environment:
          POSTGRES_DB: rails-app-with-knapsack_pro_test
          POSTGRES_PASSWORD: password
          POSTGRES_USER: rails-app-with-knapsack_pro
    steps:
      - setup_knapsack_pro_ruby
      - setup_rails_app_with_knapsack_pro:
          path: ~/rails-app-with-knapsack_pro
          ruby: << parameters.ruby >>
          rspec: << parameters.rspec >>
      - run: dockerize -wait tcp://localhost:5432 -timeout 1m
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: |
            ruby --version
            bundle exec rspec --version
            RSPEC=$(bundle exec rspec --version | grep rspec-core | head -n1 | cut -d " " -f5)
            [ $RSPEC != << parameters.rspec >> ] && exit 1 || echo "Correct version of RSpec installed: $RSPEC"
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: bin/rails db:setup
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: |
            export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue"
            bundle exec rake knapsack_pro:queue:rspec
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: |
            # run 0 tests as queue is consumed ||
            export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue"
            export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=false
            bundle exec rake knapsack_pro:queue:rspec
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: |
            # retry the same split ||
            export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue"
            export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
            bundle exec rake knapsack_pro:queue:rspec
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: |
            # fallback ||
            export KNAPSACK_PRO_ENDPOINT=https://api-fake.knapsackpro.com
            export KNAPSACK_PRO_MAX_REQUEST_RETRIES=1
            bundle exec rake knapsack_pro:queue:rspec
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: |
            # split by test examples ||
            export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue--split"
            export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
            export KNAPSACK_PRO_RSPEC_SPLIT_BY_TEST_EXAMPLES=true
            bundle exec rake knapsack_pro:queue:rspec
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: |
            # turnip ||
            export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue--turnip"
            export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
            export KNAPSACK_PRO_TEST_DIR=turnip
            export KNAPSACK_PRO_TEST_FILE_PATTERN="turnip/**/*.feature"
            bundle exec rake "knapsack_pro:queue:rspec[-r turnip/rspec]"
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: |
            # turnip retry ||
            export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue--turnip"
            export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
            export KNAPSACK_PRO_TEST_DIR=turnip
            export KNAPSACK_PRO_TEST_FILE_PATTERN="turnip/**/*.feature"
            bundle exec rake "knapsack_pro:queue:rspec[-r turnip/rspec]"

  e2e-regular-minitest:
    parallelism: 2
    working_directory: ~/knapsack_pro-ruby
    resource_class: small
    parameters:
      ruby:
        type: string
    docker:
      - image: cimg/ruby:<< parameters.ruby >>-browsers
        environment:
          PGHOST: 127.0.0.1
          PGUSER: rails-app-with-knapsack_pro
          RAILS_ENV: test
          RACK_ENV: test
          KNAPSACK_PRO_ENDPOINT: https://api-staging.knapsackpro.com
          KNAPSACK_PRO_TEST_SUITE_TOKEN_MINITEST: $KNAPSACK_PRO_TEST_SUITE_TOKEN_MINITEST
          KNAPSACK_PRO_RSPEC_DISABLED: true
          EXTRA_TEST_FILES_DELAY: 10
      - image: cimg/postgres:14.7
        environment:
          POSTGRES_DB: rails-app-with-knapsack_pro_test
          POSTGRES_PASSWORD: password
          POSTGRES_USER: rails-app-with-knapsack_pro
    steps:
      - setup_knapsack_pro_ruby
      - setup_rails_app_with_knapsack_pro:
          path: ~/rails-app-with-knapsack_pro
          ruby: << parameters.ruby >>
      - run: dockerize -wait tcp://localhost:5432 -timeout 1m
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: ruby --version
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: bin/rails db:setup
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: |
            export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--regular"
            bundle exec rake knapsack_pro:minitest[--verbose]
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: |
            # retry the same split ||
            export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--regular"
            bundle exec rake knapsack_pro:minitest[--verbose]

  e2e-queue-minitest:
    parameters:
      ruby:
        type: string
    parallelism: 2
    working_directory: ~/knapsack_pro-ruby
    resource_class: small
    docker:
      - image: cimg/ruby:<< parameters.ruby >>-browsers
        environment:
          PGHOST: 127.0.0.1
          PGUSER: rails-app-with-knapsack_pro
          RAILS_ENV: test
          RACK_ENV: test
          KNAPSACK_PRO_ENDPOINT: https://api-staging.knapsackpro.com
          KNAPSACK_PRO_TEST_SUITE_TOKEN_MINITEST: $KNAPSACK_PRO_TEST_SUITE_TOKEN_MINITEST
          KNAPSACK_PRO_RSPEC_DISABLED: true
          EXTRA_TEST_FILES_DELAY: 10
      - image: cimg/postgres:14.7
        environment:
          POSTGRES_DB: rails-app-with-knapsack_pro_test
          POSTGRES_PASSWORD: password
          POSTGRES_USER: rails-app-with-knapsack_pro
    steps:
      - setup_knapsack_pro_ruby
      - setup_rails_app_with_knapsack_pro:
          path: ~/rails-app-with-knapsack_pro
          ruby: << parameters.ruby >>
      - run: dockerize -wait tcp://localhost:5432 -timeout 1m
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: ruby --version
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: bin/rails db:setup
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: |
            # minitest ||
            export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue--minitest"
            export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
            bundle exec rake knapsack_pro:queue:minitest[--verbose]
      - run:
          working_directory: ~/rails-app-with-knapsack_pro
          command: |
            # minitest retry ||
            export KNAPSACK_PRO_BRANCH="$CIRCLE_BRANCH--$CIRCLE_BUILD_NUM--queue--minitest"
            export KNAPSACK_PRO_FIXED_QUEUE_SPLIT=true
            bundle exec rake knapsack_pro:queue:minitest[--verbose]

workflows:
  tests:
    jobs:
      - unit
      - integration-rspec:
          name: integration__ruby-<< matrix.ruby >>__rspec-<< matrix.rspec >>
          matrix:
            parameters:
              ruby: ["3.0", "3.1", "3.2", "3.3"]
              rspec: ["3.10.2", "3.11.0", "3.12.2"]
      - e2e-regular-rspec:
          name: e2e-regular__ruby-<< matrix.ruby >>__rspec-<< matrix.rspec >>
          matrix:
            parameters:
              ruby: ["3.0", "3.1", "3.2", "3.3"]
              rspec: ["3.10.2", "3.11.0", "3.12.2"]
      - e2e-queue-rspec:
          name: e2e-queue__ruby-<< matrix.ruby >>__rspec-<< matrix.rspec >>
          matrix:
            parameters:
              ruby: ["3.0", "3.1", "3.2", "3.3"]
              rspec: ["3.10.2", "3.11.0", "3.12.2"]
      - e2e-regular-minitest:
          name: e2e-regular__ruby-<< matrix.ruby >>__minitest
          matrix:
            parameters:
              ruby: ["3.0", "3.1", "3.2", "3.3"]
      - e2e-queue-minitest:
          name: e2e-queue__ruby-<< matrix.ruby >>__minitest
          matrix:
            parameters:
              ruby: ["3.0", "3.1", "3.2", "3.3"]