Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/integrations/pipelines_email.rb')
-rw-r--r--app/models/integrations/pipelines_email.rb105
1 files changed, 105 insertions, 0 deletions
diff --git a/app/models/integrations/pipelines_email.rb b/app/models/integrations/pipelines_email.rb
new file mode 100644
index 00000000000..585bc14242a
--- /dev/null
+++ b/app/models/integrations/pipelines_email.rb
@@ -0,0 +1,105 @@
+# frozen_string_literal: true
+
+module Integrations
+ class PipelinesEmail < Integration
+ include NotificationBranchSelection
+
+ prop_accessor :recipients, :branches_to_be_notified
+ boolean_accessor :notify_only_broken_pipelines, :notify_only_default_branch
+ validates :recipients, presence: true, if: :validate_recipients?
+
+ def initialize_properties
+ if properties.nil?
+ self.properties = {}
+ self.notify_only_broken_pipelines = true
+ self.branches_to_be_notified = "default"
+ elsif !self.notify_only_default_branch.nil?
+ # In older versions, there was only a boolean property named
+ # `notify_only_default_branch`. Now we have a string property named
+ # `branches_to_be_notified`. Instead of doing a background migration, we
+ # opted to set a value for the new property based on the old one, if
+ # users hasn't specified one already. When users edit the service and
+ # selects a value for this new property, it will override everything.
+
+ self.branches_to_be_notified ||= notify_only_default_branch? ? "default" : "all"
+ end
+ end
+
+ def title
+ _('Pipeline status emails')
+ end
+
+ def description
+ _('Email the pipeline status to a list of recipients.')
+ end
+
+ def self.to_param
+ 'pipelines_email'
+ end
+
+ def self.supported_events
+ %w[pipeline]
+ end
+
+ def self.default_test_event
+ 'pipeline'
+ end
+
+ def execute(data, force: false)
+ return unless supported_events.include?(data[:object_kind])
+ return unless force || should_pipeline_be_notified?(data)
+
+ all_recipients = retrieve_recipients(data)
+
+ return unless all_recipients.any?
+
+ pipeline_id = data[:object_attributes][:id]
+ PipelineNotificationWorker.new.perform(pipeline_id, recipients: all_recipients)
+ end
+
+ def can_test?
+ project&.ci_pipelines&.any?
+ end
+
+ def fields
+ [
+ { type: 'textarea',
+ name: 'recipients',
+ help: _('Comma-separated list of email addresses.'),
+ required: true },
+ { type: 'checkbox',
+ name: 'notify_only_broken_pipelines' },
+ { type: 'select',
+ name: 'branches_to_be_notified',
+ choices: branch_choices }
+ ]
+ end
+
+ def test(data)
+ result = execute(data, force: true)
+
+ { success: true, result: result }
+ rescue StandardError => error
+ { success: false, result: error }
+ end
+
+ def should_pipeline_be_notified?(data)
+ notify_for_branch?(data) && notify_for_pipeline?(data)
+ end
+
+ def notify_for_pipeline?(data)
+ case data[:object_attributes][:status]
+ when 'success'
+ !notify_only_broken_pipelines?
+ when 'failed'
+ true
+ else
+ false
+ end
+ end
+
+ def retrieve_recipients(data)
+ recipients.to_s.split(/[,\r\n ]+/).reject(&:empty?)
+ end
+ end
+end