BigW Consortium Gitlab

builds_email_service.rb 2.25 KB
Newer Older
1 2 3 4
class BuildsEmailService < Service
  prop_accessor :recipients
  boolean_accessor :add_pusher
  boolean_accessor :notify_only_broken_builds
5
  validates :recipients, presence: true, if: ->(s) { s.activated? && !s.add_pusher? }
6

7 8 9 10 11 12
  def initialize_properties
    if properties.nil?
      self.properties = {}
      self.notify_only_broken_builds = true
    end
  end
13

14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
  def title
    'Builds emails'
  end

  def description
    'Email the builds status to a list of recipients.'
  end

  def to_param
    'builds_email'
  end

  def supported_events
    %w(build)
  end

  def execute(push_data)
    return unless supported_events.include?(push_data[:object_kind])
32
    return unless should_build_be_notified?(push_data)
33

34 35 36
    recipients = all_recipients(push_data)

    if recipients.any?
37 38
      BuildEmailWorker.perform_async(
        push_data[:build_id],
39 40
        recipients,
        push_data
41 42 43 44
      )
    end
  end

45
  def can_test?
46
    project.builds.any?
47 48 49 50 51 52 53
  end

  def disabled_title
    "Please setup a build on your repository."
  end

  def test_data(project = nil, user = nil)
54
    Gitlab::DataBuilder::Build.build(project.builds.last)
55 56
  end

57 58
  def fields
    [
59
      { type: 'textarea', name: 'recipients', placeholder: 'Emails separated by comma' },
60 61 62 63 64
      { type: 'checkbox', name: 'add_pusher', label: 'Add pusher to recipients list' },
      { type: 'checkbox', name: 'notify_only_broken_builds' },
    ]
  end

65 66 67 68 69 70 71 72 73 74 75 76 77 78
  def test(data)
    begin
      # bypass build status verification when testing
      data[:build_status] = "failed"
      data[:build_allow_failure] = false

      result = execute(data)
    rescue StandardError => error
      return { success: false, result: error }
    end

    { success: true, result: result }
  end

79 80 81 82 83
  def should_build_be_notified?(data)
    case data[:build_status]
    when 'success'
      !notify_only_broken_builds?
    when 'failed'
84
      !allow_failure?(data)
85 86 87 88 89
    else
      false
    end
  end

90 91 92 93
  def allow_failure?(data)
    data[:build_allow_failure] == true
  end

94
  def all_recipients(data)
95 96 97 98 99
    all_recipients = []

    unless recipients.blank?
      all_recipients += recipients.split(',').compact.reject(&:blank?)
    end
100

101
    if add_pusher? && data[:user][:email]
102
      all_recipients << data[:user][:email]
103
    end
104 105

    all_recipients
106 107
  end
end