diff --git a/.rubocop_manual_todo.yml b/.rubocop_manual_todo.yml index 7f18912b34c83714aab0595aa12bb82cd41c7cf0..d32db0336e5fd47c5b2bb881afc9f323dcf1eb9a 100644 --- a/.rubocop_manual_todo.yml +++ b/.rubocop_manual_todo.yml @@ -198,7 +198,6 @@ Rails/SaveBang: - 'ee/spec/services/start_pull_mirroring_service_spec.rb' - 'ee/spec/services/status_page/trigger_publish_service_spec.rb' - 'ee/spec/services/todo_service_spec.rb' - - 'ee/spec/services/update_build_minutes_service_spec.rb' - 'ee/spec/services/vulnerability_feedback/create_service_spec.rb' - 'ee/spec/support/protected_tags/access_control_shared_examples.rb' - 'ee/spec/support/shared_examples/features/protected_branches_access_control_shared_examples.rb' @@ -2530,7 +2529,6 @@ Gitlab/NamespacedClass: - 'ee/app/services/ldap_group_reset_service.rb' - 'ee/app/services/start_pull_mirroring_service.rb' - 'ee/app/services/timebox_report_service.rb' - - 'ee/app/services/update_build_minutes_service.rb' - 'ee/app/uploaders/issuable_metric_image_uploader.rb' - 'ee/app/validators/host_validator.rb' - 'ee/app/validators/ldap_filter_validator.rb' diff --git a/ee/app/services/ci/minutes/update_build_minutes_service.rb b/ee/app/services/ci/minutes/update_build_minutes_service.rb new file mode 100644 index 0000000000000000000000000000000000000000..2a96a3ad5626d18563c75e39cde9087849598d64 --- /dev/null +++ b/ee/app/services/ci/minutes/update_build_minutes_service.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +module Ci + module Minutes + class UpdateBuildMinutesService < BaseService + def execute(build) + return unless build.shared_runners_minutes_limit_enabled? + return unless build.complete? + return unless build.duration&.positive? + + count_projects_based_on_cost_factors(build) + end + + private + + def count_projects_based_on_cost_factors(build) + cost_factor = build.runner.minutes_cost_factor(project.visibility_level) + duration_with_cost_factor = (build.duration * cost_factor).to_i + + return unless duration_with_cost_factor > 0 + + ProjectStatistics.update_counters(project_statistics, + shared_runners_seconds: duration_with_cost_factor) + + NamespaceStatistics.update_counters(namespace_statistics, + shared_runners_seconds: duration_with_cost_factor) + end + + def namespace_statistics + namespace.namespace_statistics || namespace.create_namespace_statistics + end + + def project_statistics + project.statistics || project.create_statistics(namespace: project.namespace) + end + + def namespace + project.shared_runners_limit_namespace + end + end + end +end diff --git a/ee/app/services/update_build_minutes_service.rb b/ee/app/services/update_build_minutes_service.rb deleted file mode 100644 index c39428ac483c129f693b503c848f53690bc18553..0000000000000000000000000000000000000000 --- a/ee/app/services/update_build_minutes_service.rb +++ /dev/null @@ -1,38 +0,0 @@ -# frozen_string_literal: true - -class UpdateBuildMinutesService < BaseService - def execute(build) - return unless build.shared_runners_minutes_limit_enabled? - return unless build.complete? - return unless build.duration&.positive? - - count_projects_based_on_cost_factors(build) - end - - private - - def count_projects_based_on_cost_factors(build) - cost_factor = build.runner.minutes_cost_factor(project.visibility_level) - duration_with_cost_factor = (build.duration * cost_factor).to_i - - return unless duration_with_cost_factor > 0 - - ProjectStatistics.update_counters(project_statistics, - shared_runners_seconds: duration_with_cost_factor) - - NamespaceStatistics.update_counters(namespace_statistics, - shared_runners_seconds: duration_with_cost_factor) - end - - def namespace_statistics - namespace.namespace_statistics || namespace.create_namespace_statistics - end - - def project_statistics - project.statistics || project.create_statistics(namespace: project.namespace) - end - - def namespace - project.shared_runners_limit_namespace - end -end diff --git a/ee/app/workers/ee/build_finished_worker.rb b/ee/app/workers/ee/build_finished_worker.rb index e8f81edbdc88b9bb6381592f8da7c11aae543fe6..04abc7fb1a8692b5370bef0070387f879edc2c15 100644 --- a/ee/app/workers/ee/build_finished_worker.rb +++ b/ee/app/workers/ee/build_finished_worker.rb @@ -3,7 +3,7 @@ module EE module BuildFinishedWorker def process_build(build) - UpdateBuildMinutesService.new(build.project, nil).execute(build) + ::Ci::Minutes::UpdateBuildMinutesService.new(build.project, nil).execute(build) # We need to use `reset` on `project` because their AR associations have been cached # and `Namespace#namespace_statistics` will return stale data. ::Ci::Minutes::EmailNotificationService.new(build.project.reset).execute if ::Gitlab.com? diff --git a/ee/spec/models/ci/build_spec.rb b/ee/spec/models/ci/build_spec.rb index b440b81a859758c18f3e942f44e44929a37bc37c..e99d9c741979cdddee0d4d7ad7524067f111ba76 100644 --- a/ee/spec/models/ci/build_spec.rb +++ b/ee/spec/models/ci/build_spec.rb @@ -98,7 +98,7 @@ %w(success drop cancel).each do |event| it "for event #{event}", :sidekiq_might_not_need_inline do - expect(UpdateBuildMinutesService) + expect(Ci::Minutes::UpdateBuildMinutesService) .to receive(:new).and_call_original job.public_send(event) diff --git a/ee/spec/services/update_build_minutes_service_spec.rb b/ee/spec/services/ci/minutes/update_build_minutes_service_spec.rb similarity index 95% rename from ee/spec/services/update_build_minutes_service_spec.rb rename to ee/spec/services/ci/minutes/update_build_minutes_service_spec.rb index 2d1b6191f229305411cf395c862318bfd704caa3..e4f94e2289e0d24948ccd02daca0e16675ecbdd0 100644 --- a/ee/spec/services/update_build_minutes_service_spec.rb +++ b/ee/spec/services/ci/minutes/update_build_minutes_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe UpdateBuildMinutesService do +RSpec.describe Ci::Minutes::UpdateBuildMinutesService do describe '#perform' do let(:namespace) { create(:namespace, shared_runners_minutes_limit: 100) } let(:project) { create(:project, :public, namespace: namespace) } @@ -31,7 +31,7 @@ context 'when statistics are created' do before do - project.statistics.update(shared_runners_seconds: 100) + project.statistics.update!(shared_runners_seconds: 100) namespace.create_namespace_statistics(shared_runners_seconds: 100) end