From 34cbc51e238a6b1626ef3d656b2dc80db6463971 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Thu, 25 Aug 2016 20:01:10 +0800 Subject: Add a new pipeline email service. TODO: email templates and tests --- .../project_services/pipelines_email_service.rb | 93 ++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 app/models/project_services/pipelines_email_service.rb (limited to 'app/models/project_services/pipelines_email_service.rb') diff --git a/app/models/project_services/pipelines_email_service.rb b/app/models/project_services/pipelines_email_service.rb new file mode 100644 index 00000000000..1f852445c1c --- /dev/null +++ b/app/models/project_services/pipelines_email_service.rb @@ -0,0 +1,93 @@ +class PipelinesEmailService < Service + prop_accessor :recipients + boolean_accessor :add_pusher + boolean_accessor :notify_only_broken_pipelines + validates :recipients, + presence: true, + if: ->(s) { s.activated? && !s.add_pusher? } + + def initialize_properties + self.properties ||= { notify_only_broken_builds: true } + end + + def title + 'Pipelines emails' + end + + def description + 'Email the pipelines status to a list of recipients.' + end + + def to_param + 'pipelines_email' + end + + def supported_events + %w[pipeline] + end + + def execute(data, force = false) + return unless supported_events.include?(data[:object_kind]) + return unless force || should_build_be_notified?(data) + + all_recipients = retrieve_recipients(data) + + return unless all_recipients.any? + + PipelineEmailWorker.perform_async(data, all_recipients) + end + + def can_test? + project.pipelines.count > 0 + end + + def disabled_title + 'Please setup a pipeline on your repository.' + end + + def test_data(project, user) + data = Gitlab::DataBuilder::Pipeline.build(project.pipelines.last) + data[:user] = user.hook_attrs + data + end + + def fields + [ + { type: 'textarea', + name: 'recipients', + placeholder: 'Emails separated by comma' }, + { type: 'checkbox', + name: 'add_pusher', + label: 'Add pusher to recipients list' }, + { type: 'checkbox', + name: 'notify_only_broken_pipelines' }, + ] + end + + def test(data) + result = execute(data, true) + + { success: true, result: result } + rescue StandardError => error + { success: false, result: error } + end + + def should_build_be_notified?(data) + case data[:object_attributes][:status] + when 'success' + !notify_only_broken_pipelines? + else + false + end + end + + def retrieve_recipients(data) + all_recipients = recipients.to_s.split(',').reject(&:blank?) + + if add_pusher? && data[:user].try(:[], :email) + all_recipients << data[:user][:email] + else + all_recipients + end + end +end -- cgit v1.2.1 From 4add6ca6ecb42fe08c0c1fbb1e7d5cf437e8ee3b Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Tue, 13 Sep 2016 19:09:53 +0800 Subject: Try to integrate the email into notification system --- app/models/project_services/pipelines_email_service.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'app/models/project_services/pipelines_email_service.rb') diff --git a/app/models/project_services/pipelines_email_service.rb b/app/models/project_services/pipelines_email_service.rb index 1f852445c1c..7ce0aa7c16e 100644 --- a/app/models/project_services/pipelines_email_service.rb +++ b/app/models/project_services/pipelines_email_service.rb @@ -34,7 +34,8 @@ class PipelinesEmailService < Service return unless all_recipients.any? - PipelineEmailWorker.perform_async(data, all_recipients) + pipeline = Ci::Pipeline.find(data[:object_attributes][:id]) + Ci::SendPipelineNotificationService.new(pipeline).execute(all_recipients) end def can_test? -- cgit v1.2.1 From 4ad63c29bb64bbb29598c6eef3b38e8b07c8d9e8 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Tue, 13 Sep 2016 23:38:46 +0800 Subject: Fixed the names and add missing check --- app/models/project_services/pipelines_email_service.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'app/models/project_services/pipelines_email_service.rb') diff --git a/app/models/project_services/pipelines_email_service.rb b/app/models/project_services/pipelines_email_service.rb index 7ce0aa7c16e..5f8d7554057 100644 --- a/app/models/project_services/pipelines_email_service.rb +++ b/app/models/project_services/pipelines_email_service.rb @@ -7,7 +7,7 @@ class PipelinesEmailService < Service if: ->(s) { s.activated? && !s.add_pusher? } def initialize_properties - self.properties ||= { notify_only_broken_builds: true } + self.properties ||= { notify_only_broken_pipelines: true } end def title @@ -28,7 +28,7 @@ class PipelinesEmailService < Service def execute(data, force = false) return unless supported_events.include?(data[:object_kind]) - return unless force || should_build_be_notified?(data) + return unless force || should_pipeline_be_notified?(data) all_recipients = retrieve_recipients(data) @@ -73,10 +73,12 @@ class PipelinesEmailService < Service { success: false, result: error } end - def should_build_be_notified?(data) + def should_pipeline_be_notified?(data) case data[:object_attributes][:status] when 'success' !notify_only_broken_pipelines? + when 'failed' + true else false end -- cgit v1.2.1 From 844d4e24af244b34d425e4d027a8acfe235b7178 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Thu, 15 Sep 2016 00:00:02 +0800 Subject: Use keyword arg, feedback: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/6019/diffs#note_15336212 --- app/models/project_services/pipelines_email_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app/models/project_services/pipelines_email_service.rb') diff --git a/app/models/project_services/pipelines_email_service.rb b/app/models/project_services/pipelines_email_service.rb index 5f8d7554057..e133b1696da 100644 --- a/app/models/project_services/pipelines_email_service.rb +++ b/app/models/project_services/pipelines_email_service.rb @@ -26,7 +26,7 @@ class PipelinesEmailService < Service %w[pipeline] end - def execute(data, force = false) + def execute(data, force: false) return unless supported_events.include?(data[:object_kind]) return unless force || should_pipeline_be_notified?(data) @@ -66,7 +66,7 @@ class PipelinesEmailService < Service end def test(data) - result = execute(data, true) + result = execute(data, force: true) { success: true, result: result } rescue StandardError => error -- cgit v1.2.1 From 9d92d41ff98f6afdcfa98d556541f93f38533519 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Thu, 15 Sep 2016 00:00:47 +0800 Subject: Omit else, feedback: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/6019/diffs#note_15336254 --- app/models/project_services/pipelines_email_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app/models/project_services/pipelines_email_service.rb') diff --git a/app/models/project_services/pipelines_email_service.rb b/app/models/project_services/pipelines_email_service.rb index e133b1696da..701b879a73e 100644 --- a/app/models/project_services/pipelines_email_service.rb +++ b/app/models/project_services/pipelines_email_service.rb @@ -89,8 +89,8 @@ class PipelinesEmailService < Service if add_pusher? && data[:user].try(:[], :email) all_recipients << data[:user][:email] - else - all_recipients end + + all_recipients end end -- cgit v1.2.1 From f1e5ca3a31c9c5c1c36aec8eaeaca89273855500 Mon Sep 17 00:00:00 2001 From: Lin Jen-Shin Date: Thu, 13 Oct 2016 01:12:00 +0800 Subject: Use any? instead of count > 0, feedback: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/6019#note_16832243 --- app/models/project_services/pipelines_email_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/models/project_services/pipelines_email_service.rb') diff --git a/app/models/project_services/pipelines_email_service.rb b/app/models/project_services/pipelines_email_service.rb index 701b879a73e..ec3c1bc85ee 100644 --- a/app/models/project_services/pipelines_email_service.rb +++ b/app/models/project_services/pipelines_email_service.rb @@ -39,7 +39,7 @@ class PipelinesEmailService < Service end def can_test? - project.pipelines.count > 0 + project.pipelines.any? end def disabled_title -- cgit v1.2.1