summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKamil Trzcinski <ayufan@ayufan.eu>2016-10-14 19:08:48 +0200
committerKamil Trzcinski <ayufan@ayufan.eu>2016-10-17 08:54:33 +0200
commit9c6c5c79f8d3a555ded0539e06a922bc058d5c20 (patch)
tree2eaeef2a09d905bf1c4b695014bde5c75c7a0ab0
parentcb8654e85650ba6107031cc978d882f4b2f272cf (diff)
downloadgitlab-ce-9c6c5c79f8d3a555ded0539e06a922bc058d5c20.tar.gz
Add Pipeline metrics worker
-rw-r--r--CHANGELOG.md1
-rw-r--r--app/models/ci/pipeline.rb10
-rw-r--r--app/workers/pipeline_metrics_worker.rb15
3 files changed, 22 insertions, 4 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 46f718fc88a..06269b79f14 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -21,6 +21,7 @@ Please view this file on the master branch, on stable branches it's out of date.
- Change user & group landing page routing from /u/:username to /:username
- Prevent running GfmAutocomplete setup for each diff note !6569
- Added documentation for .gitattributes files
+ - Move Pipeline Metrics to separate worker
- AbstractReferenceFilter caches project_refs on RequestStore when active
- Replaced the check sign to arrow in the show build view. !6501
- Add a /wip slash command to toggle the Work In Progress status of a merge request. !6259 (tbalthazar)
diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb
index 4fdb5fef4fb..c7b9d6cc223 100644
--- a/app/models/ci/pipeline.rb
+++ b/app/models/ci/pipeline.rb
@@ -49,6 +49,10 @@ module Ci
transition any => :canceled
end
+ # IMPORTANT
+ # Do not add any operations to this state_machine
+ # Create a separate worker for each new operation
+
before_transition [:created, :pending] => :running do |pipeline|
pipeline.started_at = Time.now
end
@@ -62,13 +66,11 @@ module Ci
end
after_transition [:created, :pending] => :running do |pipeline|
- MergeRequest::Metrics.where(merge_request_id: pipeline.merge_requests.map(&:id)).
- update_all(latest_build_started_at: pipeline.started_at, latest_build_finished_at: nil)
+ pipeline.run_after_commit { PipelineMetricsWorker.perform_async(id) }
end
after_transition any => [:success] do |pipeline|
- MergeRequest::Metrics.where(merge_request_id: pipeline.merge_requests.map(&:id)).
- update_all(latest_build_finished_at: pipeline.finished_at)
+ pipeline.run_after_commit { PipelineMetricsWorker.perform_async(id) }
end
after_transition [:created, :pending, :running] => :success do |pipeline|
diff --git a/app/workers/pipeline_metrics_worker.rb b/app/workers/pipeline_metrics_worker.rb
new file mode 100644
index 00000000000..3d1cd770515
--- /dev/null
+++ b/app/workers/pipeline_metrics_worker.rb
@@ -0,0 +1,15 @@
+class PipelineMetricsWorker
+ include Sidekiq::Worker
+
+ sidekiq_options queue: :default
+
+ def perform(pipeline_id)
+ Ci::Pipeline.find_by(id: pipeline_id).try do |pipeline|
+ merge_requests = pipeline.merge_requests.map(&:id)
+
+ metrics = MergeRequest::Metrics.where(merge_request_id: merge_requests)
+ metrics.update_all(latest_build_started_at: pipeline.started_at) if pipeline.active?
+ metrics.update_all(latest_build_finished_at: pipeline.finished_at) if pipeline.success?
+ end
+ end
+end