Module: Capistrano::Slack

Defined in:
lib/capistrano/slack.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(configuration) ⇒ Object



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
# File 'lib/capistrano/slack.rb', line 41

def self.extended(configuration)
    configuration.load do

      before('deploy') do 
        slack_defaults
      end

      set :deployer do
        ENV['GIT_AUTHOR_NAME'] || `git config user.name`.chomp
      end

      namespace :slack do
        task :starting do
          return if slack_token.nil?
          announced_deployer = ActiveSupport::Multibyte::Chars.new(fetch(:deployer)).mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/,'').to_s
          msg = if fetch(:branch, nil)
            "#{announced_deployer} is deploying #{slack_application}'s #{branch} to #{fetch(:stage, 'production')}"
          else
            "#{announced_deployer} is deploying #{slack_application} to #{fetch(:stage, 'production')}"
          end

          slack_connect(msg)  
          set(:start_time, Time.now)
        end
        task :finished do
          begin
            return if slack_token.nil?
            announced_deployer = fetch(:deployer)
            start_time = fetch(:start_time)
            elapsed = Time.now.to_i - start_time.to_i
            msg = "#{announced_deployer} deployed #{slack_application} successfully in #{elapsed} seconds." 
            slack_connect(msg)
          rescue Faraday::Error::ParsingError
            # FIXME deal with crazy color output instead of rescuing
            # it's stuff like: ^[[0;33m and ^[[0m
          end
        end
      end

    end
end

Instance Method Details

#payload(announcement) ⇒ Object



10
11
12
13
14
15
16
17
# File 'lib/capistrano/slack.rb', line 10

def payload(announcement)
{
  'channel' => fetch(:slack_room),
  'username' => fetch(:slack_username, ''), 
  'text' => announcement, 
  'icon_emoji' => fetch(:slack_emoji, '') 
  }.to_json
end

#slack_connect(message) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/capistrano/slack.rb', line 19

def slack_connect(message)
  begin
    uri = URI.parse("https://#{fetch(:slack_subdomain)}.slack.com/services/hooks/incoming-webhook?token=#{fetch(:slack_token)}")
    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_PEER
    request = Net::HTTP::Post.new(uri.request_uri)
    request.set_form_data(:payload => payload(message))
    http.request(request) 
  rescue SocketError => e 
     puts "#{e.message} or slack may be down"
   end
end

#slack_defaultsObject



32
33
34
35
36
37
38
39
# File 'lib/capistrano/slack.rb', line 32

def slack_defaults 
  if fetch(:slack_deploy_defaults, true) == true
    before 'deploy', 'slack:starting'
    before 'deploy:migrations', 'slack:starting'
    after 'deploy',  'slack:finished'
    after 'deploy:migrations',  'slack:finished'
  end
end