1# frozen_string_literal: true 2 3class PipelineMetricsWorker # rubocop:disable Scalability/IdempotentWorker 4 include ApplicationWorker 5 6 data_consistency :always 7 8 sidekiq_options retry: 3 9 include PipelineQueue 10 11 urgency :high 12 13 def perform(pipeline_id) 14 Ci::Pipeline.find_by_id(pipeline_id).try do |pipeline| 15 update_metrics_for_active_pipeline(pipeline) if pipeline.active? 16 update_metrics_for_succeeded_pipeline(pipeline) if pipeline.success? 17 end 18 end 19 20 private 21 22 def update_metrics_for_active_pipeline(pipeline) 23 metrics(pipeline).update_all(latest_build_started_at: pipeline.started_at, latest_build_finished_at: nil, pipeline_id: pipeline.id) 24 end 25 26 def update_metrics_for_succeeded_pipeline(pipeline) 27 metrics(pipeline).update_all(latest_build_started_at: pipeline.started_at, latest_build_finished_at: pipeline.finished_at, pipeline_id: pipeline.id) 28 end 29 30 def metrics(pipeline) 31 MergeRequest::Metrics.where(merge_request_id: merge_requests(pipeline)) # rubocop: disable CodeReuse/ActiveRecord 32 end 33 34 def merge_requests(pipeline) 35 pipeline.merge_requests_as_head_pipeline.map(&:id) 36 end 37end 38