summaryrefslogtreecommitdiff
path: root/app/models/project_services/hip_chat_service.rb
blob: aa336330eae85c1a98f40240c3d3143d03c7913d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# == Schema Information
#
# Table name: services
#
#  id         :integer          not null, primary key
#  type       :string(255)
#  title      :string(255)
#  project_id :integer          not null
#  created_at :datetime
#  updated_at :datetime
#  active     :boolean          default(FALSE), not null
#  properties :text
#

class HipChatService < Service
  prop_accessor :hipchat_token, :hipchat_room, :hipchat_server
  boolean_accessor :notify_only_broken_builds
  validates :hipchat_token, presence: true, if: :activated?
  validates :hipchat_room, presence: true, if: :activated?
  default_value_for :notify_only_broken_builds, true

  def title
    "HipChat"
  end

  def description
    "Private group chat, video chat, instant messaging for teams"
  end

  def help
  end

  def to_param
    'hip_chat'
  end

  def fields
    [
      { type: 'text', name: 'hipchat_token',  label: 'Token', placeholder: '' },
      { type: 'text', name: 'hipchat_room',   label: 'Room', placeholder: '' },
      { type: 'text', name: 'hipchat_server', label: 'Server', placeholder: 'https://hipchat.example.com', help: 'Leave blank for default' },
      { type: 'checkbox', name: 'notify_only_broken_builds', label: 'Notify only broken builds' }
    ]
  end

  def can_execute?(build)
    return if build.allow_failure?

    commit = build.commit
    return unless commit
    return unless commit.builds_without_retry.include? build

    case commit.status.to_sym
    when :failed
      true
    when :success
      true unless notify_only_broken_builds?
    else
      false
    end
  end

  def execute(build)
    msg = HipChatMessage.new(build)
    opts = default_options.merge(
      token: hipchat_token,
      room: hipchat_room,
      server: server_url,
      color: msg.status_color,
      notify: msg.notify?
    )
    HipChatNotifierWorker.perform_async(msg.to_s, opts)
  end

  private

  def default_options
    {
      service_name: 'GitLab CI',
      message_format: 'html'
    }
  end

  def server_url
    if hipchat_server.blank?
      'https://api.hipchat.com'
    else
      hipchat_server
    end
  end
end