slackistrano 2.0.0 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/README.md +1 -1
- data/lib/slackistrano/capistrano.rb +148 -32
- data/lib/slackistrano/tasks/slack.rake +10 -114
- data/lib/slackistrano/version.rb +1 -1
- data/spec/dry_run_spec.rb +17 -0
- data/spec/posting_to_multiple_channels_spec.rb +19 -0
- data/spec/task_hooks_spec.rb +35 -0
- data/spec/tasks_spec.rb +9 -53
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 851d5d5bb98527246ddb446956250f5670007aca
|
4
|
+
data.tar.gz: bf3821250a52f2c3c5fcd7212a192e38878fb56b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 36d3edcd7e42fbcb65ca35e641922666ce9d3ee7b00acf3bcda56478041cb1d12fc46b8923a1fd4abfb992efd120daaa10aadb732638f3262188562068014734
|
7
|
+
data.tar.gz: d8ebee206e6a4ab2ef7fa5f5304cfbe47c4d8d984fe59d4e847d502c3420e25510112ebab258a65b05f27277c99d6c6b444ba99cad92bf8318593afa283f505a
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -83,6 +83,7 @@ set :slack_icon_url, -> { 'http://gravatar.com/avatar/885e1c523b7975c4
|
|
83
83
|
set :slack_icon_emoji, -> { nil } # Emoji to use. Overrides icon_url. Must be a string (ex: ':shipit:')
|
84
84
|
set :slack_username, -> { 'Slackistrano' }
|
85
85
|
|
86
|
+
set :slack_run, -> { true } # Set to false to disable all messages.
|
86
87
|
set :slack_run_updating, -> { true } # Set to false to disable deploy starting message.
|
87
88
|
set :slack_run_reverting, -> { true } # Set to false to disable rollback starting message.
|
88
89
|
set :slack_run_updated, -> { true } # Set to false to disable deploy finished message.
|
@@ -184,7 +185,6 @@ you specified.
|
|
184
185
|
## TODO
|
185
186
|
|
186
187
|
- Notify about incorrect configuration settings.
|
187
|
-
- Notify about unsuccessfull HTTP POSTs.
|
188
188
|
|
189
189
|
## Contributing
|
190
190
|
|
@@ -1,50 +1,166 @@
|
|
1
1
|
require 'net/http'
|
2
2
|
require 'json'
|
3
|
+
require 'forwardable'
|
3
4
|
|
4
5
|
load File.expand_path("../tasks/slack.rake", __FILE__)
|
5
6
|
|
6
7
|
module Slackistrano
|
8
|
+
class Capistrano
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
extend Forwardable
|
11
|
+
def_delegators :env, :fetch, :run_locally
|
12
|
+
|
13
|
+
#
|
14
|
+
#
|
15
|
+
#
|
16
|
+
def initialize(env)
|
17
|
+
@env = env
|
16
18
|
end
|
17
|
-
rescue => e
|
18
|
-
error("[slackistrano] Error notifying Slack!")
|
19
|
-
error("[slackistrano] Error: #{e.inspect}")
|
20
|
-
end
|
21
19
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
20
|
+
#
|
21
|
+
#
|
22
|
+
#
|
23
|
+
def run(action)
|
24
|
+
should_run = fetch("slack_run".to_sym)
|
25
|
+
should_run &&= fetch("slack_run_#{action}".to_sym)
|
26
|
+
return unless should_run
|
27
27
|
|
28
|
-
|
28
|
+
_self = self
|
29
|
+
run_locally { _self.post(action, self) }
|
29
30
|
|
30
|
-
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
|
31
|
-
http.request_post uri, text
|
32
31
|
end
|
33
|
-
end
|
34
32
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
33
|
+
#
|
34
|
+
#
|
35
|
+
#
|
36
|
+
def post(action, backend)
|
37
|
+
team = fetch(:slack_team)
|
38
|
+
token = fetch(:slack_token)
|
39
|
+
webhook = fetch(:slack_webhook)
|
40
|
+
via_slackbot = fetch(:slack_via_slackbot)
|
41
|
+
|
42
|
+
channels = fetch(:slack_channel)
|
43
|
+
channel_action = "slack_channel_#{action}".to_sym
|
44
|
+
channels = fetch(channel_action) if fetch(channel_action)
|
45
|
+
channels = Array(channels)
|
46
|
+
if via_slackbot == false && channels.empty?
|
47
|
+
channels = [nil] # default webhook channel
|
48
|
+
end
|
49
|
+
|
50
|
+
payload = {
|
51
|
+
username: fetch(:slack_username),
|
52
|
+
icon_url: fetch(:slack_icon_url),
|
53
|
+
icon_emoji: fetch(:slack_icon_emoji),
|
54
|
+
}
|
55
|
+
|
56
|
+
payload[:attachments] = case action
|
57
|
+
when :updated
|
58
|
+
make_attachments(action, color: 'good')
|
59
|
+
when :reverted
|
60
|
+
make_attachments(action, color: '#4CBDEC')
|
61
|
+
when :failed
|
62
|
+
make_attachments(action, color: 'danger')
|
63
|
+
else
|
64
|
+
make_attachments(action)
|
65
|
+
end
|
66
|
+
|
67
|
+
channels.each do |channel|
|
68
|
+
payload[:channel] = channel
|
69
|
+
|
70
|
+
# This is a nasty hack, but until Capistrano provides an official way to determine if
|
71
|
+
# --dry-run was passed this is the only option.
|
72
|
+
# See https://github.com/capistrano/capistrano/issues/1462
|
73
|
+
if ::Capistrano::Configuration.env.send(:config)[:sshkit_backend] == SSHKit::Backend::Printer
|
74
|
+
backend.info("[slackistrano] Slackistrano Dry Run:")
|
75
|
+
backend.info("[slackistrano] Team: #{team}")
|
76
|
+
backend.info("[slackistrano] Webhook: #{webhook}")
|
77
|
+
backend.info("[slackistrano] Via Slackbot: #{via_slackbot}")
|
78
|
+
backend.info("[slackistrano] Payload: #{payload.to_json}")
|
79
|
+
|
80
|
+
# Post to the channel.
|
81
|
+
else
|
82
|
+
|
83
|
+
begin
|
84
|
+
response = post_to_slack(team: team,
|
85
|
+
token: token,
|
86
|
+
webhook: webhook,
|
87
|
+
via_slackbot: via_slackbot,
|
88
|
+
payload: payload)
|
89
|
+
|
90
|
+
rescue => e
|
91
|
+
backend.warn("[slackistrano] Error notifying Slack!")
|
92
|
+
backend.warn("[slackistrano] Error: #{e.inspect}")
|
93
|
+
end
|
94
|
+
|
95
|
+
if response.code !~ /^2/
|
96
|
+
warn("[slackistrano] Slack API Failure!")
|
97
|
+
warn("[slackistrano] URI: #{response.uri}")
|
98
|
+
warn("[slackistrano] Code: #{response.code}")
|
99
|
+
warn("[slackistrano] Message: #{response.message}")
|
100
|
+
warn("[slackistrano] Body: #{response.body}") if response.message != response.body && response.body !~ /<html/
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
40
104
|
|
41
|
-
if webhook.nil?
|
42
|
-
webhook = "https://#{team}.slack.com/services/hooks/incoming-webhook"
|
43
|
-
params.merge!('token' => token)
|
44
105
|
end
|
45
106
|
|
46
|
-
|
47
|
-
|
48
|
-
|
107
|
+
#
|
108
|
+
#
|
109
|
+
#
|
110
|
+
def make_attachments(action, options={})
|
111
|
+
attachments = options.merge({
|
112
|
+
title: fetch(:"slack_title_#{action}"),
|
113
|
+
pretext: fetch(:"slack_pretext_#{action}"),
|
114
|
+
text: fetch(:"slack_msg_#{action}"),
|
115
|
+
fields: fetch(:"slack_fields_#{action}"),
|
116
|
+
fallback: fetch(:"slack_fallback_#{action}"),
|
117
|
+
mrkdwn_in: [:text, :pretext]
|
118
|
+
}).reject{|k, v| v.nil? }
|
119
|
+
[attachments]
|
120
|
+
end
|
121
|
+
private :make_attachments
|
122
|
+
|
123
|
+
#
|
124
|
+
#
|
125
|
+
#
|
126
|
+
def post_to_slack(via_slackbot: nil, team: nil, token: nil, webhook: nil, payload: {})
|
127
|
+
if via_slackbot
|
128
|
+
post_as_slackbot(team: team, token: token, webhook: webhook, payload: payload)
|
129
|
+
else
|
130
|
+
post_as_webhook(team: team, token: token, webhook: webhook, payload: payload)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
private :post_to_slack
|
134
|
+
|
135
|
+
#
|
136
|
+
#
|
137
|
+
#
|
138
|
+
def post_as_slackbot(team: nil, token: nil, webhook: nil, payload: {})
|
139
|
+
uri = URI(URI.encode("https://#{team}.slack.com/services/hooks/slackbot?token=#{token}&channel=#{payload[:channel]}"))
|
140
|
+
|
141
|
+
text = payload[:attachments].collect { |a| a[:text] }.join("\n")
|
142
|
+
|
143
|
+
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
|
144
|
+
http.request_post uri, text
|
145
|
+
end
|
146
|
+
end
|
147
|
+
private :post_as_slackbot
|
148
|
+
|
149
|
+
#
|
150
|
+
#
|
151
|
+
#
|
152
|
+
def post_as_webhook(team: nil, token: nil, webhook: nil, payload: {})
|
153
|
+
params = {'payload' => payload.to_json}
|
154
|
+
|
155
|
+
if webhook.nil?
|
156
|
+
webhook = "https://#{team}.slack.com/services/hooks/incoming-webhook"
|
157
|
+
params.merge!('token' => token)
|
158
|
+
end
|
49
159
|
|
160
|
+
uri = URI(webhook)
|
161
|
+
Net::HTTP.post_form(uri, params)
|
162
|
+
end
|
163
|
+
private :post_as_webhook
|
164
|
+
|
165
|
+
end
|
50
166
|
end
|
@@ -1,131 +1,26 @@
|
|
1
1
|
namespace :slack do
|
2
2
|
namespace :deploy do
|
3
3
|
|
4
|
-
def make_attachments(stage, options={})
|
5
|
-
attachments = options.merge({
|
6
|
-
title: fetch(:"slack_title_#{stage}"),
|
7
|
-
pretext: fetch(:"slack_pretext_#{stage}"),
|
8
|
-
text: fetch(:"slack_msg_#{stage}"),
|
9
|
-
fields: fetch(:"slack_fields_#{stage}"),
|
10
|
-
fallback: fetch(:"slack_fallback_#{stage}"),
|
11
|
-
mrkdwn_in: [:text, :pretext]
|
12
|
-
}).reject{|k, v| v.nil? }
|
13
|
-
[attachments]
|
14
|
-
end
|
15
|
-
|
16
|
-
def make_payload(stage)
|
17
|
-
payload = {
|
18
|
-
username: fetch(:slack_username),
|
19
|
-
icon_url: fetch(:slack_icon_url),
|
20
|
-
icon_emoji: fetch(:slack_icon_emoji),
|
21
|
-
}
|
22
|
-
|
23
|
-
|
24
|
-
payload[:attachments] = case stage
|
25
|
-
when :updated
|
26
|
-
make_attachments(stage, color: 'good')
|
27
|
-
when :reverted
|
28
|
-
make_attachments(stage, color: '#4CBDEC')
|
29
|
-
when :failed
|
30
|
-
make_attachments(stage, color: 'danger')
|
31
|
-
else
|
32
|
-
make_attachments(stage)
|
33
|
-
end
|
34
|
-
|
35
|
-
payload
|
36
|
-
end
|
37
|
-
|
38
|
-
def post_message(stage)
|
39
|
-
team = fetch(:slack_team)
|
40
|
-
token = fetch(:slack_token)
|
41
|
-
webhook = fetch(:slack_webhook)
|
42
|
-
via_slackbot = fetch(:slack_via_slackbot)
|
43
|
-
payload = make_payload(stage)
|
44
|
-
|
45
|
-
channels = fetch(:slack_channel)
|
46
|
-
stage_channel = "slack_channel_#{stage.to_s}".to_sym
|
47
|
-
if fetch(stage_channel)
|
48
|
-
channels = fetch(stage_channel)
|
49
|
-
end
|
50
|
-
channels = Array(channels)
|
51
|
-
if via_slackbot == false && channels.empty?
|
52
|
-
channels = [nil] # default webhook channel
|
53
|
-
end
|
54
|
-
|
55
|
-
channels.each do |channel|
|
56
|
-
payload[:channel] = channel
|
57
|
-
|
58
|
-
# This is a nasty hack, but until Capistrano provides an official way to determine if
|
59
|
-
# --dry-run was passed this is the only option.
|
60
|
-
# See https://github.com/capistrano/capistrano/issues/1462
|
61
|
-
if Capistrano::Configuration.env.send(:config)[:sshkit_backend] == SSHKit::Backend::Printer
|
62
|
-
info("[slackistrano] Slackistrano Dry Run:")
|
63
|
-
info("[slackistrano] Team: #{team}")
|
64
|
-
info("[slackistrano] Webhook: #{webhook}")
|
65
|
-
info("[slackistrano] Via Slackbot: #{via_slackbot}")
|
66
|
-
info("[slackistrano] Payload: #{payload.to_json}")
|
67
|
-
|
68
|
-
# Post to the channel.
|
69
|
-
else
|
70
|
-
http_response = Slackistrano.post(team: team,
|
71
|
-
token: token,
|
72
|
-
webhook: webhook,
|
73
|
-
via_slackbot: via_slackbot,
|
74
|
-
payload: payload)
|
75
|
-
if http_response.code !~ /^2/
|
76
|
-
error("[slackistrano] Slack API Failure!")
|
77
|
-
error("[slackistrano] URI: #{http_response.uri}")
|
78
|
-
error("[slackistrano] Code: #{http_response.code}")
|
79
|
-
error("[slackistrano] Message: #{http_response.message}")
|
80
|
-
error("[slackistrano] Body: #{http_response.body}") if http_response.message != http_response.body
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
end
|
86
|
-
|
87
|
-
######################################################################
|
88
|
-
|
89
4
|
task :updating do
|
90
5
|
set(:slack_deploy_or_rollback, 'deploy')
|
91
|
-
|
92
|
-
run_locally do
|
93
|
-
post_message(:updating)
|
94
|
-
end
|
95
|
-
end
|
6
|
+
Slackistrano::Capistrano.new(self).run(:updating)
|
96
7
|
end
|
97
8
|
|
98
9
|
task :reverting do
|
99
10
|
set(:slack_deploy_or_rollback, 'rollback')
|
100
|
-
|
101
|
-
run_locally do
|
102
|
-
post_message(:reverting)
|
103
|
-
end
|
104
|
-
end
|
11
|
+
Slackistrano::Capistrano.new(self).run(:reverting)
|
105
12
|
end
|
106
13
|
|
107
14
|
task :updated do
|
108
|
-
|
109
|
-
run_locally do
|
110
|
-
post_message(:updated)
|
111
|
-
end
|
112
|
-
end
|
15
|
+
Slackistrano::Capistrano.new(self).run(:updated)
|
113
16
|
end
|
114
17
|
|
115
18
|
task :reverted do
|
116
|
-
|
117
|
-
run_locally do
|
118
|
-
post_message(:reverted)
|
119
|
-
end
|
120
|
-
end
|
19
|
+
Slackistrano::Capistrano.new(self).run(:reverted)
|
121
20
|
end
|
122
21
|
|
123
22
|
task :failed do
|
124
|
-
|
125
|
-
run_locally do
|
126
|
-
post_message(:failed)
|
127
|
-
end
|
128
|
-
end
|
23
|
+
Slackistrano::Capistrano.new(self).run(:failed)
|
129
24
|
end
|
130
25
|
|
131
26
|
end
|
@@ -140,11 +35,11 @@ after 'deploy:failed', 'slack:deploy:failed'
|
|
140
35
|
namespace :load do
|
141
36
|
task :defaults do
|
142
37
|
|
143
|
-
set :slack_team, -> { nil }
|
144
|
-
set :slack_token, -> { nil }
|
145
|
-
set :slack_webhook, -> { nil }
|
38
|
+
set :slack_team, -> { nil } # If URL is 'team.slack.com', value is 'team'.
|
39
|
+
set :slack_token, -> { nil } # Token from Incoming WebHooks.
|
40
|
+
set :slack_webhook, -> { nil } # Incoming WebHook URL.
|
146
41
|
set :slack_via_slackbot, -> { false } # Set to true to send the message via slackbot instead of webhook
|
147
|
-
set :slack_channel, -> { nil }
|
42
|
+
set :slack_channel, -> { nil } # Channel to post to. Optional. Defaults to WebHook setting.
|
148
43
|
|
149
44
|
# Optional, overridable settings
|
150
45
|
|
@@ -158,6 +53,7 @@ namespace :load do
|
|
158
53
|
set :slack_icon_emoji, -> { nil } # Emoji to use. Overrides icon_url. Must be a string (ex: ':shipit:')
|
159
54
|
set :slack_username, -> { 'Slackistrano' }
|
160
55
|
|
56
|
+
set :slack_run, -> { true } # Set to false to disable all messages.
|
161
57
|
set :slack_run_updating, -> { true } # Set to false to disable deploy starting message.
|
162
58
|
set :slack_run_reverting, -> { true } # Set to false to disable rollback starting message.
|
163
59
|
set :slack_run_updated, -> { true } # Set to false to disable deploy finished message.
|
data/lib/slackistrano/version.rb
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Slackistrano do
|
4
|
+
before(:each) do
|
5
|
+
Rake::Task['load:defaults'].execute
|
6
|
+
end
|
7
|
+
|
8
|
+
%w[updating reverting updated reverted failed].each do |stage|
|
9
|
+
it "does not post to slack on slack:deploy:#{stage}" do
|
10
|
+
set "slack_run_#{stage}".to_sym, ->{ true }
|
11
|
+
expect(Capistrano::Configuration.env.send(:config)).to receive(:[]).with(:sshkit_backend).and_return(SSHKit::Backend::Printer)
|
12
|
+
expect(Slackistrano).not_to receive(:post)
|
13
|
+
Rake::Task["slack:deploy:#{stage}"].execute
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Slackistrano do
|
4
|
+
before(:each) do
|
5
|
+
Rake::Task['load:defaults'].execute
|
6
|
+
end
|
7
|
+
|
8
|
+
context "when :slack_channel is an array" do
|
9
|
+
%w[updating reverting updated reverted failed].each do |stage|
|
10
|
+
it "posts to slack on slack:deploy:#{stage} in every channel" do
|
11
|
+
set "slack_channel".to_sym, ->{ %w[one two] }
|
12
|
+
set "slack_run_#{stage}".to_sym, ->{ true }
|
13
|
+
expect_any_instance_of(Slackistrano::Capistrano).to receive(:post_to_slack).twice.and_return(double(code: '200'))
|
14
|
+
Rake::Task["slack:deploy:#{stage}"].execute
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Slackistrano do
|
4
|
+
before(:each) do
|
5
|
+
Rake::Task['load:defaults'].execute
|
6
|
+
end
|
7
|
+
|
8
|
+
describe "before/after hooks" do
|
9
|
+
|
10
|
+
it "invokes slack:deploy:updating before deploy:updating" do
|
11
|
+
expect(Rake::Task['deploy:updating'].prerequisites).to include 'slack:deploy:updating'
|
12
|
+
end
|
13
|
+
|
14
|
+
it "invokes slack:deploy:reverting before deploy:reverting" do
|
15
|
+
expect(Rake::Task['deploy:reverting'].prerequisites).to include 'slack:deploy:reverting'
|
16
|
+
end
|
17
|
+
|
18
|
+
it "invokes slack:deploy:updated after deploy:finishing" do
|
19
|
+
expect(Rake::Task['slack:deploy:updated']).to receive(:invoke)
|
20
|
+
Rake::Task['deploy:finishing'].execute
|
21
|
+
end
|
22
|
+
|
23
|
+
it "invokes slack:deploy:reverted after deploy:finishing_rollback" do
|
24
|
+
expect(Rake::Task['slack:deploy:reverted']).to receive(:invoke)
|
25
|
+
Rake::Task['deploy:finishing_rollback'].execute
|
26
|
+
end
|
27
|
+
|
28
|
+
it "invokes slack:deploy:failed after deploy:failed" do
|
29
|
+
expect(Rake::Task['slack:deploy:failed']).to receive(:invoke)
|
30
|
+
Rake::Task['deploy:failed'].execute
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
data/spec/tasks_spec.rb
CHANGED
@@ -5,70 +5,27 @@ describe Slackistrano do
|
|
5
5
|
Rake::Task['load:defaults'].execute
|
6
6
|
end
|
7
7
|
|
8
|
-
describe "before/after hooks" do
|
9
|
-
|
10
|
-
it "invokes slack:deploy:updating before deploy:updating" do
|
11
|
-
expect(Rake::Task['deploy:updating'].prerequisites).to include 'slack:deploy:updating'
|
12
|
-
end
|
13
|
-
|
14
|
-
it "invokes slack:deploy:reverting before deploy:reverting" do
|
15
|
-
expect(Rake::Task['deploy:reverting'].prerequisites).to include 'slack:deploy:reverting'
|
16
|
-
end
|
17
|
-
|
18
|
-
it "invokes slack:deploy:updated after deploy:finishing" do
|
19
|
-
expect(Rake::Task['slack:deploy:updated']).to receive(:invoke)
|
20
|
-
Rake::Task['deploy:finishing'].execute
|
21
|
-
end
|
22
|
-
|
23
|
-
it "invokes slack:deploy:reverted after deploy:finishing_rollback" do
|
24
|
-
expect(Rake::Task['slack:deploy:reverted']).to receive(:invoke)
|
25
|
-
Rake::Task['deploy:finishing_rollback'].execute
|
26
|
-
end
|
27
|
-
|
28
|
-
it "invokes slack:deploy:failed after deploy:failed" do
|
29
|
-
expect(Rake::Task['slack:deploy:failed']).to receive(:invoke)
|
30
|
-
Rake::Task['deploy:failed'].execute
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
8
|
%w[updating reverting updated reverted failed].each do |stage|
|
36
9
|
it "posts to slack on slack:deploy:#{stage}" do
|
37
10
|
set "slack_run_#{stage}".to_sym, ->{ true }
|
38
|
-
|
11
|
+
expect_any_instance_of(Slackistrano::Capistrano).to receive(:post_to_slack).and_return(double(code: '200'))
|
39
12
|
Rake::Task["slack:deploy:#{stage}"].execute
|
40
13
|
end
|
41
14
|
|
42
15
|
it "does not post to slack on slack:deploy:#{stage} when disabled" do
|
43
16
|
set "slack_run_#{stage}".to_sym, ->{ false }
|
44
|
-
|
17
|
+
expect_any_instance_of(Slackistrano::Capistrano).not_to receive(:post_to_slack)
|
45
18
|
Rake::Task["slack:deploy:#{stage}"].execute
|
46
19
|
end
|
47
|
-
end
|
48
|
-
|
49
|
-
context "when :slack_channel is an array" do
|
50
|
-
%w[updating reverting updated reverted failed].each do |stage|
|
51
|
-
it "posts to slack on slack:deploy:#{stage} in every channel" do
|
52
|
-
set "slack_channel".to_sym, ->{ %w[one two] }
|
53
|
-
set "slack_run_#{stage}".to_sym, ->{ true }
|
54
|
-
expect(Slackistrano).to receive(:post).twice.and_return(double(code: '200'))
|
55
|
-
Rake::Task["slack:deploy:#{stage}"].execute
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
20
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
expect(Slackistrano).not_to receive(:post)
|
66
|
-
Rake::Task["slack:deploy:#{stage}"].execute
|
67
|
-
end
|
21
|
+
it "does not post to slack on slack:deploy:#{stage} when disabled globally" do
|
22
|
+
set "slack_run".to_sym, ->{ false }
|
23
|
+
set "slack_run_#{stage}".to_sym, ->{ true }
|
24
|
+
expect_any_instance_of(Slackistrano::Capistrano).not_to receive(:post_to_slack)
|
25
|
+
Rake::Task["slack:deploy:#{stage}"].execute
|
68
26
|
end
|
69
27
|
end
|
70
28
|
|
71
|
-
|
72
29
|
[ # stage, color, channel
|
73
30
|
['updating', nil, nil],
|
74
31
|
['reverting', nil, nil],
|
@@ -81,7 +38,7 @@ describe Slackistrano do
|
|
81
38
|
['failed', 'danger', 'failed_channel'],
|
82
39
|
].each do |stage, color, channel_for_stage|
|
83
40
|
|
84
|
-
it "calls
|
41
|
+
it "calls post_as_slack with the right arguments for stage=#{stage}, color=#{color}, channel_for_stage=#{channel_for_stage}" do
|
85
42
|
set :"slack_run_#{stage}", -> { true }
|
86
43
|
set :slack_team, -> { 'team' }
|
87
44
|
set :slack_token, -> { 'token' }
|
@@ -102,7 +59,7 @@ describe Slackistrano do
|
|
102
59
|
mrkdwn_in: [:text, :pretext]
|
103
60
|
}.reject{|k,v| v.nil?}
|
104
61
|
|
105
|
-
|
62
|
+
expect_any_instance_of(Slackistrano::Capistrano).to receive(:post_to_slack).with(
|
106
63
|
team: 'team',
|
107
64
|
token: 'token',
|
108
65
|
webhook: 'webhook',
|
@@ -119,5 +76,4 @@ describe Slackistrano do
|
|
119
76
|
end
|
120
77
|
end
|
121
78
|
|
122
|
-
|
123
79
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slackistrano
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Philip Hallstrom
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capistrano
|
@@ -101,7 +101,10 @@ files:
|
|
101
101
|
- lib/slackistrano/version.rb
|
102
102
|
- slackistrano.gemspec
|
103
103
|
- spec/capistrano_deploy_stubs.rake
|
104
|
+
- spec/dry_run_spec.rb
|
105
|
+
- spec/posting_to_multiple_channels_spec.rb
|
104
106
|
- spec/spec_helper.rb
|
107
|
+
- spec/task_hooks_spec.rb
|
105
108
|
- spec/tasks_spec.rb
|
106
109
|
homepage: https://github.com/phallstrom/slackistrano
|
107
110
|
licenses:
|
@@ -133,5 +136,8 @@ specification_version: 4
|
|
133
136
|
summary: Send notifications to Slack about Capistrano deployments.
|
134
137
|
test_files:
|
135
138
|
- spec/capistrano_deploy_stubs.rake
|
139
|
+
- spec/dry_run_spec.rb
|
140
|
+
- spec/posting_to_multiple_channels_spec.rb
|
136
141
|
- spec/spec_helper.rb
|
142
|
+
- spec/task_hooks_spec.rb
|
137
143
|
- spec/tasks_spec.rb
|