ryz310/my_api_client

View on GitHub
.circleci/config.yml

Summary

Maintainability
Test Coverage
# Ruby CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-ruby/ for more details
#
version: 2.1

orbs:
  ruby-orbs: sue445/ruby-orbs@1.6.0
  code-climate: rvla/code-climate@0.0.2

references:
  - &ruby_version
    ruby_version:
      type: enum
      enum: &ruby_version_enum ["3.0", "3.1", "3.2"]
      default: "3.2"
  - &rails_version
    rails_version:
      type: enum
      enum: &rails_version_enum ["6.1", "7.0"]
      default: "7.0"
  - &bundler_options
    bundler_options:
      type: string
      default: ""

executors:
  api_executor:
    parameters:
      <<: *ruby_version
    docker:
      - image: cimg/ruby:<< parameters.ruby_version >>
    working_directory: ~/repo/my_api
  gem_executor:
    parameters:
      <<: *ruby_version
    docker:
      - image: cimg/ruby:<< parameters.ruby_version >>
    working_directory: ~/repo
  rails_executor:
    parameters:
      <<: *ruby_version
      <<: *rails_version
    docker:
      - image: cimg/ruby:<< parameters.ruby_version >>
    working_directory: ~/repo/rails_app/rails_<< parameters.rails_version >>

commands:
  modify_active_support_version:
    description: Modify ActiveSupport Version
    parameters:
      <<: *rails_version
    steps:
      - run: |
          cp gemfiles/rails_<< parameters.rails_version >>.gemfile Gemfile
          bundle update activesupport
  run_rspec_for_api:
    description: Run RSpec for the API
    steps:
      - run:
          name: Execute RSpec
          command: |
            bundle exec rspec --format documentation \
                              --color \
                              --format RspecJunitFormatter
  deploy_api_server:
    description: Deploy the API server on the AWS
    steps:
      - run:
          name: Install RSync
          command: sudo apt-get install -y rsync
      - run:
          # This command is not currently work. It could't reference uploaded gem file.
          # You can execute `$ bundle exec jets deploy` on your local.
          name: Deploy the API server with jets
          command: JETS_AGREE=yes bundle exec jets deploy
  run_rspec_for_gem:
    description: Run RSpec for the gem
    steps:
      - code-climate/install
      - run:
          name: Execute RSpec
          command: |
            mkdir /tmp/test-results
            TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)"
            cc-test-reporter before-build
            bundle exec rspec --format documentation \
                              --color \
                              --format RspecJunitFormatter \
                              --out /tmp/test-results/rspec.xml \
                              $TEST_FILES
      - code-climate/format-coverage:
          input-type: simplecov
          prefix: $(readlink -f .)
          coverage-file: coverage/coverage.json
          output: coverage/codeclimate.$CIRCLE_BUILD_NUM.json
      - persist_to_workspace:
          root: coverage
          paths:
            - codeclimate.*.json
      - store_test_results:
          path: /tmp/test-results
      - store_artifacts:
          path: /tmp/test-results
          destination: test-results
  rubocop:
    steps:
      - run:
          name: Run RuboCop
          command: bundle exec rubocop
  yardoc:
    description: "Generate YARDoc"
    steps:
      - run: bundle exec yardoc -o ./yardoc
      - store_artifacts:
          path: ./yardoc
          destination: yardoc
  rake_build:
    steps:
      - run:
          name: Rake Build
          command: bundle exec rake build
  rubocop_challenge:
    steps:
      - run:
          name: Rubocop Challenge
          command: |
            gem install rubocop_challenger
            rubocop_challenger go --email=ryz310@gmail.com --name=ryz310
  release:
    description: Release to RubyGems.org
    steps:
      - run:
          name: Create Rubygems Credentials
          command: |
            mkdir ~/.gem || true
            echo -e "---\n:rubygems_api_key: ${RUBYGEMS_API_KEY}" > ~/.gem/credentials
            chmod 0600 ~/.gem/credentials
      - run:
          name: Release Gem
          command: |
            git push --set-upstream origin ${CIRCLE_BRANCH}
            bundle exec rake release --trace
  setup:
    description: Setup for Job Working
    parameters:
      <<: *ruby_version
      <<: *bundler_options
    steps:
      - checkout:
          path: ~/repo
      - run:
          name: Install Bundler 2.x
          command: gem install bundler -v '~> 2.0'
      - ruby-orbs/bundle-install:
          cache_key_prefix: v3-dependencies-<< parameters.ruby_version >>
          bundle_extra_args: << parameters.bundler_options >>
          restore_bundled_with: false
  test_and_deploy_for_api:
    description: Test and build the API
    steps:
      - run_rspec_for_api
      - deploy_api_server
  test_and_build_for_gem:
    description: Test and build the RubyGem
    parameters:
      <<: *rails_version
    steps:
      - modify_active_support_version:
          rails_version: << parameters.rails_version >>
      - run_rspec_for_gem
      - rake_build
  verify_api_client_generator:
    description: Verify the API client generator
    parameters:
      <<: *rails_version
    steps:
      - run:
          name: "[Workaround] See: https://obel.hatenablog.jp/entry/20210831/1630350000"
          command: |
            sudo ln -s /usr/lib/x86_64-linux-gnu/libffi.so.7.1.0 /usr/lib/x86_64-linux-gnu/libffi.so.6
      - run:
          name: Generate new API client files
          command: |
            bin/rails g api_client path/to/resource \
              get:path/to/resource \
              post:path/to/resource \
              --endpoint https://example.com/myapi
      - run:
          name: Check the API client files exists
          command: |
            test -e "app/api_clients/application_api_client.rb" & \
            test -e "app/api_clients/path/to/resource_api_client.rb" & \
            test -e "spec/api_clients/path/to/resource_api_client_spec.rb"
      - run:
          name: Run rspec with the generated spec file
          command: bundle exec rspec -f d spec/api_clients/path/to

