summaryrefslogtreecommitdiff
path: root/lib/oxidized/hook/slackdiff.rb
blob: 7cd4465c497b755f5383e40d0d0a92ce0e72c6a4 (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
require 'slack'

# defaults to posting a diff, if messageformat is supplied them a message will be posted too
# diffenable defaults to true

class SlackDiff < Oxidized::Hook
  def validate_cfg!
    raise KeyError, 'hook.token is required' unless cfg.has_key?('token')
    raise KeyError, 'hook.channel is required' unless cfg.has_key?('channel')
  end

  def run_hook(ctx)
    if ctx.node
      if ctx.event.to_s == "post_store"
        log "Connecting to slack"
        Slack.configure do |config|
           config.token = cfg.token
           config.proxy = cfg.proxy if cfg.has_key?('proxy')
        end
        client = Slack::Client.new
        client.auth_test
        log "Connected"
        # diff snippet - default
        diffenable = true
        if cfg.has_key?('diff') == true
          if cfg.diff == false
            diffenable = false
          end
        end
        if diffenable == true
          gitoutput = ctx.node.output.new
          diff = gitoutput.get_diff ctx.node, ctx.node.group, ctx.commitref, nil
          unless diff == "no diffs"
            title = "#{ctx.node.name.to_s} #{ctx.node.group.to_s} #{ctx.node.model.class.name.to_s.downcase}"
            log "Posting diff as snippet to #{cfg.channel}"
            client.files_upload(channels: cfg.channel, as_user: true,
                                content: diff[:patch].lines.to_a[4..-1].join,
                                filetype: "diff",
                                title: title,
                                filename: "change"
                               )
          end
        end
        # message custom formatted - optional
        if cfg.has_key?('message') == true
          log cfg.message
          msg = cfg.message % {:node => ctx.node.name.to_s, :group => ctx.node.group.to_s, :commitref => ctx.commitref, :model => ctx.node.model.class.name.to_s.downcase}
          log msg
          log "Posting message to #{cfg.channel}"
          client.chat_postMessage(channel: cfg.channel, text: msg,  as_user: true)
        end
        log "Finished"
      end
    end
  end
end