.circleci/config.yml
# 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