From 647da42af99a703fc3af3452b39acf0c3dc3050d Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 30 Jun 2016 15:44:29 +0200 Subject: [PATCH 01/20] Merge coverage report --- .gitlab-ci.yml | 11 +++++++ .simplecov | 4 --- lib/tasks/ci/simplecov.rake | 63 +++++++++++++++++++++++++++++++++++++ spec/spec_helper.rb | 10 +++++- 4 files changed, 83 insertions(+), 5 deletions(-) delete mode 100644 .simplecov create mode 100644 lib/tasks/ci/simplecov.rake diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2d33bad5886..b0010572833 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -61,6 +61,15 @@ update-knapsack: only: - master +update-coverage: + <<: *knapsack-state + stage: post-test + script: + - bundle exec rake ci:simplecov:merge + artifacts: + paths: + - coverage/ + # Execute all testing suites .use-db: &use-db @@ -83,6 +92,7 @@ update-knapsack: artifacts: paths: - knapsack/ + - coverage/ .spinach-knapsack: &spinach-knapsack stage: test @@ -99,6 +109,7 @@ update-knapsack: artifacts: paths: - knapsack/ + - coverage/ rspec 0 20: *rspec-knapsack rspec 1 20: *rspec-knapsack diff --git a/.simplecov b/.simplecov deleted file mode 100644 index d979288df44..00000000000 --- a/.simplecov +++ /dev/null @@ -1,4 +0,0 @@ -# .simplecov -SimpleCov.start 'rails' do - merge_timeout 3600 -end diff --git a/lib/tasks/ci/simplecov.rake b/lib/tasks/ci/simplecov.rake new file mode 100644 index 00000000000..0c8322940ec --- /dev/null +++ b/lib/tasks/ci/simplecov.rake @@ -0,0 +1,63 @@ +require 'simplecov' + +namespace :ci do + namespace :simplecov do + desc 'GitLab CI | Merge all coverage results and generate report' + task merge: :environment do + merged_result.format! + end + + private + + def read(file) + return unless File.exist?(file) + data = File.read(file) + return if data.nil? || data.length < 2 + data + end + + def load(file) + begin + JSON.parse(read(file)) + rescue + {} + end + end + + def files + Dir.glob(File.join(SimpleCov.coverage_path, '*/.resultset.json')) + end + + def resultsfiles + files.map { |file| load(file) } + end + + def resultsets + resultsfiles.reduce({}, :merge) + end + + def all_results + results = [] + resultsets.each do |command_name, data| + result = SimpleCov::Result.from_hash(command_name => data) + # Only add result if the timeout is above the configured threshold + if (Time.now - result.created_at) < SimpleCov.merge_timeout + results << result + end + end + results + end + + def merged_result + merged = {} + results = all_results + results.each do |result| + merged = result.original_result.merge_resultset(merged) + end + result = SimpleCov::Result.new(merged) + # Specify the command name + result.command_name = results.map(&:command_name).sort.join(", ") + result + end + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 3638dcbb2d3..644f767402c 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,6 +1,14 @@ if ENV['SIMPLECOV'] require 'simplecov' - SimpleCov.start :rails + require 'simplecov-rcov' + + SimpleCov.start :rails do + if ENV['CI_BUILD_NAME'] + coverage_dir "coverage/#{ENV['CI_BUILD_NAME']}" + command_name ENV['CI_BUILD_NAME'] + merge_timeout 7200 + end + end end ENV["RAILS_ENV"] ||= 'test' From bd709e29b50940409d6b1abc869fe2969d6a3b51 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 30 Jun 2016 16:08:01 +0200 Subject: [PATCH 02/20] Use `scripts/merge-simplecov` --- .gitlab-ci.yml | 2 +- lib/tasks/ci/simplecov.rake | 63 ----------------------------------- scripts/merge-simplecov | 65 +++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 64 deletions(-) delete mode 100644 lib/tasks/ci/simplecov.rake create mode 100755 scripts/merge-simplecov diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b0010572833..9a90c99a996 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -65,7 +65,7 @@ update-coverage: <<: *knapsack-state stage: post-test script: - - bundle exec rake ci:simplecov:merge + - bundle exec scripts/merge-simplecov artifacts: paths: - coverage/ diff --git a/lib/tasks/ci/simplecov.rake b/lib/tasks/ci/simplecov.rake deleted file mode 100644 index 0c8322940ec..00000000000 --- a/lib/tasks/ci/simplecov.rake +++ /dev/null @@ -1,63 +0,0 @@ -require 'simplecov' - -namespace :ci do - namespace :simplecov do - desc 'GitLab CI | Merge all coverage results and generate report' - task merge: :environment do - merged_result.format! - end - - private - - def read(file) - return unless File.exist?(file) - data = File.read(file) - return if data.nil? || data.length < 2 - data - end - - def load(file) - begin - JSON.parse(read(file)) - rescue - {} - end - end - - def files - Dir.glob(File.join(SimpleCov.coverage_path, '*/.resultset.json')) - end - - def resultsfiles - files.map { |file| load(file) } - end - - def resultsets - resultsfiles.reduce({}, :merge) - end - - def all_results - results = [] - resultsets.each do |command_name, data| - result = SimpleCov::Result.from_hash(command_name => data) - # Only add result if the timeout is above the configured threshold - if (Time.now - result.created_at) < SimpleCov.merge_timeout - results << result - end - end - results - end - - def merged_result - merged = {} - results = all_results - results.each do |result| - merged = result.original_result.merge_resultset(merged) - end - result = SimpleCov::Result.new(merged) - # Specify the command name - result.command_name = results.map(&:command_name).sort.join(", ") - result - end - end -end diff --git a/scripts/merge-simplecov b/scripts/merge-simplecov new file mode 100755 index 00000000000..b59ff0ae9a0 --- /dev/null +++ b/scripts/merge-simplecov @@ -0,0 +1,65 @@ +#!/usr/bin/env ruby +begin + load File.expand_path('../spring', __FILE__) +rescue LoadError => e + raise unless e.message.include?('spring') +end + +require 'simplecov' + +def read(file) + return unless File.exist?(file) + data = File.read(file) + return if data.nil? || data.length < 2 + data +end + +def load(file) + begin + JSON.parse(read(file)) + rescue + {} + end +end + +def files + Dir.glob(File.join(SimpleCov.coverage_path, '*', '.resultset.json')) +end + +def resultsfiles + files.map { |file| load(file) } +end + +def resultsets + resultsfiles.reduce({}, :merge) +end + +def all_results + results = [] + resultsets.each do |command_name, data| + result = SimpleCov::Result.from_hash(command_name => data) + # Only add result if the timeout is above the configured threshold + if (Time.now - result.created_at) < SimpleCov.merge_timeout + results << result + end + end + results +end + +def merged_result + merged = {} + results = all_results + results.each do |result| + merged = result.original_result.merge_resultset(merged) + end + result = SimpleCov::Result.new(merged) + # Specify the command name + result.command_name = results.map(&:command_name).sort.join(", ") + result +end + +SimpleCov.configure do + merge_timeout 7200 +end + +merged_result.format! From 93f98fb8cade1376e607a92ed866b2d569f17d4a Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 30 Jun 2016 16:23:57 +0200 Subject: [PATCH 03/20] Remove unused simplecov-rcov --- spec/spec_helper.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 644f767402c..72076258dcf 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,6 +1,5 @@ if ENV['SIMPLECOV'] require 'simplecov' - require 'simplecov-rcov' SimpleCov.start :rails do if ENV['CI_BUILD_NAME'] From caec732c7629ddd87792b76a67b41ff26611eec1 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 30 Jun 2016 16:49:17 +0200 Subject: [PATCH 04/20] Add simplecov to spinach tests --- features/support/env.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/features/support/env.rb b/features/support/env.rb index f0a3dd8d2d0..c1cfabd0d6a 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -1,5 +1,13 @@ if ENV['SIMPLECOV'] require 'simplecov' + + SimpleCov.start :rails do + if ENV['CI_BUILD_NAME'] + coverage_dir "coverage/#{ENV['CI_BUILD_NAME']}" + command_name ENV['CI_BUILD_NAME'] + merge_timeout 7200 + end + end end ENV['RAILS_ENV'] = 'test' From 2d3978842cb1742d1c974fa57c29b6508a365c24 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 30 Jun 2016 17:55:16 +0200 Subject: [PATCH 05/20] Fix update-coverage job --- .gitlab-ci.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9a90c99a996..4814cbe4ae7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -62,8 +62,11 @@ update-knapsack: - master update-coverage: - <<: *knapsack-state stage: post-test + services: [] + variables: + USE_DB: "false" + USE_BUNDLE_INSTALL: "true" script: - bundle exec scripts/merge-simplecov artifacts: From 8cc7a2dd6f201019d6848aade74d938db356cc39 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 30 Jun 2016 18:54:03 +0200 Subject: [PATCH 06/20] Store all simplecov configuration in one file --- .gitlab-ci.yml | 4 ++++ features/support/env.rb | 12 +----------- spec/simplecov_env.rb | 18 ++++++++++++++++++ spec/spec_helper.rb | 12 +----------- 4 files changed, 24 insertions(+), 22 deletions(-) create mode 100644 spec/simplecov_env.rb diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4814cbe4ae7..aa22bf688a0 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -40,6 +40,7 @@ stages: paths: - knapsack/ artifacts: + expire_in: 31d paths: - knapsack/ @@ -70,6 +71,7 @@ update-coverage: script: - bundle exec scripts/merge-simplecov artifacts: + expire_in: 31d paths: - coverage/ @@ -93,6 +95,7 @@ update-coverage: - cp knapsack/rspec_report.json ${KNAPSACK_REPORT_PATH} - knapsack rspec artifacts: + expire_in: 31d paths: - knapsack/ - coverage/ @@ -110,6 +113,7 @@ update-coverage: - cp knapsack/spinach_report.json ${KNAPSACK_REPORT_PATH} - knapsack spinach "-r rerun" || retry '[ ! -e tmp/spinach-rerun.txt ] || bundle exec spinach -r rerun $(cat tmp/spinach-rerun.txt)' artifacts: + expire_in: 31d paths: - knapsack/ - coverage/ diff --git a/features/support/env.rb b/features/support/env.rb index c1cfabd0d6a..1c39367ad42 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -1,14 +1,4 @@ -if ENV['SIMPLECOV'] - require 'simplecov' - - SimpleCov.start :rails do - if ENV['CI_BUILD_NAME'] - coverage_dir "coverage/#{ENV['CI_BUILD_NAME']}" - command_name ENV['CI_BUILD_NAME'] - merge_timeout 7200 - end - end -end +require_relative Rails.root.join('spec', 'simplecov_env') ENV['RAILS_ENV'] = 'test' require './config/environment' diff --git a/spec/simplecov_env.rb b/spec/simplecov_env.rb new file mode 100644 index 00000000000..a833255d407 --- /dev/null +++ b/spec/simplecov_env.rb @@ -0,0 +1,18 @@ +if ENV['SIMPLECOV'] + require 'simplecov' + + SimpleCov.start :rails do + if ENV['CI_BUILD_NAME'] + coverage_dir "coverage/#{ENV['CI_BUILD_NAME']}" + command_name ENV['CI_BUILD_NAME'] + merge_timeout 7200 + end + + add_filter '/vendor/ruby/' + + add_group 'Services', 'app/services' + add_group 'Finders', 'app/finders' + add_group 'Uploaders', 'app/uploaders' + add_group 'Validators', 'app/validators' + end +end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 72076258dcf..6a882bea571 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,14 +1,4 @@ -if ENV['SIMPLECOV'] - require 'simplecov' - - SimpleCov.start :rails do - if ENV['CI_BUILD_NAME'] - coverage_dir "coverage/#{ENV['CI_BUILD_NAME']}" - command_name ENV['CI_BUILD_NAME'] - merge_timeout 7200 - end - end -end +require_relative 'simplecov_env' ENV["RAILS_ENV"] ||= 'test' From 070a96f54faac289d9254f0e8735f3926418335c Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 30 Jun 2016 19:04:00 +0200 Subject: [PATCH 07/20] Update configuration of SimpleCov --- .gitlab-ci.yml | 1 + features/support/env.rb | 1 + scripts/merge-simplecov | 4 +--- spec/simplecov_env.rb | 37 +++++++++++++++++++++++-------------- spec/spec_helper.rb | 1 + 5 files changed, 27 insertions(+), 17 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index aa22bf688a0..1ca266ef4f1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -28,6 +28,7 @@ stages: - prepare - test - post-test +- pages # Prepare and merge knapsack tests .knapsack-state: &knapsack-state diff --git a/features/support/env.rb b/features/support/env.rb index 1c39367ad42..16ce1b6ca77 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -1,4 +1,5 @@ require_relative Rails.root.join('spec', 'simplecov_env') +SimpleCov.start if ENV['SIMPLECOV'] ENV['RAILS_ENV'] = 'test' require './config/environment' diff --git a/scripts/merge-simplecov b/scripts/merge-simplecov index b59ff0ae9a0..0d764d2b406 100755 --- a/scripts/merge-simplecov +++ b/scripts/merge-simplecov @@ -58,8 +58,6 @@ def merged_result result end -SimpleCov.configure do - merge_timeout 7200 -end +require_relative '../spec/simplecov_env' merged_result.format! diff --git a/spec/simplecov_env.rb b/spec/simplecov_env.rb index a833255d407..956476fd065 100644 --- a/spec/simplecov_env.rb +++ b/spec/simplecov_env.rb @@ -1,18 +1,27 @@ -if ENV['SIMPLECOV'] - require 'simplecov' +require 'simplecov' - SimpleCov.start :rails do - if ENV['CI_BUILD_NAME'] - coverage_dir "coverage/#{ENV['CI_BUILD_NAME']}" - command_name ENV['CI_BUILD_NAME'] - merge_timeout 7200 - end +SimpleCov.configure do + load_profile :rails - add_filter '/vendor/ruby/' - - add_group 'Services', 'app/services' - add_group 'Finders', 'app/finders' - add_group 'Uploaders', 'app/uploaders' - add_group 'Validators', 'app/validators' + if ENV['CI_BUILD_NAME'] + coverage_dir "coverage/#{ENV['CI_BUILD_NAME']}" + command_name ENV['CI_BUILD_NAME'] end + + if ENV['CI'] + SimpleCov.at_exit do + # In CI environment don't generate formatted reports + # Only generate .resultset.json + SimpleCov.result + end + end + + add_filter '/vendor/ruby/' + + add_group 'Services', 'app/services' + add_group 'Finders', 'app/finders' + add_group 'Uploaders', 'app/uploaders' + add_group 'Validators', 'app/validators' + + merge_timeout 7200 end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 6a882bea571..d2760d0ef28 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,4 +1,5 @@ require_relative 'simplecov_env' +SimpleCov.start if ENV['SIMPLECOV'] ENV["RAILS_ENV"] ||= 'test' From 3dac444ca17bdd17414bebcc55e7a53310dee544 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Thu, 30 Jun 2016 19:47:40 +0200 Subject: [PATCH 08/20] Fix SimpleCov report merging --- .gitlab-ci.yml | 3 ++- scripts/merge-simplecov | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1ca266ef4f1..8f75a46dfe8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -74,7 +74,8 @@ update-coverage: artifacts: expire_in: 31d paths: - - coverage/ + - coverage/index.html + - coverage/assets/ # Execute all testing suites diff --git a/scripts/merge-simplecov b/scripts/merge-simplecov index 0d764d2b406..2af5f8c0918 100755 --- a/scripts/merge-simplecov +++ b/scripts/merge-simplecov @@ -46,11 +46,42 @@ def all_results results end +def merge_resultset(a1, a2) + return a1 || [] unless a2 + return a2 || [] unless a1 + + new_array = a1.dup + a2.each_with_index do |element, i| + if element.nil? && new_array[i].nil? + new_array[i] = nil + elsif element.nil? && new_array[i] == 0 || element == 0 && new_array[i].nil? + new_array[i] = nil + else + local_value = element || 0 + other_value = new_array[i] || 0 + new_array[i] = local_value + other_value + end + end + new_array +end + +def merge_hashes(h1, h2) + new_resultset = {} + (h1.keys + h2.keys).each do |filename| + new_resultset[filename] = [] + end + + new_resultset.each_key do |filename| + new_resultset[filename] = merge_resultset(h1[filename], h2[filename]) + end + new_resultset +end + def merged_result merged = {} results = all_results results.each do |result| - merged = result.original_result.merge_resultset(merged) + merged = merge_hashes(result.original_result, merged) end result = SimpleCov::Result.new(merged) # Specify the command name @@ -58,6 +89,10 @@ def merged_result result end +# Ignore CI environment +ENV['CI'] = nil +ENV['CI_BUILD_NAME'] = nil + require_relative '../spec/simplecov_env' merged_result.format! From 63ceb31f8b15b4ba7fd1b4c971367a5e20aca311 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Fri, 1 Jul 2016 00:33:12 +0200 Subject: [PATCH 09/20] Fix spinach tests --- features/support/env.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/features/support/env.rb b/features/support/env.rb index 16ce1b6ca77..2a3e21d28bc 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -1,4 +1,4 @@ -require_relative Rails.root.join('spec', 'simplecov_env') +require_relative '../../spec/simplecov_env' SimpleCov.start if ENV['SIMPLECOV'] ENV['RAILS_ENV'] = 'test' From a9f6679ac1fc90d808a3db363e6c3af2ebeac6a1 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 4 Jul 2016 14:58:51 +0200 Subject: [PATCH 10/20] Use simplecov 0.12.0 which fixes merging test results --- Gemfile | 2 +- scripts/merge-simplecov | 33 +-------------------------------- 2 files changed, 2 insertions(+), 33 deletions(-) diff --git a/Gemfile b/Gemfile index ead64a6d4df..35dd69ef408 100644 --- a/Gemfile +++ b/Gemfile @@ -302,7 +302,7 @@ group :development, :test do gem 'rubocop', '~> 0.41.2', require: false gem 'rubocop-rspec', '~> 1.5.0', require: false gem 'scss_lint', '~> 0.47.0', require: false - gem 'simplecov', '~> 0.11.0', require: false + gem 'simplecov', '~> 0.12.0', require: false gem 'flog', '~> 4.3.2', require: false gem 'flay', '~> 2.6.1', require: false gem 'bundler-audit', '~> 0.5.0', require: false diff --git a/scripts/merge-simplecov b/scripts/merge-simplecov index 2af5f8c0918..9504321e6d7 100755 --- a/scripts/merge-simplecov +++ b/scripts/merge-simplecov @@ -46,42 +46,11 @@ def all_results results end -def merge_resultset(a1, a2) - return a1 || [] unless a2 - return a2 || [] unless a1 - - new_array = a1.dup - a2.each_with_index do |element, i| - if element.nil? && new_array[i].nil? - new_array[i] = nil - elsif element.nil? && new_array[i] == 0 || element == 0 && new_array[i].nil? - new_array[i] = nil - else - local_value = element || 0 - other_value = new_array[i] || 0 - new_array[i] = local_value + other_value - end - end - new_array -end - -def merge_hashes(h1, h2) - new_resultset = {} - (h1.keys + h2.keys).each do |filename| - new_resultset[filename] = [] - end - - new_resultset.each_key do |filename| - new_resultset[filename] = merge_resultset(h1[filename], h2[filename]) - end - new_resultset -end - def merged_result merged = {} results = all_results results.each do |result| - merged = merge_hashes(result.original_result, merged) + merged = result.original_result.merge_resultset(merged) end result = SimpleCov::Result.new(merged) # Specify the command name From e18eddcb208fecd0abd9ce328a0e71f2560a0672 Mon Sep 17 00:00:00 2001 From: Kamil Trzcinski Date: Mon, 4 Jul 2016 15:02:27 +0200 Subject: [PATCH 11/20] Remove unused coveralls --- Gemfile.lock | 6 +++--- lib/tasks/test.rake | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 8739f8579d5..3ec11f46a5c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -668,9 +668,9 @@ GEM rufus-scheduler (>= 2.0.24) sidekiq (>= 4.0.0) simple_oauth (0.1.9) - simplecov (0.11.2) + simplecov (0.12.0) docile (~> 1.1.0) - json (~> 1.8) + json (>= 1.8, < 3) simplecov-html (~> 0.10.0) simplecov-html (0.10.0) sinatra (1.4.7) @@ -952,7 +952,7 @@ DEPENDENCIES shoulda-matchers (~> 2.8.0) sidekiq (~> 4.0) sidekiq-cron (~> 0.4.0) - simplecov (~> 0.11.0) + simplecov (~> 0.12.0) sinatra (~> 1.4.4) six (~> 0.2.0) slack-notifier (~> 1.2.0) diff --git a/lib/tasks/test.rake b/lib/tasks/test.rake index 21c0e5f1d41..d3dcbd2c29b 100644 --- a/lib/tasks/test.rake +++ b/lib/tasks/test.rake @@ -7,5 +7,5 @@ end unless Rails.env.production? desc "GitLab | Run all tests on CI with simplecov" - task test_ci: [:rubocop, :brakeman, 'teaspoon', :spinach, :spec] + task test_ci: [:rubocop, :brakeman, :teaspoon, :spinach, :spec] end From 47db7fd3e2c6b6ef65f6b7e7e022d769a3bbc2e2 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 21 Jul 2016 10:02:52 +0200 Subject: [PATCH 12/20] Load app in test env eagerly to improve test coverage --- config/environments/test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/environments/test.rb b/config/environments/test.rb index fb25d3a8b14..6e797c79820 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -30,7 +30,7 @@ Rails.application.configure do # Print deprecation notices to the stderr config.active_support.deprecation = :stderr - config.eager_load = false + config.eager_load = true config.cache_store = :null_store From be3ad008aad2745e3a80ca789025005e180c805e Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 21 Jul 2016 10:03:41 +0200 Subject: [PATCH 13/20] Improve simplecov config to avoid missing files --- spec/simplecov_env.rb | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/spec/simplecov_env.rb b/spec/simplecov_env.rb index 956476fd065..112ca1b176a 100644 --- a/spec/simplecov_env.rb +++ b/spec/simplecov_env.rb @@ -1,7 +1,8 @@ require 'simplecov' SimpleCov.configure do - load_profile :rails + load_profile 'test_frameworks' + track_files '{app,lib}/**/*.rb' if ENV['CI_BUILD_NAME'] coverage_dir "coverage/#{ENV['CI_BUILD_NAME']}" @@ -17,7 +18,14 @@ SimpleCov.configure do end add_filter '/vendor/ruby/' + add_filter 'config/initializers/' + add_group 'Controllers', 'app/controllers' + add_group 'Models', 'app/models' + add_group 'Mailers', 'app/mailers' + add_group 'Helpers', 'app/helpers' + add_group 'Workers', %w(app/jobs app/workers) + add_group 'Libraries', 'lib' add_group 'Services', 'app/services' add_group 'Finders', 'app/finders' add_group 'Uploaders', 'app/uploaders' From 8e5e668e1a0844ebafbfc8081d9f71a030feb1d6 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 21 Jul 2016 10:25:57 +0200 Subject: [PATCH 14/20] Patch SimpleCov to reuse code for coverage merger --- scripts/merge-simplecov | 70 +++++++++++------------------------------ 1 file changed, 19 insertions(+), 51 deletions(-) diff --git a/scripts/merge-simplecov b/scripts/merge-simplecov index 9504321e6d7..ab15b43bd0f 100755 --- a/scripts/merge-simplecov +++ b/scripts/merge-simplecov @@ -1,61 +1,29 @@ #!/usr/bin/env ruby -begin - load File.expand_path('../spring', __FILE__) -rescue LoadError => e - raise unless e.message.include?('spring') -end require 'simplecov' -def read(file) - return unless File.exist?(file) - data = File.read(file) - return if data.nil? || data.length < 2 - data -end +module SimpleCov + module ResultMerger + class << self + def resultset_files + Dir.glob(File.join(SimpleCov.coverage_path, '*', '.resultset.json')) + end -def load(file) - begin - JSON.parse(read(file)) - rescue - {} - end -end + def resultset_hashes + resultset_files.map do |path| + begin + JSON.parse(File.read(path)) + rescue + {} + end + end + end -def files - Dir.glob(File.join(SimpleCov.coverage_path, '*', '.resultset.json')) -end - -def resultsfiles - files.map { |file| load(file) } -end - -def resultsets - resultsfiles.reduce({}, :merge) -end - -def all_results - results = [] - resultsets.each do |command_name, data| - result = SimpleCov::Result.from_hash(command_name => data) - # Only add result if the timeout is above the configured threshold - if (Time.now - result.created_at) < SimpleCov.merge_timeout - results << result + def resultset + resultset_hashes.reduce({}, :merge) + end end end - results -end - -def merged_result - merged = {} - results = all_results - results.each do |result| - merged = result.original_result.merge_resultset(merged) - end - result = SimpleCov::Result.new(merged) - # Specify the command name - result.command_name = results.map(&:command_name).sort.join(", ") - result end # Ignore CI environment @@ -64,4 +32,4 @@ ENV['CI_BUILD_NAME'] = nil require_relative '../spec/simplecov_env' -merged_result.format! +SimpleCov::ResultMerger.merged_result.format! From 7a0f4d3c905cc92880697deac365a6c596fd55a8 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 21 Jul 2016 10:44:18 +0200 Subject: [PATCH 15/20] Introduce SimpleCovEnv singleton helper and use it --- features/support/env.rb | 4 +-- scripts/merge-simplecov | 9 ++---- spec/simplecov_env.rb | 67 ++++++++++++++++++++++++++--------------- spec/spec_helper.rb | 4 +-- 4 files changed, 49 insertions(+), 35 deletions(-) diff --git a/features/support/env.rb b/features/support/env.rb index 2a3e21d28bc..569fd444e86 100644 --- a/features/support/env.rb +++ b/features/support/env.rb @@ -1,5 +1,5 @@ -require_relative '../../spec/simplecov_env' -SimpleCov.start if ENV['SIMPLECOV'] +require './spec/simplecov_env' +SimpleCovEnv.start! ENV['RAILS_ENV'] = 'test' require './config/environment' diff --git a/scripts/merge-simplecov b/scripts/merge-simplecov index ab15b43bd0f..65f93f8830b 100755 --- a/scripts/merge-simplecov +++ b/scripts/merge-simplecov @@ -1,6 +1,7 @@ #!/usr/bin/env ruby -require 'simplecov' +require_relative '../spec/simplecov_env' +SimpleCovEnv.configure_profile module SimpleCov module ResultMerger @@ -26,10 +27,4 @@ module SimpleCov end end -# Ignore CI environment -ENV['CI'] = nil -ENV['CI_BUILD_NAME'] = nil - -require_relative '../spec/simplecov_env' - SimpleCov::ResultMerger.merged_result.format! diff --git a/spec/simplecov_env.rb b/spec/simplecov_env.rb index 112ca1b176a..6f8f7109e14 100644 --- a/spec/simplecov_env.rb +++ b/spec/simplecov_env.rb @@ -1,35 +1,54 @@ require 'simplecov' -SimpleCov.configure do - load_profile 'test_frameworks' - track_files '{app,lib}/**/*.rb' +module SimpleCovEnv + extend self - if ENV['CI_BUILD_NAME'] - coverage_dir "coverage/#{ENV['CI_BUILD_NAME']}" - command_name ENV['CI_BUILD_NAME'] + def start! + return unless ENV['SIMPLECOV'] + + configure_profile + configure_job + + SimpleCov.start end - if ENV['CI'] - SimpleCov.at_exit do - # In CI environment don't generate formatted reports - # Only generate .resultset.json - SimpleCov.result + def configure_job + SimpleCov.configure do + if ENV['CI_BUILD_NAME'] + coverage_dir "coverage/#{ENV['CI_BUILD_NAME']}" + command_name ENV['CI_BUILD_NAME'] + end + + if ENV['CI'] + SimpleCov.at_exit do + # In CI environment don't generate formatted reports + # Only generate .resultset.json + SimpleCov.result + end + end end end - add_filter '/vendor/ruby/' - add_filter 'config/initializers/' + def configure_profile + SimpleCov.configure do + load_profile 'test_frameworks' + track_files '{app,lib}/**/*.rb' - add_group 'Controllers', 'app/controllers' - add_group 'Models', 'app/models' - add_group 'Mailers', 'app/mailers' - add_group 'Helpers', 'app/helpers' - add_group 'Workers', %w(app/jobs app/workers) - add_group 'Libraries', 'lib' - add_group 'Services', 'app/services' - add_group 'Finders', 'app/finders' - add_group 'Uploaders', 'app/uploaders' - add_group 'Validators', 'app/validators' + add_filter '/vendor/ruby/' + add_filter 'config/initializers/' - merge_timeout 7200 + add_group 'Controllers', 'app/controllers' + add_group 'Models', 'app/models' + add_group 'Mailers', 'app/mailers' + add_group 'Helpers', 'app/helpers' + add_group 'Workers', %w(app/jobs app/workers) + add_group 'Libraries', 'lib' + add_group 'Services', 'app/services' + add_group 'Finders', 'app/finders' + add_group 'Uploaders', 'app/uploaders' + add_group 'Validators', 'app/validators' + + merge_timeout 7200 + end + end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index d2760d0ef28..4f3aacf55be 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,5 +1,5 @@ -require_relative 'simplecov_env' -SimpleCov.start if ENV['SIMPLECOV'] +require './spec/simplecov_env' +SimpleCovEnv.start! ENV["RAILS_ENV"] ||= 'test' From 133df7ee57ae217720af9887d8373299ca15d982 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 21 Jul 2016 14:00:54 +0200 Subject: [PATCH 16/20] Revert eager loading in test env that breakes teaspoon --- config/environments/test.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/environments/test.rb b/config/environments/test.rb index 6e797c79820..fb25d3a8b14 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -30,7 +30,7 @@ Rails.application.configure do # Print deprecation notices to the stderr config.active_support.deprecation = :stderr - config.eager_load = true + config.eager_load = false config.cache_store = :null_store From f0f77252b851f0ecc14f51f06df595556b89e442 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 21 Jul 2016 14:54:31 +0200 Subject: [PATCH 17/20] Deploy ruby test coverage report to gitlab pages --- .gitlab-ci.yml | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8f75a46dfe8..d5305d9a26b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -63,20 +63,6 @@ update-knapsack: only: - master -update-coverage: - stage: post-test - services: [] - variables: - USE_DB: "false" - USE_BUNDLE_INSTALL: "true" - script: - - bundle exec scripts/merge-simplecov - artifacts: - expire_in: 31d - paths: - - coverage/index.html - - coverage/assets/ - # Execute all testing suites .use-db: &use-db @@ -246,6 +232,21 @@ bundler:audit: script: - "bundle exec bundle-audit check --update --ignore OSVDB-115941" +coverage: + stage: post-test + services: [] + variables: + USE_DB: "false" + USE_BUNDLE_INSTALL: "true" + script: + - bundle exec scripts/merge-simplecov + artifacts: + expire_in: 31d + paths: + - coverage/index.html + - coverage/assets/ + + # Notify slack in the end notify:slack: @@ -258,3 +259,17 @@ notify:slack: - tags@gitlab-org/gitlab-ce - master@gitlab-org/gitlab-ee - tags@gitlab-org/gitlab-ee + +pages: + before_script: [] + services: [] + variables: {} + stage: pages + dependencies: + - coverage + script: + - mkdir -p public/coverage-ruby + - mv coverage public/coverage-ruby + artifacts: + paths: + - public From ccbd77b2a712a4f70fdb1fb59ae8858e6a15f6e1 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Fri, 22 Jul 2016 10:02:54 +0200 Subject: [PATCH 18/20] Improve CI configuration file for pages stage --- .gitlab-ci.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d5305d9a26b..ea97a317931 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -192,14 +192,14 @@ spinach 9 10 ruby23: *spinach-knapsack-ruby23 # Other generic tests -.static-analyses-variables: &static-analyses-variables +.ruby-static-analysis: &ruby-static-analysis variables: SIMPLECOV: "false" USE_DB: "false" USE_BUNDLE_INSTALL: "true" .exec: &exec - <<: *static-analyses-variables + <<: *ruby-static-analysis stage: test script: - bundle exec $CI_BUILD_NAME @@ -226,7 +226,7 @@ teaspoon: bundler:audit: stage: test - <<: *static-analyses-variables + <<: *ruby-static-analysis only: - master script: @@ -241,6 +241,7 @@ coverage: script: - bundle exec scripts/merge-simplecov artifacts: + name: coverage expire_in: 31d paths: - coverage/index.html @@ -262,13 +263,12 @@ notify:slack: pages: before_script: [] - services: [] - variables: {} stage: pages dependencies: - coverage script: - - mkdir -p public/coverage-ruby + - mv public/ .public/ + - mkdir public/ - mv coverage public/coverage-ruby artifacts: paths: From 89f46d3ae2c9586b0bd0efa165deedf09c176744 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Fri, 22 Jul 2016 13:42:41 +0200 Subject: [PATCH 19/20] Deploy test coverage report on master pipeline only --- .gitlab-ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ea97a317931..2eda2a6007d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -273,3 +273,5 @@ pages: artifacts: paths: - public + only: + - master From f00dc0fcae6cf482c1bf60065bd2c1ecfaa9748d Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Wed, 27 Jul 2016 10:05:57 +0200 Subject: [PATCH 20/20] Depened on exact version of SimpleCov when patched --- Gemfile | 2 +- Gemfile.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index 35dd69ef408..cc99b5b39fe 100644 --- a/Gemfile +++ b/Gemfile @@ -302,7 +302,7 @@ group :development, :test do gem 'rubocop', '~> 0.41.2', require: false gem 'rubocop-rspec', '~> 1.5.0', require: false gem 'scss_lint', '~> 0.47.0', require: false - gem 'simplecov', '~> 0.12.0', require: false + gem 'simplecov', '0.12.0', require: false gem 'flog', '~> 4.3.2', require: false gem 'flay', '~> 2.6.1', require: false gem 'bundler-audit', '~> 0.5.0', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 3ec11f46a5c..b53deb8c233 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -952,7 +952,7 @@ DEPENDENCIES shoulda-matchers (~> 2.8.0) sidekiq (~> 4.0) sidekiq-cron (~> 0.4.0) - simplecov (~> 0.12.0) + simplecov (= 0.12.0) sinatra (~> 1.4.4) six (~> 0.2.0) slack-notifier (~> 1.2.0)