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