capistrano-slack 1.3.1 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.markdown +29 -3
- data/capistrano-slack.gemspec +2 -2
- data/lib/capistrano/slack.rb +51 -79
- metadata +24 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 331f5b8b965a8865c7d14af0e737015f0c76bb61
|
4
|
+
data.tar.gz: b4726b87baa20366dde8714bbc30b077f1ad8b0d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3361c1d04118e04d0b9400f19b5eec2c6b943713725d4bd1118f464eecb46f69e2db59da507cd61b35e3cc50442d81259a49f8015a9e143ebdafbe278e84bbde
|
7
|
+
data.tar.gz: 971214b8693f9ddea542b3ffd9afcb3c23323a461fd9d9fabc2c47dffecf1c9d3df41eb275805932732b8d79e262a3830a526e09ba61a42963c4d26f7ee1d3be
|
data/README.markdown
CHANGED
@@ -15,22 +15,48 @@ Once installed you can use the settings below in your Capistrano deploy.rb to co
|
|
15
15
|
## Push deployment messages to Slack
|
16
16
|
|
17
17
|
```ruby
|
18
|
-
|
18
|
+
#in deploy/shared.rb add
|
19
19
|
require 'capistrano/slack'
|
20
20
|
|
21
|
+
#in deploy.rb
|
21
22
|
# required
|
22
23
|
set :slack_token, "webhook_token" # comes from inbound webhook integration
|
23
24
|
set :slack_room, "#general"
|
24
25
|
set :slack_subdomain, "kohactive" # if your subdomain is kohactive.slack.com
|
25
26
|
|
27
|
+
|
28
|
+
before 'deploy', 'slack:starting'
|
29
|
+
after 'deploy', 'slack:finished'
|
30
|
+
|
31
|
+
|
26
32
|
# optional
|
27
33
|
set :slack_application, "Rocketman"
|
28
34
|
set :slack_username, "Elton John"
|
29
35
|
set :slack_emoji, ":rocket:"
|
30
|
-
set :
|
31
|
-
#
|
36
|
+
set :slack_deploy_defaults, false #gem provides the standard before and after callbacks deploy:starting and deploy:finished deploy of set to false and provide your own.
|
37
|
+
#example slack:starting and slack:finished are the only defaults provided in the gem.
|
32
38
|
```
|
33
39
|
|
34
40
|
You can obtain your `webhook_token` from the integrations section of the team page in Slack.
|
35
41
|
|
36
42
|
https://kohactive.slack.com/services/new/incoming-webhook (if your subdomain is kohactive.slack.com)
|
43
|
+
|
44
|
+
## Add custom messages to callbacks
|
45
|
+
```ruby
|
46
|
+
namespace :slack do
|
47
|
+
namespace :migration do
|
48
|
+
task :start do
|
49
|
+
@migration_start_time = Time.now
|
50
|
+
msg = "Running Migrations"
|
51
|
+
slack_connect(msg)
|
52
|
+
end
|
53
|
+
task :end do
|
54
|
+
elapsed_time = Time.now.to_i - @migration_start_time.to_i if @migration_start_time
|
55
|
+
msg = "Migrations finished in #{elapsed_time} seconds"
|
56
|
+
slack_connect(msg)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
before "deploy:migrate", "slack:migration:start"
|
60
|
+
after "deploy:migrate", "slack:migration:end"
|
61
|
+
```
|
62
|
+
|
data/capistrano-slack.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "capistrano-slack"
|
8
|
-
s.version = "1.3.
|
8
|
+
s.version = "1.3.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Joshua Nichols", "Justin McNally"]
|
@@ -36,7 +36,7 @@ Gem::Specification.new do |s|
|
|
36
36
|
s.rubygems_version = "1.8.23"
|
37
37
|
s.summary = "Announce capistrano deploys to slack"
|
38
38
|
|
39
|
-
s.add_dependency(%q<capistrano
|
39
|
+
s.add_dependency(%q<capistrano>)
|
40
40
|
s.add_dependency(%q<capistrano-log_with_awesome>, ["~> 0.0.2"])
|
41
41
|
s.add_dependency(%q<activesupport>, [">= 3"])
|
42
42
|
s.add_development_dependency(%q<rspec>, [">= 2.5.0"])
|
data/lib/capistrano/slack.rb
CHANGED
@@ -6,106 +6,77 @@ require 'active_support/all'
|
|
6
6
|
# TODO need to handle loading a bit beter. these would load into the instance if it's defined
|
7
7
|
module Capistrano
|
8
8
|
module Slack
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
9
|
+
|
10
|
+
def payload(announcement)
|
11
|
+
{
|
12
|
+
'channel' => fetch(:slack_room),
|
13
|
+
'username' => fetch(:slack_username, ''),
|
14
|
+
'text' => announcement,
|
15
|
+
'icon_emoji' => fetch(:slack_emoji, '')
|
16
|
+
}.to_json
|
17
|
+
end
|
18
|
+
|
19
|
+
def slack_connect(message)
|
20
|
+
begin
|
21
|
+
uri = URI.parse("https://#{fetch(:slack_subdomain)}.slack.com/services/hooks/incoming-webhook?token=#{fetch(:slack_token)}")
|
22
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
23
|
+
http.use_ssl = true
|
24
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
25
|
+
request = Net::HTTP::Post.new(uri.request_uri)
|
26
|
+
request.set_form_data(:payload => payload(message))
|
27
|
+
http.request(request)
|
28
|
+
rescue SocketError => e
|
29
|
+
puts "#{e.message} or slack may be down"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
def slack_defaults
|
33
|
+
if fetch(:slack_deploy_defaults, true) == true
|
34
|
+
before 'deploy', 'slack:starting'
|
35
|
+
before 'deploy:migrations', 'slack:starting'
|
36
|
+
after 'deploy', 'slack:finished'
|
37
|
+
after 'deploy:migrations', 'slack:finished'
|
19
38
|
end
|
20
|
-
|
39
|
+
end
|
21
40
|
|
41
|
+
def self.extended(configuration)
|
42
|
+
configuration.load do
|
22
43
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
44
|
+
before('deploy') do
|
45
|
+
slack_defaults
|
46
|
+
end
|
47
|
+
|
48
|
+
set :deployer do
|
49
|
+
ENV['GIT_AUTHOR_NAME'] || `git config user.name`.chomp
|
50
|
+
end
|
27
51
|
|
52
|
+
namespace :slack do
|
28
53
|
task :starting do
|
29
|
-
slack_token = fetch(:slack_token)
|
30
|
-
slack_room = fetch(:slack_room)
|
31
|
-
slack_emoji = fetch(:slack_emoji) || ":ghost:"
|
32
|
-
slack_username = fetch(:slack_username) || "deploybot"
|
33
|
-
slack_application = fetch(:slack_application) || application
|
34
|
-
slack_subdomain = fetch(:slack_subdomain)
|
35
|
-
slack_application_url = fetch(:slack_application_url, nil)
|
36
54
|
return if slack_token.nil?
|
37
55
|
announced_deployer = ActiveSupport::Multibyte::Chars.new(fetch(:deployer)).mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/,'').to_s
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
"#{announced_deployer} is deploying #{slack_application}"
|
44
|
-
end
|
45
|
-
announcement << " with migrations" if slack_with_migrations
|
46
|
-
announcement << " to #{announced_stage}"
|
47
|
-
|
48
|
-
|
49
|
-
# Parse the API url and create an SSL connection
|
50
|
-
uri = URI.parse("https://#{slack_subdomain}.slack.com/services/hooks/incoming-webhook?token=#{slack_token}")
|
51
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
52
|
-
http.use_ssl = true
|
53
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
|
54
|
-
|
55
|
-
# Create the post request and setup the form data
|
56
|
-
request = Net::HTTP::Post.new(uri.request_uri)
|
57
|
-
request.set_form_data(:payload => {'channel' => slack_room, 'username' => slack_username, 'text' => announcement, "icon_emoji" => slack_emoji}.to_json)
|
58
|
-
|
59
|
-
# Make the actual request to the API
|
60
|
-
response = http.request(request)
|
56
|
+
msg = if fetch(:branch, nil)
|
57
|
+
"#{announced_deployer} is deploying #{slack_application}'s #{branch} to #{fetch(:stage, 'production')}"
|
58
|
+
else
|
59
|
+
"#{announced_deployer} is deploying #{slack_application} to #{fetch(:stage, 'production')}"
|
60
|
+
end
|
61
61
|
|
62
|
+
slack_connect(msg)
|
62
63
|
set(:start_time, Time.now)
|
63
64
|
end
|
64
|
-
|
65
|
-
|
66
65
|
task :finished do
|
67
66
|
begin
|
68
|
-
slack_token = fetch(:slack_token)
|
69
|
-
slack_room = fetch(:slack_room)
|
70
|
-
slack_emoji = fetch(:slack_emoji) || ":ghost:"
|
71
|
-
slack_username = fetch(:slack_username) || "deploybot"
|
72
|
-
slack_application = fetch(:slack_application) || application
|
73
|
-
slack_subdomain = fetch(:slack_subdomain)
|
74
|
-
slack_application_url = fetch(:slack_application_url, nil)
|
75
67
|
return if slack_token.nil?
|
76
68
|
announced_deployer = fetch(:deployer)
|
77
|
-
announced_stage = slack_application_url || fetch(:stage, 'production')
|
78
|
-
end_time = Time.now
|
79
69
|
start_time = fetch(:start_time)
|
80
|
-
elapsed =
|
81
|
-
|
82
|
-
msg
|
83
|
-
"#{announced_deployer} deployed #{slack_application}'s #{branch}"
|
84
|
-
else
|
85
|
-
"#{announced_deployer} deployed #{slack_application}"
|
86
|
-
end
|
87
|
-
msg << " with migrations" if slack_with_migrations
|
88
|
-
msg << " to #{announced_stage} successfully in #{elapsed} seconds"
|
89
|
-
|
90
|
-
# Parse the URI and handle the https connection
|
91
|
-
uri = URI.parse("https://#{slack_subdomain}.slack.com/services/hooks/incoming-webhook?token=#{slack_token}")
|
92
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
93
|
-
http.use_ssl = true
|
94
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
95
|
-
|
96
|
-
# Create the post request and setup the form data
|
97
|
-
request = Net::HTTP::Post.new(uri.request_uri)
|
98
|
-
request.set_form_data(:payload => {'channel' => slack_room, 'username' => slack_username, 'text' => msg, "icon_emoji" => slack_emoji}.to_json)
|
99
|
-
|
100
|
-
# Make the actual request to the API
|
101
|
-
response = http.request(request)
|
102
|
-
|
70
|
+
elapsed = Time.now.to_i - start_time.to_i
|
71
|
+
msg = "#{announced_deployer} deployed #{slack_application} successfully in #{elapsed} seconds."
|
72
|
+
slack_connect(msg)
|
103
73
|
rescue Faraday::Error::ParsingError
|
104
74
|
# FIXME deal with crazy color output instead of rescuing
|
105
75
|
# it's stuff like: ^[[0;33m and ^[[0m
|
106
76
|
end
|
107
77
|
end
|
108
78
|
end
|
79
|
+
|
109
80
|
end
|
110
81
|
end
|
111
82
|
end
|
@@ -114,3 +85,4 @@ end
|
|
114
85
|
if Capistrano::Configuration.instance
|
115
86
|
Capistrano::Configuration.instance.extend(Capistrano::Slack)
|
116
87
|
end
|
88
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano-slack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joshua Nichols
|
@@ -15,126 +15,126 @@ dependencies:
|
|
15
15
|
name: capistrano
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- -
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
20
|
+
version: '0'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- -
|
25
|
+
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version:
|
27
|
+
version: '0'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: capistrano-log_with_awesome
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- - ~>
|
32
|
+
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
34
|
version: 0.0.2
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- - ~>
|
39
|
+
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: 0.0.2
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: activesupport
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- -
|
46
|
+
- - ">="
|
47
47
|
- !ruby/object:Gem::Version
|
48
48
|
version: '3'
|
49
49
|
type: :runtime
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- -
|
53
|
+
- - ">="
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '3'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: rspec
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
|
-
- -
|
60
|
+
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
62
|
version: 2.5.0
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
|
-
- -
|
67
|
+
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
69
|
version: 2.5.0
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: bundler
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
|
-
- -
|
74
|
+
- - ">="
|
75
75
|
- !ruby/object:Gem::Version
|
76
76
|
version: 1.0.9
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
|
-
- -
|
81
|
+
- - ">="
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: 1.0.9
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: jeweler
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
|
-
- - ~>
|
88
|
+
- - "~>"
|
89
89
|
- !ruby/object:Gem::Version
|
90
90
|
version: 1.8.0
|
91
91
|
type: :development
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
|
-
- - ~>
|
95
|
+
- - "~>"
|
96
96
|
- !ruby/object:Gem::Version
|
97
97
|
version: 1.8.0
|
98
98
|
- !ruby/object:Gem::Dependency
|
99
99
|
name: capistrano-spec
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
102
|
-
- -
|
102
|
+
- - ">="
|
103
103
|
- !ruby/object:Gem::Version
|
104
104
|
version: '0'
|
105
105
|
type: :development
|
106
106
|
prerelease: false
|
107
107
|
version_requirements: !ruby/object:Gem::Requirement
|
108
108
|
requirements:
|
109
|
-
- -
|
109
|
+
- - ">="
|
110
110
|
- !ruby/object:Gem::Version
|
111
111
|
version: '0'
|
112
112
|
- !ruby/object:Gem::Dependency
|
113
113
|
name: yard
|
114
114
|
requirement: !ruby/object:Gem::Requirement
|
115
115
|
requirements:
|
116
|
-
- -
|
116
|
+
- - ">="
|
117
117
|
- !ruby/object:Gem::Version
|
118
118
|
version: '0'
|
119
119
|
type: :development
|
120
120
|
prerelease: false
|
121
121
|
version_requirements: !ruby/object:Gem::Requirement
|
122
122
|
requirements:
|
123
|
-
- -
|
123
|
+
- - ">="
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: '0'
|
126
126
|
- !ruby/object:Gem::Dependency
|
127
127
|
name: bluecloth
|
128
128
|
requirement: !ruby/object:Gem::Requirement
|
129
129
|
requirements:
|
130
|
-
- -
|
130
|
+
- - ">="
|
131
131
|
- !ruby/object:Gem::Version
|
132
132
|
version: '0'
|
133
133
|
type: :development
|
134
134
|
prerelease: false
|
135
135
|
version_requirements: !ruby/object:Gem::Requirement
|
136
136
|
requirements:
|
137
|
-
- -
|
137
|
+
- - ">="
|
138
138
|
- !ruby/object:Gem::Version
|
139
139
|
version: '0'
|
140
140
|
description: Announce capistrano deploys to slack
|
@@ -145,7 +145,7 @@ extra_rdoc_files:
|
|
145
145
|
- LICENSE
|
146
146
|
- README.markdown
|
147
147
|
files:
|
148
|
-
- .document
|
148
|
+
- ".document"
|
149
149
|
- Gemfile
|
150
150
|
- Gemfile.lock
|
151
151
|
- LICENSE
|
@@ -167,12 +167,12 @@ require_paths:
|
|
167
167
|
- lib
|
168
168
|
required_ruby_version: !ruby/object:Gem::Requirement
|
169
169
|
requirements:
|
170
|
-
- -
|
170
|
+
- - ">="
|
171
171
|
- !ruby/object:Gem::Version
|
172
172
|
version: '0'
|
173
173
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
174
174
|
requirements:
|
175
|
-
- -
|
175
|
+
- - ">="
|
176
176
|
- !ruby/object:Gem::Version
|
177
177
|
version: '0'
|
178
178
|
requirements: []
|