slack_service.rb 1.82 KB
Newer Older
1 2
# == Schema Information
#
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
3
# Table name: ci_services
4 5 6 7 8 9 10 11 12 13 14 15
#
#  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
#

module Ci
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
16
  class SlackService < Ci::Service
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
    prop_accessor :webhook
    boolean_accessor :notify_only_broken_builds
    validates :webhook, presence: true, if: :activated?

    default_value_for :notify_only_broken_builds, true

    def title
      'Slack'
    end

    def description
      'A team communication tool for the 21st century'
    end

    def to_param
      'slack'
    end

    def help
      'Visit https://www.slack.com/services/new/incoming-webhook. Then copy link and save project!' unless webhook.present?
    end

    def fields
      [
        { type: 'text', name: 'webhook', label: 'Webhook URL', placeholder: '' },
        { 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
51
      return unless commit.latest_builds.include?(build)
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

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

    def execute(build)
      message = Ci::SlackMessage.new(build.commit)
      options = default_options.merge(
        color: message.color,
        fallback: message.fallback,
        attachments: message.attachments
      )
      Ci::SlackNotifierWorker.perform_async(webhook, message.pretext, options)
    end

    private

    def default_options
      {
        username: 'GitLab CI'
      }
    end
  end
end