diff options
author | Stan Hu <stanhu@gmail.com> | 2019-03-12 09:51:37 +0000 |
---|---|---|
committer | Rémy Coutable <remy@rymai.me> | 2019-03-12 09:51:37 +0000 |
commit | f11030173b909c64aa23ce7482af8fcee8554be9 (patch) | |
tree | 992eee7e969a04dce7769c9338f280b35de282dd /config | |
parent | 32056fc7b282d1fd14e62939e721c7935492ec8f (diff) | |
download | gitlab-ce-f11030173b909c64aa23ce7482af8fcee8554be9.tar.gz |
Batch insert CI rspec_profiling data
Instead of inserting a row after each example to an external database,
we save the CI profiling reports into the `rspec_profiling` directory
and insert the data in the update-tests-metadata CI stage. This should
make each spec run faster and also reduce the number of PostgreSQL
connections needed by concurrent CI builds.
`scripts/insert-rspec-profiling-data` also inserts one file at a time
via the PostgreSQL COPY command for faster inserts. The one side effect
is that the `created_at` and `updated_at` timestamps aren't available
since they aren't generated in the CSV.
Closes https://gitlab.com/gitlab-org/gitlab-ee/issues/10154
Diffstat (limited to 'config')
-rw-r--r-- | config/initializers/rspec_profiling.rb | 50 |
1 files changed, 35 insertions, 15 deletions
diff --git a/config/initializers/rspec_profiling.rb b/config/initializers/rspec_profiling.rb index 2de310753a9..715e17057e0 100644 --- a/config/initializers/rspec_profiling.rb +++ b/config/initializers/rspec_profiling.rb @@ -1,7 +1,28 @@ +# frozen_string_literal: true + +return unless Rails.env.test? + module RspecProfilingExt - module PSQL - def establish_connection - ::RspecProfiling::Collectors::PSQL::Result.establish_connection(ENV['RSPEC_PROFILING_POSTGRES_URL']) + module Collectors + class CSVWithTimestamps < ::RspecProfiling::Collectors::CSV + TIMESTAMP_FIELDS = %w(created_at updated_at).freeze + HEADERS = (::RspecProfiling::Collectors::CSV::HEADERS + TIMESTAMP_FIELDS).freeze + + def insert(attributes) + output << HEADERS.map do |field| + if TIMESTAMP_FIELDS.include?(field) + Time.now + else + attributes.fetch(field.to_sym) + end + end + end + + private + + def output + @output ||= ::CSV.open(path, "w").tap { |csv| csv << HEADERS } + end end end @@ -10,9 +31,13 @@ module RspecProfilingExt if ENV['CI_COMMIT_REF_NAME'] "#{defined?(Gitlab::License) ? 'ee' : 'ce'}:#{ENV['CI_COMMIT_REF_NAME']}" else - super + super&.chomp end end + + def sha + super&.chomp + end end module Run @@ -30,16 +55,11 @@ module RspecProfilingExt end end -if Rails.env.test? - RspecProfiling.configure do |config| - if ENV['RSPEC_PROFILING_POSTGRES_URL'].present? - RspecProfiling::Collectors::PSQL.prepend(RspecProfilingExt::PSQL) - config.collector = RspecProfiling::Collectors::PSQL - end - - if ENV.key?('CI') - RspecProfiling::VCS::Git.prepend(RspecProfilingExt::Git) - RspecProfiling::Run.prepend(RspecProfilingExt::Run) - end +RspecProfiling.configure do |config| + if ENV.key?('CI') || ENV.key?('RSPEC_PROFILING') + RspecProfiling::VCS::Git.prepend(RspecProfilingExt::Git) + RspecProfiling::Run.prepend(RspecProfilingExt::Run) + config.collector = RspecProfilingExt::Collectors::CSVWithTimestamps + config.csv_path = -> { "rspec_profiling/#{Time.now.to_i}-#{SecureRandom.hex(8)}-rspec-data.csv" } end end |