# 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 ['2.6', '2.7', '3.0'] default: '3.0' - &rails_version rails_version: type: enum enum: &rails_version_enum ['5.2', '6.0', '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: v1-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: 20 - 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'] exclude: - ruby_version: '3.0' rails_version: '5.2' bundler_options: '--with integrations' - ruby_version: '3.0' rails_version: '5.2' bundler_options: '--without integrations' - ruby_version: '2.6' rails_version: '7.0' bundler_options: '--with integrations' - ruby_version: '2.6' rails_version: '7.0' bundler_options: '--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 exclude: - ruby_version: '3.0' rails_version: '5.2' - ruby_version: '2.6' rails_version: '7.0' - test_api: ruby_version: '2.7' # Jets supports only Ruby 2.x - 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