capistrano3-notifier 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +19 -0
- data/.rspec +2 -0
- data/.travis.yml +7 -0
- data/Gemfile +3 -0
- data/LICENSE +22 -0
- data/README.md +138 -0
- data/Rakefile +13 -0
- data/capistrano3-notifier.gemspec +25 -0
- data/lib/capistrano/notifier/helpers/mail.rb +135 -0
- data/lib/capistrano/notifier/helpers/statsd.rb +68 -0
- data/lib/capistrano/notifier/mail.rb +28 -0
- data/lib/capistrano/notifier/statsd.rb +15 -0
- data/lib/capistrano/notifier/templates/mail.html.erb +42 -0
- data/lib/capistrano/notifier/templates/mail.text.erb +11 -0
- data/lib/capistrano/notifier/version.rb +5 -0
- data/lib/capistrano3-notifier.rb +0 -0
- data/spec/fixtures/templates/mail.text.erb +4 -0
- data/spec/integration/capistrano/notifier/mail_spec.rb +25 -0
- data/spec/integration/capistrano/notifier/statsd_spec.rb +21 -0
- data/spec/lib/capistrano/notifier/helpers/mail_spec.rb +325 -0
- data/spec/lib/capistrano/notifier/helpers/statsd_spec.rb +20 -0
- data/spec/spec_helper.rb +10 -0
- metadata +157 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8c6b26db000c8cc4076ac491f8345825a1b226c7
|
4
|
+
data.tar.gz: 940bd24c608aec2c7e8d3efb32ddc884626296d6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 62c6d92d9f4e3152690cc87066cbe94d5e526f6be259a103527c169b5e3d9e5eda247d5c5e447c825381c171aaef02cca177432f7b752609bc87bd67fbd97ca0
|
7
|
+
data.tar.gz: 86fdd5549c72fe58d3008884fb6e60b6a9b3ed21b336f3a8be4d382be0d40f3e187eea295085d6dc5c4b5a531aaa110b81ce4699b2cd2429df0344ffa0f75634
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 Justin Campbell
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
# Capistrano3 Notifier [![Build Status](https://secure.travis-ci.org/applicaster/capistrano3-notifier.png)](https://secure.travis-ci.org/applicaster/capistrano3-notifier)
|
2
|
+
|
3
|
+
##Rewrite of [Capistrano Notifier](https://github.com/gofullstack/capistrano-notifier) Gem for Capistrano3
|
4
|
+
|
5
|
+
## Install
|
6
|
+
|
7
|
+
In your Gemfile:
|
8
|
+
|
9
|
+
```rb
|
10
|
+
gem 'capistrano3-notifier'
|
11
|
+
```
|
12
|
+
|
13
|
+
and then `bundle install`
|
14
|
+
|
15
|
+
`cap` needs to be invoked with Bundler for the `require` statements
|
16
|
+
below to work properly. You can do so with either `bundle exec cap`, or
|
17
|
+
with `bundle install --binstubs` and making sure `bin` is high up in your
|
18
|
+
`$PATH`.`
|
19
|
+
|
20
|
+
|
21
|
+
## Mail
|
22
|
+
|
23
|
+
```rb
|
24
|
+
require 'capistrano/notifier/mail'
|
25
|
+
|
26
|
+
set :notifier_mail_options, {
|
27
|
+
method: :test, # :smtp, :sendmail, or any other valid ActionMailer delivery method
|
28
|
+
from: 'capistrano@domain.com',
|
29
|
+
to: ['john@doe.com', 'jane@doe.com'],
|
30
|
+
subject: "Successfully deployed #{application.titleize} to #{stage}", # OPTIONAL
|
31
|
+
github: 'MyCompany/project-name'
|
32
|
+
}
|
33
|
+
```
|
34
|
+
|
35
|
+
If you specified `method: :test`, you can see the email that would be
|
36
|
+
generated in your console with `cap deploy:notify:mail`.
|
37
|
+
|
38
|
+
If you specified `method: :smtp`, you can specify `:smtp_settings`
|
39
|
+
|
40
|
+
For example:
|
41
|
+
|
42
|
+
```rb
|
43
|
+
set :notifier_mail_options, {
|
44
|
+
method: :smtp,
|
45
|
+
from: 'capistrano@domain.com',
|
46
|
+
to: ['john@doe.com', 'jane@doe.com'],
|
47
|
+
github: 'MyCompany/project-name',
|
48
|
+
smtp_settings: {
|
49
|
+
address: "smtp.gmail.com",
|
50
|
+
port: 587,
|
51
|
+
domain: "gmail.com",
|
52
|
+
authentication: "plain",
|
53
|
+
enable_starttls_auto: true,
|
54
|
+
user_name: MY_USERNAME,
|
55
|
+
password: MY_PASSWORD
|
56
|
+
}
|
57
|
+
}
|
58
|
+
```
|
59
|
+
|
60
|
+
### Templates
|
61
|
+
|
62
|
+
This gem comes with two different ERB templates that are used to generate the body of the email. To choose from each one of them, you can set the `format` option to either `:html` - for HTML emails - or `:text` - for plain text.
|
63
|
+
|
64
|
+
The following are the default values for the template options:
|
65
|
+
|
66
|
+
- `format`: `:text`
|
67
|
+
- `templates_path`: `"config/deploy/templates"`
|
68
|
+
- `template`: `"mail.#{format}.erb"`. Note the dependency of this option on `format`.
|
69
|
+
|
70
|
+
The relationship between these variables might seem a bit complex but provides great flexibility. The logic used is as follows:
|
71
|
+
|
72
|
+
- If the file exists in `"#{templates_path}/#{template}"`, then use that one. With no option set, this will default to `config/deploy/templates/mail.text.erb`.
|
73
|
+
|
74
|
+
- If the file doesn't exist in the previous path, load `"#{template}"` from one of the gem's templates, either `mail.text.erb` or `mail.html.erb`. With no options set, this will default to `mail.text.erb` due to how the `template` option is generated. See above.
|
75
|
+
|
76
|
+
For those interested in creating customized templates, it is important to know that you can use any of the variables defined in capistrano by prefixing it with the `cap` method like below:
|
77
|
+
|
78
|
+
```rb
|
79
|
+
<%= fetch(:any_variable_defined_in_capistrano) %>
|
80
|
+
```
|
81
|
+
|
82
|
+
The following is a list of some popular variables that don't require the use of the `cap.` prefix:
|
83
|
+
|
84
|
+
- `application`: Name of the application.
|
85
|
+
- `branch`: Name of the branch to be deployed.
|
86
|
+
- `git_commit_prefix`: URL of the format `"#{git_prefix}/commit"`.
|
87
|
+
- `git_compare_prefix`: URL of the format `"#{git_prefix}/compare"`.
|
88
|
+
- `git_current_revision`: Commit for current revision.
|
89
|
+
- `git_log`: Simplified log of commits in the `git_range`.
|
90
|
+
- `git_prefix`: URL to the github repository. Depends on `giturl` or `github` variables.
|
91
|
+
- `git_previous_revision`: Commit for previous revision.
|
92
|
+
- `git_range`: Range of commits between previous and current revision. Example: xxx..yyy
|
93
|
+
- `github_range`: Range of commits between previous and current revision in GitHub format. Example: xxx...yyy
|
94
|
+
- `github`: URL path to the GitHub respository. Ex: 'MyCompany/project-name'.
|
95
|
+
- `giturl`: Base URL to the repository.
|
96
|
+
- `now`: Current time.
|
97
|
+
- `stage`: Name of the stage from the capistrano multistage extension.
|
98
|
+
- `user_name`: Name of the local git author.
|
99
|
+
|
100
|
+
## StatsD
|
101
|
+
|
102
|
+
```rb
|
103
|
+
require 'capistrano/notifier/statsd'
|
104
|
+
```
|
105
|
+
|
106
|
+
A counter of 1 will be sent with the key `application.stage.deploy` if using
|
107
|
+
multistage, or `application.deploy` if not. To use a gauge instead of a counter,
|
108
|
+
use `with: :gauge`:
|
109
|
+
|
110
|
+
```rb
|
111
|
+
set :notifier_statsd_options, {
|
112
|
+
with: :gauge
|
113
|
+
}
|
114
|
+
```
|
115
|
+
|
116
|
+
If you want to specify a host:port other than
|
117
|
+
127.0.0.1:8125, you can do so like this:
|
118
|
+
|
119
|
+
```rb
|
120
|
+
set :notifier_statsd_options, {
|
121
|
+
host: "10.0.0.1",
|
122
|
+
port: "8125"
|
123
|
+
}
|
124
|
+
```
|
125
|
+
|
126
|
+
You can define the pattern that will be used to define the key.
|
127
|
+
In the example the key will be 'test.deployment.example'
|
128
|
+
|
129
|
+
```rb
|
130
|
+
set :application, 'example'
|
131
|
+
set :stage, 'test'
|
132
|
+
|
133
|
+
set :notifier_statsd_options, {
|
134
|
+
pattern: "#{stage}.deployment.#{application}"
|
135
|
+
}
|
136
|
+
```
|
137
|
+
|
138
|
+
The `nc` ([Netcat](http://netcat.sourceforge.net/)) command is used to send messages to statsd and must be installed on the remote hosts. This is installed by default on most Unix machines.
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/capistrano/notifier/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ["Justin Campbell", "Nathan L Smith", "Vitaly Gorodetsky"]
|
6
|
+
gem.email = ["sysadmin@cramerdev.com"]
|
7
|
+
gem.summary = %q{Capistrano3 Notifier}
|
8
|
+
gem.description = %q{Simple notification hooks for Capistrano3}
|
9
|
+
gem.homepage = "http://github.com/cramerdev/capistrano-notifier"
|
10
|
+
|
11
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
|
+
gem.files = `git ls-files`.split("\n")
|
13
|
+
gem.test_files = `git ls-files -- spec/*`.split("\n")
|
14
|
+
gem.name = "capistrano3-notifier"
|
15
|
+
gem.require_paths = ["lib"]
|
16
|
+
gem.version = Capistrano::Notifier::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency 'actionmailer', '~> 4.0'
|
19
|
+
gem.add_dependency 'capistrano', '~> 3.0'
|
20
|
+
|
21
|
+
gem.add_development_dependency 'rake'
|
22
|
+
gem.add_development_dependency 'rspec', '~> 3.0'
|
23
|
+
gem.add_development_dependency 'timecop'
|
24
|
+
gem.add_development_dependency 'pry'
|
25
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
module Capistrano
|
2
|
+
module Notifier
|
3
|
+
module Helpers
|
4
|
+
module Mail
|
5
|
+
def application
|
6
|
+
fetch :application
|
7
|
+
end
|
8
|
+
|
9
|
+
def branch
|
10
|
+
fetch(:branch, "master")
|
11
|
+
end
|
12
|
+
|
13
|
+
def git_current_revision
|
14
|
+
fetch :current_revision
|
15
|
+
end
|
16
|
+
|
17
|
+
def git_previous_revision
|
18
|
+
fetch :previous_revision
|
19
|
+
end
|
20
|
+
|
21
|
+
def git_range(ranger = "..")
|
22
|
+
return unless git_previous_revision && git_current_revision
|
23
|
+
"#{git_previous_revision}#{ranger}#{git_current_revision}"
|
24
|
+
end
|
25
|
+
|
26
|
+
def github_range
|
27
|
+
git_range("...")
|
28
|
+
end
|
29
|
+
|
30
|
+
def git_log_command
|
31
|
+
notifier_mail_options[:log_command]
|
32
|
+
end
|
33
|
+
|
34
|
+
def git_log
|
35
|
+
return unless git_range
|
36
|
+
command =
|
37
|
+
git_log_command || 'git log #{git_range} --no-merges --format=format:"%h %s (%an)"'
|
38
|
+
|
39
|
+
system_call(command)
|
40
|
+
end
|
41
|
+
|
42
|
+
def now
|
43
|
+
@now ||= Time.now
|
44
|
+
end
|
45
|
+
|
46
|
+
def stage
|
47
|
+
fetch :stage
|
48
|
+
end
|
49
|
+
|
50
|
+
def user_name
|
51
|
+
ENV['DEPLOYER'] || system_call("git config --get user.name").strip
|
52
|
+
end
|
53
|
+
|
54
|
+
def notifier_mail_options
|
55
|
+
@notifier_mail_options ||= fetch :notifier_mail_options
|
56
|
+
end
|
57
|
+
|
58
|
+
def email_format
|
59
|
+
notifier_mail_options[:format] || :text
|
60
|
+
end
|
61
|
+
|
62
|
+
def email_template
|
63
|
+
notifier_mail_options[:template] || "mail.#{email_format.to_s}.erb"
|
64
|
+
end
|
65
|
+
|
66
|
+
def email_from
|
67
|
+
notifier_mail_options[:from]
|
68
|
+
end
|
69
|
+
|
70
|
+
def github
|
71
|
+
notifier_mail_options[:github]
|
72
|
+
end
|
73
|
+
|
74
|
+
def giturl
|
75
|
+
notifier_mail_options[:giturl]
|
76
|
+
end
|
77
|
+
|
78
|
+
def git_prefix
|
79
|
+
giturl ? giturl : "https://github.com/#{github}"
|
80
|
+
end
|
81
|
+
|
82
|
+
def git_commit_prefix
|
83
|
+
"#{git_prefix}/commit"
|
84
|
+
end
|
85
|
+
|
86
|
+
def git_compare_prefix
|
87
|
+
"#{git_prefix}/compare"
|
88
|
+
end
|
89
|
+
|
90
|
+
def delivery_method
|
91
|
+
notifier_mail_options[:method]
|
92
|
+
end
|
93
|
+
|
94
|
+
def notifier_smtp_settings
|
95
|
+
notifier_mail_options[:smtp_settings]
|
96
|
+
end
|
97
|
+
|
98
|
+
def email_subject
|
99
|
+
notifier_mail_options[:subject] ||
|
100
|
+
"#{application} branch #{branch} deployed to #{stage}"
|
101
|
+
end
|
102
|
+
|
103
|
+
def render_template(template_name)
|
104
|
+
config_file = "#{templates_path}/#{template_name}"
|
105
|
+
|
106
|
+
unless File.exists?(config_file)
|
107
|
+
config_file = File.join(File.dirname(__FILE__),'..', "templates/#{template_name}")
|
108
|
+
end
|
109
|
+
|
110
|
+
ERB.new(File.read(config_file), nil, '-').result(binding)
|
111
|
+
end
|
112
|
+
|
113
|
+
def templates_path
|
114
|
+
notifier_mail_options[:templates_path] || 'config/deploy/templates'
|
115
|
+
end
|
116
|
+
|
117
|
+
def email_text
|
118
|
+
render_template(email_template)
|
119
|
+
end
|
120
|
+
|
121
|
+
def email_to
|
122
|
+
notifier_mail_options[:to]
|
123
|
+
end
|
124
|
+
|
125
|
+
def content_type_for_format(format = nil)
|
126
|
+
format == :html ? 'text/html' : 'text/plain'
|
127
|
+
end
|
128
|
+
|
129
|
+
def system_call(command)
|
130
|
+
`#{command}`
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module Capistrano
|
2
|
+
module Notifier
|
3
|
+
module Helpers
|
4
|
+
module StatsD
|
5
|
+
def application
|
6
|
+
fetch :application
|
7
|
+
end
|
8
|
+
|
9
|
+
def stage
|
10
|
+
fetch :stage
|
11
|
+
end
|
12
|
+
|
13
|
+
def notifier_statsd_options
|
14
|
+
@notifier_statsd_options ||= fetch :notifier_statsd_options
|
15
|
+
end
|
16
|
+
|
17
|
+
def statsd_defaults
|
18
|
+
{ host: "127.0.0.1", port: "8125", with: :counter }
|
19
|
+
end
|
20
|
+
|
21
|
+
def statsd_host
|
22
|
+
statsd_options[:host]
|
23
|
+
end
|
24
|
+
|
25
|
+
def statsd_options
|
26
|
+
@statsd_options ||= if notifier_statsd_options
|
27
|
+
statsd_defaults.merge notifier_statsd_options
|
28
|
+
else
|
29
|
+
statsd_defaults
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def statsd_packet
|
34
|
+
"#{statsd_pattern}:#{statsd_with}".gsub('|', '\\|')
|
35
|
+
end
|
36
|
+
|
37
|
+
def statsd_pattern
|
38
|
+
statsd_options.fetch(:pattern){ statsd_default_pattern }
|
39
|
+
end
|
40
|
+
|
41
|
+
def statsd_default_pattern
|
42
|
+
if stage
|
43
|
+
"#{application}.#{stage}.deploy"
|
44
|
+
else
|
45
|
+
"#{application}.deploy"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def statsd_port
|
50
|
+
statsd_options[:port]
|
51
|
+
end
|
52
|
+
|
53
|
+
def statsd_with
|
54
|
+
case statsd_options[:with]
|
55
|
+
when :counter
|
56
|
+
"1|c"
|
57
|
+
when :gauge
|
58
|
+
"1|g"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def statsd_notifier_command
|
63
|
+
"echo -n #{statsd_packet} | nc -w 1 -u #{statsd_host} #{statsd_port}"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'action_mailer'
|
2
|
+
require 'capistrano/notifier/helpers/mail'
|
3
|
+
include Capistrano::Notifier::Helpers::Mail
|
4
|
+
|
5
|
+
namespace :deploy do
|
6
|
+
namespace :notify do
|
7
|
+
desc "Send a deployment notification via email."
|
8
|
+
task :mail do
|
9
|
+
run_locally do
|
10
|
+
ActionMailer::Base.smtp_settings = notifier_smtp_settings
|
11
|
+
ActionMailer::Base.mail({
|
12
|
+
body: email_text,
|
13
|
+
delivery_method: delivery_method,
|
14
|
+
content_type: content_type_for_format(email_format),
|
15
|
+
from: email_from,
|
16
|
+
subject: email_subject,
|
17
|
+
to: email_to
|
18
|
+
}).deliver
|
19
|
+
|
20
|
+
if delivery_method == :test
|
21
|
+
puts ActionMailer::Base.deliveries
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
after "deploy:updated", "deploy:notify:mail"
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'capistrano/notifier/helpers/statsd'
|
2
|
+
include Capistrano::Notifier::Helpers::StatsD
|
3
|
+
|
4
|
+
namespace :deploy do
|
5
|
+
namespace :notify do
|
6
|
+
desc "Notify StatsD of deploy."
|
7
|
+
task :statsd do
|
8
|
+
on roles(:app) do |host|
|
9
|
+
execute statsd_notifier_command
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
after "deploy:updated", "deploy:notify:statsd"
|
@@ -0,0 +1,42 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
5
|
+
</head>
|
6
|
+
<body leftmargin="0" marginwidth="0" topmargin="0" marginheight="0" offset="0">
|
7
|
+
<h3>Details:</h3>
|
8
|
+
<table>
|
9
|
+
<tbody>
|
10
|
+
<tr>
|
11
|
+
<td><strong>Deployer:</strong></td>
|
12
|
+
<td><%= user_name %></td>
|
13
|
+
</tr>
|
14
|
+
<tr>
|
15
|
+
<td><strong>Application:</strong></td>
|
16
|
+
<td><%= application %></td>
|
17
|
+
</tr>
|
18
|
+
<tr>
|
19
|
+
<td><strong>Branch:</strong></td>
|
20
|
+
<td><%= branch %></td>
|
21
|
+
</tr>
|
22
|
+
<tr>
|
23
|
+
<td><strong>Environment:</strong></td>
|
24
|
+
<td><%= stage %></td>
|
25
|
+
</tr>
|
26
|
+
<tr>
|
27
|
+
<td><strong>Time:</strong></td>
|
28
|
+
<td><%= now.strftime("%m/%d/%Y") %> at <%= now.strftime("%H:%M %Z") %></td>
|
29
|
+
</tr>
|
30
|
+
</tbody>
|
31
|
+
</table>
|
32
|
+
|
33
|
+
<h3>Compare:</h3>
|
34
|
+
<p><%= git_compare_prefix %>/<%= github_range %></p>
|
35
|
+
|
36
|
+
<h3>Commits:</h3>
|
37
|
+
<%- git_log.split(/\n/).each do |commit| -%>
|
38
|
+
<p><%= commit %></p>
|
39
|
+
<%- end if git_log -%>
|
40
|
+
|
41
|
+
</body>
|
42
|
+
</html>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
Deployer: <%= user_name %>
|
2
|
+
Application: <%= application %>
|
3
|
+
Branch: <%= branch %>
|
4
|
+
Environment: <%= stage %>
|
5
|
+
Time: <%= now.strftime("%m/%d/%Y") %> at <%= now.strftime("%H:%M %Z") %>
|
6
|
+
|
7
|
+
Compare:
|
8
|
+
<%= git_compare_prefix %>/<%= github_range %>
|
9
|
+
|
10
|
+
Commits:
|
11
|
+
<%= git_log %>
|
File without changes
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'capistrano/setup'
|
3
|
+
require 'capistrano/deploy'
|
4
|
+
require 'capistrano/notifier/mail'
|
5
|
+
|
6
|
+
describe "deploy:notify:mail" do
|
7
|
+
before do
|
8
|
+
Capistrano::Configuration.reset!.tap do |cfg|
|
9
|
+
cfg.set :application, "test-app"
|
10
|
+
cfg.set :stage, "test-stage"
|
11
|
+
cfg.set :notifier_mail_options, {
|
12
|
+
method: :test,
|
13
|
+
from: '"Deploy Notification" <deploy@example.com>',
|
14
|
+
to: ['deploy+test-app@example.com'],
|
15
|
+
github: 'applicaster/test-app',
|
16
|
+
}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it "works" do
|
21
|
+
Rake::Task["deploy:notify:mail"].invoke
|
22
|
+
expect(ActionMailer::Base.deliveries.first.subject)
|
23
|
+
.to eq("test-app branch master deployed to test-stage")
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'capistrano/setup'
|
3
|
+
require 'capistrano/deploy'
|
4
|
+
require 'capistrano/notifier/statsd'
|
5
|
+
|
6
|
+
describe "deploy:notify:statsd" do
|
7
|
+
before do
|
8
|
+
Capistrano::Configuration.reset!.tap do |cfg|
|
9
|
+
cfg.set :application, "test-app"
|
10
|
+
cfg.set :stage, "test-stage"
|
11
|
+
cfg.set :notifier_statsd_options, {
|
12
|
+
host: "10.0.0.1",
|
13
|
+
port: "8125"
|
14
|
+
}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it "works" do
|
19
|
+
Rake::Task["deploy:notify:statsd"].invoke
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,325 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'capistrano/notifier/helpers/mail'
|
3
|
+
|
4
|
+
describe Capistrano::Notifier::Helpers::Mail do
|
5
|
+
let(:configuration) { Capistrano::Configuration.new }
|
6
|
+
let(:dummy_class) { configuration.extend(Capistrano::Notifier::Helpers::Mail) }
|
7
|
+
|
8
|
+
before do
|
9
|
+
dummy_class.set(:notifier_mail_options, {})
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "#application" do
|
13
|
+
before { dummy_class.set(:application, "testapp") }
|
14
|
+
|
15
|
+
it "fetches :application from Capistrano configuration" do
|
16
|
+
expect(dummy_class.application).to eq("testapp")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#branch" do
|
21
|
+
context "when :branch is set in Capistrano configuration" do
|
22
|
+
before { dummy_class.set(:branch, "dev") }
|
23
|
+
|
24
|
+
it "fetches :branch from Capistrano configuration" do
|
25
|
+
expect(dummy_class.branch).to eq("dev")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "when :branch is not set in Capistrano configuration" do
|
30
|
+
it "returns 'master'" do
|
31
|
+
expect(dummy_class.branch).to eq("master")
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "#git_current_revision" do
|
37
|
+
before { dummy_class.set(:current_revision, "949af5c") }
|
38
|
+
|
39
|
+
it "fetches :current_revision from Capistrano configuration" do
|
40
|
+
expect(dummy_class.git_current_revision).to eq("949af5c")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#git_previous_revision" do
|
45
|
+
before { dummy_class.set(:previous_revision, "949af5c") }
|
46
|
+
|
47
|
+
it "fetches :previous_revision from Capistrano configuration" do
|
48
|
+
expect(dummy_class.git_previous_revision).to eq("949af5c")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "#git_range" do
|
53
|
+
context "when :current_revision and :previous_revision are set" do
|
54
|
+
before do
|
55
|
+
dummy_class.set(:current_revision, "949af5c")
|
56
|
+
dummy_class.set(:previous_revision, "0469d2d")
|
57
|
+
end
|
58
|
+
|
59
|
+
it "returns revisions range in git log format" do
|
60
|
+
expect(dummy_class.git_range).to eq("0469d2d..949af5c")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context "when :current_revision and :previous_revision are empty" do
|
65
|
+
it { expect(dummy_class.git_range).to eq(nil) }
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "#git_log_command" do
|
70
|
+
before do
|
71
|
+
dummy_class.set(:notifier_mail_options, { log_command: "my command" })
|
72
|
+
end
|
73
|
+
|
74
|
+
it "fetches :log_command from :notifier_mail_options in Capistrano configuration" do
|
75
|
+
expect(dummy_class.git_log_command).to eq("my command")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "#git_log" do
|
80
|
+
before { allow(dummy_class).to receive(:git_range) { "0469d2d..949af5c" } }
|
81
|
+
|
82
|
+
context "when #git_range returns nil" do
|
83
|
+
before { allow(dummy_class).to receive(:git_range) { nil } }
|
84
|
+
|
85
|
+
it { expect(dummy_class.git_log).to eq(nil) }
|
86
|
+
end
|
87
|
+
|
88
|
+
context "when :log_command is set" do
|
89
|
+
before do
|
90
|
+
dummy_class.set(:notifier_mail_options, { log_command: "my command" })
|
91
|
+
end
|
92
|
+
|
93
|
+
it "runs system call with custom command" do
|
94
|
+
expect(dummy_class).to receive(:system_call).with("my command")
|
95
|
+
dummy_class.git_log
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context "when :log_command not set" do
|
100
|
+
before { allow(dummy_class).to receive(:git_log_command) { nil } }
|
101
|
+
|
102
|
+
it "runs system call with deafult command" do
|
103
|
+
expect(dummy_class)
|
104
|
+
.to receive(:system_call)
|
105
|
+
.with('git log #{git_range} --no-merges --format=format:"%h %s (%an)"')
|
106
|
+
|
107
|
+
dummy_class.git_log
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
describe "#now" do
|
113
|
+
it "returns instance of Time.now" do
|
114
|
+
expect(Time).to receive(:now)
|
115
|
+
dummy_class.now
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe "#stage" do
|
120
|
+
before { dummy_class.set(:stage, "test") }
|
121
|
+
|
122
|
+
it "fetches :stage from Capistrano configuration" do
|
123
|
+
expect(dummy_class.stage).to eq("test")
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
describe "#user_name" do
|
128
|
+
context "when ENV['DEPLOYER'] is set" do
|
129
|
+
before do
|
130
|
+
allow(ENV).to receive(:[]).with("DEPLOYER") { "me" }
|
131
|
+
end
|
132
|
+
|
133
|
+
it { expect(dummy_class.user_name).to eq("me") }
|
134
|
+
end
|
135
|
+
|
136
|
+
context "when ENV['DEPLOYER'] not set" do
|
137
|
+
it "runs 'git config --get user.name'" do
|
138
|
+
expect(dummy_class)
|
139
|
+
.to receive(:system_call).with("git config --get user.name")
|
140
|
+
.and_return("")
|
141
|
+
dummy_class.user_name
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
describe "#notifier_mail_options" do
|
147
|
+
it "fetches :notifier_mail_options from Capistrano configuration" do
|
148
|
+
expect(dummy_class.notifier_mail_options).to eq({})
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
describe "#email_format" do
|
153
|
+
it "deafults to :text" do
|
154
|
+
expect(dummy_class.email_format).to eq(:text)
|
155
|
+
end
|
156
|
+
|
157
|
+
context "when set in :notifier_mail_options" do
|
158
|
+
before { dummy_class.set(:notifier_mail_options, { format: :plain }) }
|
159
|
+
|
160
|
+
it "works" do
|
161
|
+
expect(dummy_class.email_format).to eq(:plain)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
describe "#email_template" do
|
167
|
+
it "deafults to 'mail.text.erb'" do
|
168
|
+
expect(dummy_class.email_template).to eq("mail.text.erb")
|
169
|
+
end
|
170
|
+
|
171
|
+
context "when set in :notifier_mail_options" do
|
172
|
+
before { dummy_class.set(:notifier_mail_options, { template: "mail.erb" }) }
|
173
|
+
|
174
|
+
it "works" do
|
175
|
+
expect(dummy_class.email_template).to eq("mail.erb")
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
describe "#email_from" do
|
181
|
+
before { dummy_class.set(:notifier_mail_options, { from: "test" }) }
|
182
|
+
|
183
|
+
it "works" do
|
184
|
+
expect(dummy_class.email_from).to eq("test")
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
describe "#github" do
|
189
|
+
before { dummy_class.set(:notifier_mail_options, { github: "test" }) }
|
190
|
+
|
191
|
+
it "works" do
|
192
|
+
expect(dummy_class.github).to eq("test")
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
describe "#giturl" do
|
197
|
+
before { dummy_class.set(:notifier_mail_options, { giturl: "test" }) }
|
198
|
+
|
199
|
+
it "works" do
|
200
|
+
expect(dummy_class.giturl).to eq("test")
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
describe "#git_prefix" do
|
205
|
+
before do
|
206
|
+
allow(dummy_class).to receive(:giturl) { "http://giturl" }
|
207
|
+
end
|
208
|
+
|
209
|
+
it "deafults to #giturl" do
|
210
|
+
expect(dummy_class.git_prefix).to eq("http://giturl")
|
211
|
+
end
|
212
|
+
|
213
|
+
context "when :notifier_mail_options not set" do
|
214
|
+
before do
|
215
|
+
allow(dummy_class).to receive(:giturl)
|
216
|
+
end
|
217
|
+
|
218
|
+
it "works" do
|
219
|
+
expect(dummy_class.git_prefix).to eq("https://github.com/")
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
describe "#git_commit_prefix" do
|
225
|
+
before do
|
226
|
+
allow(dummy_class).to receive(:git_prefix)
|
227
|
+
end
|
228
|
+
|
229
|
+
it "works" do
|
230
|
+
expect(dummy_class.git_commit_prefix).to eq("/commit")
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
describe "#git_compare_prefix" do
|
235
|
+
before do
|
236
|
+
allow(dummy_class).to receive(:git_prefix)
|
237
|
+
end
|
238
|
+
|
239
|
+
it "works" do
|
240
|
+
expect(dummy_class.git_compare_prefix).to eq("/compare")
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
describe "#delivery_method" do
|
245
|
+
before { dummy_class.set(:notifier_mail_options, { method: "test" }) }
|
246
|
+
|
247
|
+
it "works" do
|
248
|
+
expect(dummy_class.delivery_method).to eq("test")
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
describe "#notifier_smtp_settings" do
|
253
|
+
before { dummy_class.set(:notifier_mail_options, { smtp_settings: "test" }) }
|
254
|
+
|
255
|
+
it "works" do
|
256
|
+
expect(dummy_class.notifier_smtp_settings).to eq("test")
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
describe "#email_text" do
|
261
|
+
let(:templates_path) do
|
262
|
+
File.expand_path(File.join(__FILE__, '..','..','..','..','..','fixtures','templates'))
|
263
|
+
end
|
264
|
+
|
265
|
+
before do
|
266
|
+
allow(dummy_class).to receive(:templates_path) { templates_path }
|
267
|
+
allow(dummy_class).to receive(:application) { "testapp" }
|
268
|
+
allow(dummy_class).to receive(:github) { "applicaster/capistrano3-notifier" }
|
269
|
+
allow(dummy_class).to receive(:github_range) { "0469d2d...949af5c" }
|
270
|
+
end
|
271
|
+
|
272
|
+
it "renders email template" do
|
273
|
+
expect(dummy_class.email_text).to eq(
|
274
|
+
"Application: testapp\n\nCompare:\n"\
|
275
|
+
"https://github.com/applicaster/capistrano3-notifier/compare/0469d2d...949af5c\n"
|
276
|
+
)
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
describe "#email_subject" do
|
281
|
+
before do
|
282
|
+
allow(dummy_class).to receive(:application) { "testapp" }
|
283
|
+
allow(dummy_class).to receive(:branch) { "testbranch" }
|
284
|
+
allow(dummy_class).to receive(:stage) { "teststage" }
|
285
|
+
end
|
286
|
+
|
287
|
+
it "defaults to '#application branch #branch deployed to #stage'" do
|
288
|
+
expect(dummy_class.email_subject).to eq("testapp branch testbranch deployed to teststage")
|
289
|
+
end
|
290
|
+
|
291
|
+
it "can be set via :notifier_mail_options" do
|
292
|
+
dummy_class.set(:notifier_mail_options, { subject: "test subject" })
|
293
|
+
expect(dummy_class.email_subject).to eq("test subject")
|
294
|
+
end
|
295
|
+
end
|
296
|
+
|
297
|
+
describe "#templates_path" do
|
298
|
+
it "defaults to 'config/deploy/templates'" do
|
299
|
+
expect(dummy_class.templates_path).to eq("config/deploy/templates")
|
300
|
+
end
|
301
|
+
|
302
|
+
it "can be set via :notifier_mail_options" do
|
303
|
+
dummy_class.set(:notifier_mail_options, { templates_path: "templates" })
|
304
|
+
expect(dummy_class.templates_path).to eq("templates")
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
describe "#email_to" do
|
309
|
+
before { dummy_class.set(:notifier_mail_options, { to: "test" }) }
|
310
|
+
|
311
|
+
it "works" do
|
312
|
+
expect(dummy_class.email_to).to eq("test")
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
describe "#content_type_for_format" do
|
317
|
+
it "defaults to 'text/plain'" do
|
318
|
+
expect(dummy_class.content_type_for_format).to eq("text/plain")
|
319
|
+
end
|
320
|
+
|
321
|
+
it "returns 'text/html' if :html is passed as option" do
|
322
|
+
expect(dummy_class.content_type_for_format(:html)).to eq("text/html")
|
323
|
+
end
|
324
|
+
end
|
325
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'capistrano/notifier/helpers/statsd'
|
3
|
+
|
4
|
+
describe Capistrano::Notifier::Helpers::StatsD do
|
5
|
+
let(:configuration) { Capistrano::Configuration.new }
|
6
|
+
let(:dummy_class) { configuration.extend(Capistrano::Notifier::Helpers::StatsD) }
|
7
|
+
|
8
|
+
before do
|
9
|
+
dummy_class.set(:application, "test-app")
|
10
|
+
dummy_class.set(:stage, "test-stage")
|
11
|
+
dummy_class.set(:notifier_statsd_options, {})
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#statsd_notifier_command" do
|
15
|
+
it "works" do
|
16
|
+
expect(dummy_class.statsd_notifier_command)
|
17
|
+
.to eq("echo -n test-app.test-stage.deploy:1\\|c | nc -w 1 -u 127.0.0.1 8125")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,157 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: capistrano3-notifier
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Justin Campbell
|
8
|
+
- Nathan L Smith
|
9
|
+
- Vitaly Gorodetsky
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2015-02-17 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: actionmailer
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - "~>"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '4.0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - "~>"
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '4.0'
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: capistrano
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - "~>"
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '3.0'
|
36
|
+
type: :runtime
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - "~>"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '3.0'
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: rake
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - ">="
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0'
|
50
|
+
type: :development
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '0'
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: rspec
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - "~>"
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '3.0'
|
64
|
+
type: :development
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - "~>"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '3.0'
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: timecop
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
type: :development
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: pry
|
87
|
+
requirement: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
type: :development
|
93
|
+
prerelease: false
|
94
|
+
version_requirements: !ruby/object:Gem::Requirement
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
version: '0'
|
99
|
+
description: Simple notification hooks for Capistrano3
|
100
|
+
email:
|
101
|
+
- sysadmin@cramerdev.com
|
102
|
+
executables: []
|
103
|
+
extensions: []
|
104
|
+
extra_rdoc_files: []
|
105
|
+
files:
|
106
|
+
- ".gitignore"
|
107
|
+
- ".rspec"
|
108
|
+
- ".travis.yml"
|
109
|
+
- Gemfile
|
110
|
+
- LICENSE
|
111
|
+
- README.md
|
112
|
+
- Rakefile
|
113
|
+
- capistrano3-notifier.gemspec
|
114
|
+
- lib/capistrano/notifier/helpers/mail.rb
|
115
|
+
- lib/capistrano/notifier/helpers/statsd.rb
|
116
|
+
- lib/capistrano/notifier/mail.rb
|
117
|
+
- lib/capistrano/notifier/statsd.rb
|
118
|
+
- lib/capistrano/notifier/templates/mail.html.erb
|
119
|
+
- lib/capistrano/notifier/templates/mail.text.erb
|
120
|
+
- lib/capistrano/notifier/version.rb
|
121
|
+
- lib/capistrano3-notifier.rb
|
122
|
+
- spec/fixtures/templates/mail.text.erb
|
123
|
+
- spec/integration/capistrano/notifier/mail_spec.rb
|
124
|
+
- spec/integration/capistrano/notifier/statsd_spec.rb
|
125
|
+
- spec/lib/capistrano/notifier/helpers/mail_spec.rb
|
126
|
+
- spec/lib/capistrano/notifier/helpers/statsd_spec.rb
|
127
|
+
- spec/spec_helper.rb
|
128
|
+
homepage: http://github.com/cramerdev/capistrano-notifier
|
129
|
+
licenses: []
|
130
|
+
metadata: {}
|
131
|
+
post_install_message:
|
132
|
+
rdoc_options: []
|
133
|
+
require_paths:
|
134
|
+
- lib
|
135
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - ">="
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0'
|
140
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
version: '0'
|
145
|
+
requirements: []
|
146
|
+
rubyforge_project:
|
147
|
+
rubygems_version: 2.2.2
|
148
|
+
signing_key:
|
149
|
+
specification_version: 4
|
150
|
+
summary: Capistrano3 Notifier
|
151
|
+
test_files:
|
152
|
+
- spec/fixtures/templates/mail.text.erb
|
153
|
+
- spec/integration/capistrano/notifier/mail_spec.rb
|
154
|
+
- spec/integration/capistrano/notifier/statsd_spec.rb
|
155
|
+
- spec/lib/capistrano/notifier/helpers/mail_spec.rb
|
156
|
+
- spec/lib/capistrano/notifier/helpers/statsd_spec.rb
|
157
|
+
- spec/spec_helper.rb
|