Created
May 25, 2018 01:23
-
-
Save trev/9cc964a54c8d5b62f4def891eba6b976 to your computer and use it in GitHub Desktop.
CircleCI 2.0 with parallelism & simplecov for Rails
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Ruby CircleCI 2.0 configuration file | |
# | |
# Check https://circleci.com/docs/2.0/language-ruby/ for more details | |
defaults: &defaults | |
working_directory: ~/split_app | |
parallelism: 2 | |
docker: | |
- image: circleci/ruby:2.5.0-node-browsers | |
environment: | |
PGHOST: localhost | |
PGUSER: split | |
RAILS_ENV: test | |
- image: circleci/postgres:9.6 | |
environment: | |
POSTGRES_USER: split | |
POSTGRES_DB: split_test | |
POSTGRES_PASSWORD: "" | |
version: 2 | |
jobs: | |
test: | |
<<: *defaults | |
steps: | |
- checkout | |
- save_cache: | |
key: v2-repo-{{ .Environment.CIRCLE_SHA1 }} | |
paths: | |
- ~/split_app | |
- restore_cache: | |
keys: | |
- gem-cache-{{ arch }}-{{ .Branch }}-{{ checksum "Gemfile.lock" }} | |
- gem-cache-{{ arch }}-{{ .Branch }} | |
- gem-cache | |
- run: bundle install --path vendor/bundle | |
- save_cache: | |
key: gem-cache-{{ arch }}-{{ .Branch }}-{{ checksum "Gemfile.lock" }} | |
paths: | |
- ~/split_app/vendor/bundle | |
- restore_cache: | |
keys: | |
- yarn-cache-{{ arch }}-{{ .Branch }}-{{ checksum "yarn.lock" }} | |
- yarn-cache-{{ arch }}-{{ .Branch }} | |
- yarn-cache | |
- run: | |
name: Yarn Install | |
command: yarn install --cache-folder ~/.cache/yarn | |
- save_cache: | |
key: yarn-cache-{{ arch }}-{{ .Branch }}-{{ checksum "yarn.lock" }} | |
paths: | |
- ~/split_app/.cache/yarn | |
- run: cp .env.test .env | |
- run: bundle exec rubocop | |
- run: bundle exec brakeman -z | |
- run: dockerize -wait tcp://localhost:5432 -timeout 1m | |
- run: bundle exec rake db:schema:load | |
- run: | |
name: Parallel Rspec | |
environment: | |
- RAILS_ENV: test | |
- RACK_ENV: test | |
command: | | |
mkdir -p /tmp/rspec | |
TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)" | |
bundle exec rspec --profile 10 \ | |
--format RspecJunitFormatter \ | |
--out /tmp/rspec/rspec.xml \ | |
--format progress \ | |
-- \ | |
$TEST_FILES | |
- store_test_results: | |
path: /tmp/rspec | |
- run: | |
name: Stash Coverage Results | |
command: | | |
mkdir coverage_results | |
cp -R coverage/.resultset.json coverage_results/.resultset-${CIRCLE_NODE_INDEX}.json | |
- persist_to_workspace: | |
root: . | |
paths: | |
- coverage_results | |
coverage: | |
<<: *defaults | |
steps: | |
- attach_workspace: | |
at: . | |
- restore_cache: | |
key: v2-repo-{{ .Environment.CIRCLE_SHA1 }} | |
- restore_cache: | |
keys: | |
- gem-cache-{{ arch }}-{{ .Branch }}-{{ checksum "Gemfile.lock" }} | |
- gem-cache-{{ arch }}-{{ .Branch }} | |
- gem-cache | |
- run: bundle install --path vendor/bundle | |
- run: | |
name: Merge and check coverage | |
command: | | |
RUN_COVERAGE=true bundle exec rake simplecov:report_coverage | |
- store_artifacts: | |
path: ~/split_app/coverage | |
destination: coverage | |
workflows: | |
version: 2 | |
build_and_test: | |
jobs: | |
- test | |
- coverage: | |
requires: | |
- test |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# frozen_string_literal: true | |
# spec/rails_helper.rb | |
require 'active_support/inflector' | |
require 'simplecov' | |
SimpleCov.start 'rails' do | |
add_filter '/spec/' | |
add_filter '/config/' | |
add_filter '/vendor/' | |
Dir['app/*'].each do |dir| | |
add_group File.basename(dir).humanize, dir | |
end | |
minimum_coverage 100 unless ENV['CIRCLE_JOB'] | |
end | |
# ... |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# frozen_string_literal: true | |
# spec/simplecov_helper.rb | |
require 'active_support/inflector' | |
require "simplecov" | |
class SimpleCovHelper | |
def self.report_coverage(base_dir: "./coverage_results") | |
SimpleCov.start 'rails' do | |
skip_check_coverage = ENV.fetch("SKIP_COVERAGE_CHECK", "false") | |
add_filter '/spec/' | |
add_filter '/config/' | |
add_filter '/vendor/' | |
Dir['app/*'].each do |dir| | |
add_group File.basename(dir).humanize, dir | |
end | |
minimum_coverage(100) unless skip_check_coverage | |
merge_timeout(3600) | |
end | |
new(base_dir: base_dir).merge_results | |
end | |
attr_reader :base_dir | |
def initialize(base_dir:) | |
@base_dir = base_dir | |
end | |
def all_results | |
Dir["#{base_dir}/.resultset*.json"] | |
end | |
def merge_results | |
results = all_results.map { |file| SimpleCov::Result.from_hash(JSON.parse(File.read(file))) } | |
SimpleCov::ResultMerger.merge_results(*results).tap do |result| | |
SimpleCov::ResultMerger.store_result(result) | |
end | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# frozen_string_literal: true | |
# lib/tasks/simplecov_parallel.rake | |
if Rails.env.test? | |
require_relative "../../spec/simplecov_helper" | |
namespace :simplecov do | |
desc "merge_results" | |
task report_coverage: :environment do | |
SimpleCovHelper.report_coverage | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks @trev :), I referred this and implemented for Github action using artifacts