jobs:
  test_api:
    parameters:
      <<: *ruby_version
    executor:
      name: api_executor
      ruby_version: << parameters.ruby_version >>
    steps:
      - setup:
          ruby_version: << parameters.ruby_version >>
      - run_rspec_for_api
  deploy_api:
    parameters:
      <<: *ruby_version
    executor:
      name: api_executor
      ruby_version: << parameters.ruby_version >>
    steps:
      - setup:
          ruby_version: << parameters.ruby_version >>
      - test_and_deploy_for_api
  build_gem:
    parameters:
      <<: *ruby_version
      <<: *rails_version
      <<: *bundler_options
    executor:
      name: gem_executor
      ruby_version: << parameters.ruby_version >>
    steps:
      - setup:
          ruby_version: << parameters.ruby_version >>
          bundler_options: << parameters.bundler_options >>
      - test_and_build_for_gem:
          rails_version: << parameters.rails_version >>
  verify_generator:
    parameters:
      <<: *ruby_version
      <<: *rails_version
    executor:
      name: rails_executor
      ruby_version: << parameters.ruby_version >>
      rails_version: << parameters.rails_version >>
    steps:
      - setup:
          ruby_version: << parameters.ruby_version >>
      - verify_api_client_generator:
          rails_version: << parameters.rails_version >>
  upload-coverage:
    executor: gem_executor
    steps:
      - attach_workspace:
          at: ~/repo
      - code-climate/install
      - code-climate/sum-coverage:
          input: codeclimate.*.json
          parts: 12
      - code-climate/upload-coverage
  rubocop:
    executor: gem_executor
    steps:
      - setup
      - rubocop
  yardoc:
    executor: gem_executor
    steps:
      - setup
      - yardoc
  rubocop_challenge:
    executor: gem_executor
    steps:
      - checkout
      - rubocop_challenge
  release:
    executor: gem_executor
    steps:
      - setup
      - release

workflows:
  version: 2

  commit:
    jobs:
      - build_gem:
          name: build_on_ruby_<< matrix.ruby_version >>_and_rails_<< matrix.rails_version >><< matrix.bundler_options >>
          matrix:
            parameters:
              ruby_version: *ruby_version_enum
              rails_version: *rails_version_enum
              bundler_options: ["--with integrations", "--without integrations"]
      - verify_generator:
          name: verify_generator_on_ruby_<< matrix.ruby_version >>_and_rails_<< matrix.rails_version >>
          matrix:
            parameters:
              ruby_version: *ruby_version_enum
              rails_version: *rails_version_enum
      - test_api:
          ruby_version: "3.2"
      - rubocop
      - yardoc
      - upload-coverage:
          requires:
            - build_gem
            - verify_generator # for GitHub requirements
      - release:
          context: RubyGems API Key
          requires:
            - build_gem
            - verify_generator
            - rubocop
          filters:
            branches:
              only:
                - release

  challenge:
    triggers:
      - schedule:
          cron: "30 23 * * *" # 8:30am every day (JST)
          filters:
            branches:
              only: [master]
    jobs:
      - rubocop_challenge

  # deploy_api_server:
  #   triggers:
  #     - schedule:
  #         cron: "0 12 * * *" # 3:00am every day (JST)
  #         filters:
  #           branches:
  #             only: [master]
  #   jobs:
  #     - deploy_api:
  #         ruby_version: '3.0'
  #     - build_gem:
  #         requires: [deploy_api]

experimental:
  notify:
    branches:
      only:
        - master
        - release