capistrano-notifier 0.0.2 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +10 -0
- data/Gemfile +2 -0
- data/Guardfile +1 -1
- data/README.md +40 -17
- data/capistrano-notifier.gemspec +7 -5
- data/lib/capistrano/notifier.rb +11 -0
- data/lib/capistrano/notifier/base.rb +56 -0
- data/lib/capistrano/notifier/mail.rb +97 -0
- data/lib/capistrano/notifier/statsd.rb +66 -0
- data/lib/capistrano/notifier/templates/mail.erb +0 -0
- data/lib/capistrano/notifier/templates/mail.html.erb +0 -0
- data/lib/capistrano/notifier/templates/mail.text.erb +0 -0
- data/lib/capistrano/notifier/templates/mail.txt.erb +0 -0
- data/lib/capistrano/notifier/version.rb +5 -0
- data/spec/capistrano/notifier/mail_spec.rb +56 -0
- data/spec/capistrano/notifier/statsd_spec.rb +88 -0
- data/spec/capistrano/notifier_spec.rb +6 -0
- data/spec/spec_helper.rb +8 -1
- metadata +82 -18
- data/lib/capistrano-notifier.rb +0 -1
- data/lib/capistrano_notifier.rb +0 -133
- data/lib/capistrano_notifier/version.rb +0 -3
- data/spec/capistrano_notifier_spec.rb +0 -5
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/Guardfile
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
|
-
#
|
1
|
+
# Capistrano Notifier [![Build Status](https://secure.travis-ci.org/cramerdev/capistrano-notifier.png)](https://secure.travis-ci.org/cramerdev/capistrano-notifier)
|
2
|
+
|
2
3
|
|
3
4
|
## Install
|
4
5
|
|
@@ -10,29 +11,51 @@ gem 'capistrano-notifier'
|
|
10
11
|
|
11
12
|
and then `bundle install`
|
12
13
|
|
13
|
-
|
14
|
+
`cap` needs to be invoked with Bundler for the `require` statements
|
15
|
+
below to work properly. You can do so with either `bundle exec cap`, or
|
16
|
+
with `bundle install --binstubs` and making sure `bin` is high up in your
|
17
|
+
`$PATH`.`
|
18
|
+
|
19
|
+
|
20
|
+
## Mail
|
14
21
|
|
15
22
|
```rb
|
16
|
-
require 'capistrano
|
23
|
+
require 'capistrano/notifier/mail'
|
24
|
+
|
25
|
+
set :notifier_mail_options, {
|
26
|
+
:method => :test, # :smtp, :sendmail, or any other valid ActionMailer delivery method
|
27
|
+
:from => 'capistrano@domain.com',
|
28
|
+
:to => ['john@doe.com', 'jane@doe.com'],
|
29
|
+
:github => 'MyCompany/project-name'
|
30
|
+
}
|
31
|
+
```
|
32
|
+
|
33
|
+
If you specified `:method => test`, you can see the email that would be
|
34
|
+
generated in your console with `cap deploy:notify`.
|
17
35
|
|
18
|
-
set :notify_method, :test # :smtp, :sendmail, or any other valid ActionMailer delivery method
|
19
|
-
set :notify_from, "capistrano@domain.com"
|
20
|
-
set :notify_to, ["john@doe.com", "jane@doe.com"]
|
21
|
-
set :notify_github_project, "MyCompany/project-name"
|
22
36
|
|
23
|
-
|
24
|
-
desc "Capistrano Notifier"
|
25
|
-
task :notify do
|
26
|
-
Capistrano::Notifier.new(self).perform
|
27
|
-
end
|
28
|
-
end
|
37
|
+
## StatsD
|
29
38
|
|
30
|
-
|
39
|
+
```rb
|
40
|
+
require 'capistrano/notifier/statsd'
|
31
41
|
```
|
32
42
|
|
33
|
-
|
43
|
+
A counter of 1 will be sent with the key `application.stage.deploy` if using
|
44
|
+
multistage, or `application.deploy` if not. To use a gauge instead of a counter,
|
45
|
+
use `:with => :gauge`:
|
34
46
|
|
35
|
-
```
|
36
|
-
|
47
|
+
```rb
|
48
|
+
set :notifier_statsd_options, {
|
49
|
+
:with => :gauge
|
50
|
+
}
|
37
51
|
```
|
38
52
|
|
53
|
+
If you want to specify a host:port other than
|
54
|
+
127.0.0.1:8125, you can do so like this:
|
55
|
+
|
56
|
+
```rb
|
57
|
+
set :notifier_statsd_options, {
|
58
|
+
:host => "10.0.0.1",
|
59
|
+
:port => "8125"
|
60
|
+
}
|
61
|
+
```
|
data/capistrano-notifier.gemspec
CHANGED
@@ -1,23 +1,25 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
-
require File.expand_path('../lib/
|
2
|
+
require File.expand_path('../lib/capistrano/notifier/version', __FILE__)
|
3
3
|
|
4
4
|
Gem::Specification.new do |gem|
|
5
|
-
gem.authors = ["Justin Campbell"]
|
6
|
-
gem.email = ["
|
5
|
+
gem.authors = ["Justin Campbell", "Nathan L Smith"]
|
6
|
+
gem.email = ["sysadmin@cramerdev.com"]
|
7
7
|
gem.description = %q{Capistrano Notifier}
|
8
8
|
gem.summary = %q{Capistrano Notifier}
|
9
|
-
gem.homepage = "http://github.com/
|
9
|
+
gem.homepage = "http://github.com/cramerdev/capistrano-notifier"
|
10
10
|
|
11
11
|
gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
12
12
|
gem.files = `git ls-files`.split("\n")
|
13
13
|
gem.test_files = `git ls-files -- spec/*`.split("\n")
|
14
14
|
gem.name = "capistrano-notifier"
|
15
15
|
gem.require_paths = ["lib"]
|
16
|
-
gem.version =
|
16
|
+
gem.version = Capistrano::Notifier::VERSION
|
17
17
|
|
18
18
|
gem.add_dependency 'actionmailer'
|
19
19
|
gem.add_dependency 'activesupport'
|
20
|
+
gem.add_dependency 'capistrano', '>= 2'
|
20
21
|
|
21
22
|
gem.add_development_dependency 'guard-rspec'
|
22
23
|
gem.add_development_dependency 'rspec'
|
24
|
+
gem.add_development_dependency 'timecop'
|
23
25
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
class Capistrano::Notifier::Base
|
2
|
+
def initialize(capistrano)
|
3
|
+
@cap = capistrano
|
4
|
+
end
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
def application
|
9
|
+
cap.application
|
10
|
+
end
|
11
|
+
|
12
|
+
def branch
|
13
|
+
cap.branch
|
14
|
+
end
|
15
|
+
|
16
|
+
def cap
|
17
|
+
@cap
|
18
|
+
end
|
19
|
+
|
20
|
+
def git_current_revision
|
21
|
+
cap.current_revision[0,7]
|
22
|
+
end
|
23
|
+
|
24
|
+
def git_log
|
25
|
+
`git log #{git_range} --no-merges --format=format:"%h %s (%an)"`
|
26
|
+
end
|
27
|
+
|
28
|
+
def git_previous_revision
|
29
|
+
cap.previous_revision[0,7]
|
30
|
+
end
|
31
|
+
|
32
|
+
def git_range
|
33
|
+
"#{git_previous_revision}..#{git_current_revision}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def now
|
37
|
+
@now ||= Time.now
|
38
|
+
end
|
39
|
+
|
40
|
+
def stage
|
41
|
+
cap.stage if cap.respond_to? :stage
|
42
|
+
end
|
43
|
+
|
44
|
+
def user_name
|
45
|
+
user = ENV['DEPLOYER']
|
46
|
+
user = `git config --get user.name`.strip if user.nil?
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Band-aid for issue with Capistrano
|
51
|
+
# https://github.com/capistrano/capistrano/issues/168#issuecomment-4144687
|
52
|
+
Capistrano::Configuration::Namespaces::Namespace.class_eval do
|
53
|
+
def capture(*args)
|
54
|
+
parent.capture *args
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'capistrano/notifier'
|
2
|
+
require 'action_mailer'
|
3
|
+
|
4
|
+
class Capistrano::Notifier::Mail < Capistrano::Notifier::Base
|
5
|
+
def self.load_into(configuration)
|
6
|
+
configuration.load do
|
7
|
+
namespace :deploy do
|
8
|
+
namespace :notify do
|
9
|
+
desc 'Send a deployment notification via email.'
|
10
|
+
task :mail do
|
11
|
+
Capistrano::Notifier::Mail.new(configuration).perform
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
after 'deploy', 'deploy:notify:mail'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def perform
|
21
|
+
mail = ActionMailer::Base.mail({
|
22
|
+
:body => text,
|
23
|
+
:delivery_method => notify_method,
|
24
|
+
:from => from,
|
25
|
+
:subject => subject,
|
26
|
+
:to => to
|
27
|
+
})
|
28
|
+
|
29
|
+
mail.deliver
|
30
|
+
|
31
|
+
puts ActionMailer::Base.deliveries if notify_method == :test
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def body
|
37
|
+
<<-BODY.gsub(/^ {6}/, '')
|
38
|
+
#{user_name} deployed
|
39
|
+
#{application.titleize} branch
|
40
|
+
#{branch} to
|
41
|
+
#{stage} on
|
42
|
+
#{now.strftime("%m/%d/%Y")} at
|
43
|
+
#{now.strftime("%I:%M %p %Z")}
|
44
|
+
|
45
|
+
#{git_range}
|
46
|
+
#{git_log}
|
47
|
+
BODY
|
48
|
+
end
|
49
|
+
|
50
|
+
def from
|
51
|
+
cap.notifier_mail_options[:from]
|
52
|
+
end
|
53
|
+
|
54
|
+
def github_commit_prefix
|
55
|
+
"#{github_prefix}/commit"
|
56
|
+
end
|
57
|
+
|
58
|
+
def github_compare_prefix
|
59
|
+
"#{github_prefix}/compare"
|
60
|
+
end
|
61
|
+
|
62
|
+
def github_prefix
|
63
|
+
"https://github.com/#{github}"
|
64
|
+
end
|
65
|
+
|
66
|
+
def github
|
67
|
+
cap.notifier_mail_options[:github]
|
68
|
+
end
|
69
|
+
|
70
|
+
def html
|
71
|
+
body.gsub(
|
72
|
+
/([0-9a-f]{7})\.\.([0-9a-f]{7})/, "<a href=\"#{github_compare_prefix}/\\1...\\2\">\\1..\\2</a>"
|
73
|
+
).gsub(
|
74
|
+
/^([0-9a-f]{7})/, "<a href=\"#{github_commit_prefix}/\\0\">\\0</a>"
|
75
|
+
)
|
76
|
+
end
|
77
|
+
|
78
|
+
def notify_method
|
79
|
+
cap.notifier_mail_options[:method]
|
80
|
+
end
|
81
|
+
|
82
|
+
def subject
|
83
|
+
"#{application.titleize} branch #{branch} deployed to #{stage}"
|
84
|
+
end
|
85
|
+
|
86
|
+
def text
|
87
|
+
body.gsub(/([0-9a-f]{7})\.\.([0-9a-f]{7})/, "#{github_compare_prefix}/\\1...\\2")
|
88
|
+
end
|
89
|
+
|
90
|
+
def to
|
91
|
+
cap.notifier_mail_options[:to]
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
if Capistrano::Configuration.instance
|
96
|
+
Capistrano::Notifier::Mail.load_into(Capistrano::Configuration.instance)
|
97
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'capistrano/notifier'
|
2
|
+
require 'socket'
|
3
|
+
|
4
|
+
class Capistrano::Notifier::StatsD < Capistrano::Notifier::Base
|
5
|
+
DEFAULTS = { :host => "127.0.0.1", :port => "8125", :with => :counter }
|
6
|
+
|
7
|
+
def self.load_into(configuration)
|
8
|
+
configuration.load do
|
9
|
+
namespace :deploy do
|
10
|
+
namespace :notify do
|
11
|
+
desc 'Notify StatsD of deploy.'
|
12
|
+
task :statsd do
|
13
|
+
Capistrano::Notifier::StatsD.new(configuration).perform
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
after 'deploy', 'deploy:notify:statsd'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def perform
|
23
|
+
socket.send packet, 0, host, port
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def host
|
29
|
+
options[:host]
|
30
|
+
end
|
31
|
+
|
32
|
+
def options
|
33
|
+
if cap.respond_to? :notifier_statsd_options
|
34
|
+
cap.notifier_statsd_options.reverse_merge DEFAULTS
|
35
|
+
else
|
36
|
+
DEFAULTS
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def packet
|
41
|
+
if stage
|
42
|
+
"#{application}.#{stage}.deploy:#{with}"
|
43
|
+
else
|
44
|
+
"#{application}.deploy:#{with}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def port
|
49
|
+
options[:port]
|
50
|
+
end
|
51
|
+
|
52
|
+
def socket
|
53
|
+
@socket ||= UDPSocket.new
|
54
|
+
end
|
55
|
+
|
56
|
+
def with
|
57
|
+
case options[:with]
|
58
|
+
when :counter then "1|c"
|
59
|
+
when :gauge then "1|g"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
if Capistrano::Configuration.instance
|
65
|
+
Capistrano::Notifier::StatsD.load_into(Capistrano::Configuration.instance)
|
66
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'capistrano/notifier/mail'
|
3
|
+
|
4
|
+
describe Capistrano::Notifier::Mail do
|
5
|
+
let(:configuration) { Capistrano::Configuration.new }
|
6
|
+
subject { described_class.new configuration }
|
7
|
+
|
8
|
+
before :each do
|
9
|
+
configuration.load do |configuration|
|
10
|
+
set :notifier_mail_options, {
|
11
|
+
:github => 'example/example',
|
12
|
+
:method => :sendmail,
|
13
|
+
:from => 'sender@example.com',
|
14
|
+
:to => 'example@example.com'
|
15
|
+
}
|
16
|
+
|
17
|
+
set :application, 'example'
|
18
|
+
set :branch, 'master'
|
19
|
+
set :stage, 'test'
|
20
|
+
|
21
|
+
set :current_revision, '12345670000000000000000000000000'
|
22
|
+
set :previous_revision, '890abcd0000000000000000000000000'
|
23
|
+
end
|
24
|
+
|
25
|
+
subject.stub(:git_log).and_return <<-LOG.gsub /^ {6}/, ''
|
26
|
+
1234567 This is the current commit (John Doe)
|
27
|
+
890abcd This is the previous commit (John Doe)
|
28
|
+
LOG
|
29
|
+
subject.stub(:user_name).and_return "John Doe"
|
30
|
+
end
|
31
|
+
|
32
|
+
it { subject.send(:github).should == 'example/example' }
|
33
|
+
it { subject.send(:notify_method).should == :sendmail }
|
34
|
+
it { subject.send(:from).should == 'sender@example.com' }
|
35
|
+
it { subject.send(:to).should == 'example@example.com' }
|
36
|
+
|
37
|
+
it "creates a subject" do
|
38
|
+
subject.send(:subject).should == "Example branch master deployed to test"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "renders a plaintext email" do
|
42
|
+
subject.send(:body).should == <<-BODY.gsub(/^ {6}/, '')
|
43
|
+
John Doe deployed
|
44
|
+
Example branch
|
45
|
+
master to
|
46
|
+
test on
|
47
|
+
01/01/2012 at
|
48
|
+
12:00 AM #{Time.now.zone}
|
49
|
+
|
50
|
+
890abcd..1234567
|
51
|
+
1234567 This is the current commit (John Doe)
|
52
|
+
890abcd This is the previous commit (John Doe)
|
53
|
+
|
54
|
+
BODY
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'capistrano/notifier/statsd'
|
3
|
+
|
4
|
+
describe Capistrano::Notifier::StatsD do
|
5
|
+
let(:configuration) { Capistrano::Configuration.new }
|
6
|
+
subject { described_class.new configuration }
|
7
|
+
|
8
|
+
before :each do
|
9
|
+
configuration.load do |configuration|
|
10
|
+
set :application, 'example'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it "sets defaults" do
|
15
|
+
subject.send(:host).should == '127.0.0.1'
|
16
|
+
subject.send(:port).should == '8125'
|
17
|
+
subject.send(:with).should == '1|c'
|
18
|
+
end
|
19
|
+
|
20
|
+
it "creates a packet" do
|
21
|
+
subject.send(:packet).should == "example.deploy:1|c"
|
22
|
+
end
|
23
|
+
|
24
|
+
it "sends a packet" do
|
25
|
+
UDPSocket.any_instance.should_receive(:send).once.with(
|
26
|
+
"example.deploy:1|c", 0, "127.0.0.1", "8125"
|
27
|
+
)
|
28
|
+
|
29
|
+
subject.perform
|
30
|
+
end
|
31
|
+
|
32
|
+
context "with a stage" do
|
33
|
+
before :each do
|
34
|
+
configuration.load do |configuration|
|
35
|
+
set :application, 'example'
|
36
|
+
set :stage, 'test'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it "creates a packet" do
|
41
|
+
subject.send(:packet).should == "example.test.deploy:1|c"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "with statsd options" do
|
46
|
+
before :each do
|
47
|
+
configuration.load do |configuration|
|
48
|
+
set :notifier_statsd_options, {
|
49
|
+
:host => '10.0.0.1',
|
50
|
+
:port => '1234'
|
51
|
+
}
|
52
|
+
|
53
|
+
set :application, 'example'
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
it "uses the options" do
|
58
|
+
subject.send(:host).should == '10.0.0.1'
|
59
|
+
subject.send(:port).should == '1234'
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context "with a gauge" do
|
64
|
+
before :each do
|
65
|
+
configuration.load do |configuration|
|
66
|
+
set :notifier_statsd_options, {
|
67
|
+
:with => :gauge
|
68
|
+
}
|
69
|
+
|
70
|
+
set :application, 'example'
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
it { subject.send(:with).should == "1|g" }
|
75
|
+
end
|
76
|
+
|
77
|
+
context "with an uppercase application" do
|
78
|
+
before :each do
|
79
|
+
configuration.load do
|
80
|
+
set :application, 'Example'
|
81
|
+
end
|
82
|
+
|
83
|
+
it "lowercases the application" do
|
84
|
+
subject.send(:packet).should == "example.deploy:1|c"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano-notifier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Justin Campbell
|
9
|
+
- Nathan L Smith
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date: 2012-
|
13
|
+
date: 2012-05-02 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: actionmailer
|
16
|
-
requirement:
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
17
18
|
none: false
|
18
19
|
requirements:
|
19
20
|
- - ! '>='
|
@@ -21,21 +22,47 @@ dependencies:
|
|
21
22
|
version: '0'
|
22
23
|
type: :runtime
|
23
24
|
prerelease: false
|
24
|
-
version_requirements:
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
none: false
|
27
|
+
requirements:
|
28
|
+
- - ! '>='
|
29
|
+
- !ruby/object:Gem::Version
|
30
|
+
version: '0'
|
25
31
|
- !ruby/object:Gem::Dependency
|
26
32
|
name: activesupport
|
27
|
-
requirement:
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
34
|
+
none: false
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
type: :runtime
|
40
|
+
prerelease: false
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
42
|
none: false
|
29
43
|
requirements:
|
30
44
|
- - ! '>='
|
31
45
|
- !ruby/object:Gem::Version
|
32
46
|
version: '0'
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: capistrano
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2'
|
33
55
|
type: :runtime
|
34
56
|
prerelease: false
|
35
|
-
version_requirements:
|
57
|
+
version_requirements: !ruby/object:Gem::Requirement
|
58
|
+
none: false
|
59
|
+
requirements:
|
60
|
+
- - ! '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '2'
|
36
63
|
- !ruby/object:Gem::Dependency
|
37
64
|
name: guard-rspec
|
38
|
-
requirement:
|
65
|
+
requirement: !ruby/object:Gem::Requirement
|
39
66
|
none: false
|
40
67
|
requirements:
|
41
68
|
- - ! '>='
|
@@ -43,10 +70,31 @@ dependencies:
|
|
43
70
|
version: '0'
|
44
71
|
type: :development
|
45
72
|
prerelease: false
|
46
|
-
version_requirements:
|
73
|
+
version_requirements: !ruby/object:Gem::Requirement
|
74
|
+
none: false
|
75
|
+
requirements:
|
76
|
+
- - ! '>='
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: '0'
|
47
79
|
- !ruby/object:Gem::Dependency
|
48
80
|
name: rspec
|
49
|
-
requirement:
|
81
|
+
requirement: !ruby/object:Gem::Requirement
|
82
|
+
none: false
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: '0'
|
87
|
+
type: :development
|
88
|
+
prerelease: false
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
90
|
+
none: false
|
91
|
+
requirements:
|
92
|
+
- - ! '>='
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: '0'
|
95
|
+
- !ruby/object:Gem::Dependency
|
96
|
+
name: timecop
|
97
|
+
requirement: !ruby/object:Gem::Requirement
|
50
98
|
none: false
|
51
99
|
requirements:
|
52
100
|
- - ! '>='
|
@@ -54,10 +102,15 @@ dependencies:
|
|
54
102
|
version: '0'
|
55
103
|
type: :development
|
56
104
|
prerelease: false
|
57
|
-
version_requirements:
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ! '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
58
111
|
description: Capistrano Notifier
|
59
112
|
email:
|
60
|
-
-
|
113
|
+
- sysadmin@cramerdev.com
|
61
114
|
executables: []
|
62
115
|
extensions: []
|
63
116
|
extra_rdoc_files: []
|
@@ -65,18 +118,27 @@ files:
|
|
65
118
|
- .gitignore
|
66
119
|
- .rspec
|
67
120
|
- .rvmrc
|
121
|
+
- .travis.yml
|
68
122
|
- Gemfile
|
69
123
|
- Guardfile
|
70
124
|
- LICENSE
|
71
125
|
- README.md
|
72
126
|
- Rakefile
|
73
127
|
- capistrano-notifier.gemspec
|
74
|
-
- lib/capistrano
|
75
|
-
- lib/
|
76
|
-
- lib/
|
77
|
-
-
|
128
|
+
- lib/capistrano/notifier.rb
|
129
|
+
- lib/capistrano/notifier/base.rb
|
130
|
+
- lib/capistrano/notifier/mail.rb
|
131
|
+
- lib/capistrano/notifier/statsd.rb
|
132
|
+
- lib/capistrano/notifier/templates/mail.erb
|
133
|
+
- lib/capistrano/notifier/templates/mail.html.erb
|
134
|
+
- lib/capistrano/notifier/templates/mail.text.erb
|
135
|
+
- lib/capistrano/notifier/templates/mail.txt.erb
|
136
|
+
- lib/capistrano/notifier/version.rb
|
137
|
+
- spec/capistrano/notifier/mail_spec.rb
|
138
|
+
- spec/capistrano/notifier/statsd_spec.rb
|
139
|
+
- spec/capistrano/notifier_spec.rb
|
78
140
|
- spec/spec_helper.rb
|
79
|
-
homepage: http://github.com/
|
141
|
+
homepage: http://github.com/cramerdev/capistrano-notifier
|
80
142
|
licenses: []
|
81
143
|
post_install_message:
|
82
144
|
rdoc_options: []
|
@@ -96,10 +158,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
96
158
|
version: '0'
|
97
159
|
requirements: []
|
98
160
|
rubyforge_project:
|
99
|
-
rubygems_version: 1.8.
|
161
|
+
rubygems_version: 1.8.23
|
100
162
|
signing_key:
|
101
163
|
specification_version: 3
|
102
164
|
summary: Capistrano Notifier
|
103
165
|
test_files:
|
104
|
-
- spec/
|
166
|
+
- spec/capistrano/notifier/mail_spec.rb
|
167
|
+
- spec/capistrano/notifier/statsd_spec.rb
|
168
|
+
- spec/capistrano/notifier_spec.rb
|
105
169
|
- spec/spec_helper.rb
|
data/lib/capistrano-notifier.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require 'capistrano_notifier'
|
data/lib/capistrano_notifier.rb
DELETED
@@ -1,133 +0,0 @@
|
|
1
|
-
require "action_mailer"
|
2
|
-
require "active_support"
|
3
|
-
require "capistrano_notifier/version"
|
4
|
-
|
5
|
-
Capistrano::Configuration::Namespaces::Namespace.class_eval do
|
6
|
-
def capture(*args)
|
7
|
-
parent.capture *args
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
module Capistrano
|
12
|
-
class Notifier
|
13
|
-
def initialize(capistrano)
|
14
|
-
@cap = capistrano
|
15
|
-
end
|
16
|
-
|
17
|
-
def perform
|
18
|
-
mail = ActionMailer::Base.mail({
|
19
|
-
:body => text,
|
20
|
-
:delivery_method => notify_method,
|
21
|
-
:from => from,
|
22
|
-
:subject => subject,
|
23
|
-
:to => to
|
24
|
-
})
|
25
|
-
|
26
|
-
mail.deliver
|
27
|
-
|
28
|
-
puts ActionMailer::Base.deliveries if notify_method == :test
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
|
33
|
-
def application
|
34
|
-
cap.application.titleize
|
35
|
-
end
|
36
|
-
|
37
|
-
def body
|
38
|
-
<<-BODY
|
39
|
-
#{user} deployed
|
40
|
-
#{application} branch
|
41
|
-
#{branch} to
|
42
|
-
#{stage} on
|
43
|
-
#{now.strftime("%m/%d/%Y")} at
|
44
|
-
#{now.strftime("%I:%M %p %Z")}
|
45
|
-
|
46
|
-
#{git_range}
|
47
|
-
#{git_log}
|
48
|
-
BODY
|
49
|
-
end
|
50
|
-
|
51
|
-
def branch
|
52
|
-
cap.branch
|
53
|
-
end
|
54
|
-
|
55
|
-
def cap
|
56
|
-
@cap
|
57
|
-
end
|
58
|
-
|
59
|
-
def current_revision
|
60
|
-
cap.current_revision[0,7]
|
61
|
-
end
|
62
|
-
|
63
|
-
def from
|
64
|
-
cap.notify_from
|
65
|
-
end
|
66
|
-
|
67
|
-
def git_log
|
68
|
-
`git log #{git_range} --no-merges --format=format:"%h %s (%an)"`
|
69
|
-
end
|
70
|
-
|
71
|
-
def git_range
|
72
|
-
"#{previous_revision}..#{current_revision}"
|
73
|
-
end
|
74
|
-
|
75
|
-
def github_commit_prefix
|
76
|
-
"#{github_prefix}/commit"
|
77
|
-
end
|
78
|
-
|
79
|
-
def github_compare_prefix
|
80
|
-
"#{github_prefix}/compare"
|
81
|
-
end
|
82
|
-
|
83
|
-
def github_prefix
|
84
|
-
"https://github.com/#{github_project}"
|
85
|
-
end
|
86
|
-
|
87
|
-
def github_project
|
88
|
-
cap.notify_github_project
|
89
|
-
end
|
90
|
-
|
91
|
-
def html
|
92
|
-
body.gsub(
|
93
|
-
/([0-9a-f]{7})\.\.([0-9a-f]{7})/, "<a href=\"#{github_compare_prefix}/\\1...\\2\">\\1..\\2</a>"
|
94
|
-
).gsub(
|
95
|
-
/^([0-9a-f]{7})/, "<a href=\"#{github_commit_prefix}/\\0\">\\0</a>"
|
96
|
-
)
|
97
|
-
end
|
98
|
-
|
99
|
-
def previous_revision
|
100
|
-
cap.previous_revision[0,7]
|
101
|
-
end
|
102
|
-
|
103
|
-
def notify_method
|
104
|
-
cap.notify_method
|
105
|
-
end
|
106
|
-
|
107
|
-
def now
|
108
|
-
@now ||= Time.new
|
109
|
-
end
|
110
|
-
|
111
|
-
def stage
|
112
|
-
cap.stage
|
113
|
-
end
|
114
|
-
|
115
|
-
def subject
|
116
|
-
"#{user} deployed #{application}@#{branch} to #{stage}"
|
117
|
-
end
|
118
|
-
|
119
|
-
def text
|
120
|
-
body.gsub(/([0-9a-f]{7})\.\.([0-9a-f]{7})/, "#{github_compare_prefix}/\\1...\\2")
|
121
|
-
end
|
122
|
-
|
123
|
-
def to
|
124
|
-
cap.notify_to
|
125
|
-
end
|
126
|
-
|
127
|
-
def user
|
128
|
-
user = ENV['DEPLOYER']
|
129
|
-
user = `git config --get user.name`.strip if user.nil?
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|