release_party 0.0.1 → 0.0.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.
- data/lib/release_party/announce.rb +5 -0
- data/lib/release_party/celebration.rb +47 -0
- data/lib/release_party/celebrations/campfire.rb +32 -0
- data/lib/release_party/celebrations/git.rb +55 -0
- data/lib/release_party/celebrations/mailer.rb +74 -0
- data/lib/release_party/celebrations/pivotal_tracker.rb +58 -0
- data/lib/release_party/environment.rb +32 -33
- data/lib/release_party/errors.rb +11 -0
- data/lib/release_party/release_file.rb +19 -10
- data/lib/release_party/release_party.rb +54 -169
- metadata +187 -32
@@ -0,0 +1,47 @@
|
|
1
|
+
#
|
2
|
+
# Celebration is effectively an abstract class that handles before and after deploy callbacks
|
3
|
+
#
|
4
|
+
class Celebration
|
5
|
+
|
6
|
+
attr :environment
|
7
|
+
|
8
|
+
def self.inherited(subclass)
|
9
|
+
(@@celebrations ||= []) << subclass
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(environment)
|
13
|
+
@environment = environment
|
14
|
+
end
|
15
|
+
|
16
|
+
def tasks
|
17
|
+
[]
|
18
|
+
end
|
19
|
+
|
20
|
+
def before_deploy
|
21
|
+
end
|
22
|
+
|
23
|
+
def after_deploy
|
24
|
+
end
|
25
|
+
|
26
|
+
protected #####################################################################
|
27
|
+
|
28
|
+
def announce(*args)
|
29
|
+
environment.party.announce *args
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.celebrations
|
33
|
+
@@celebrations
|
34
|
+
end
|
35
|
+
|
36
|
+
# Helper to check that all arguments required for a particular task
|
37
|
+
# are supplied
|
38
|
+
def arguments_required(*arguments)
|
39
|
+
missing = arguments.reject do |argument|
|
40
|
+
environment.send(argument.to_sym)
|
41
|
+
end
|
42
|
+
unless missing.empty?
|
43
|
+
raise ArgumentError, "Parameters #{missing.join(', ')} must be defined"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#
|
2
|
+
# Campfire announcer
|
3
|
+
#
|
4
|
+
module Celebrations
|
5
|
+
class Campfire < Celebration
|
6
|
+
|
7
|
+
attr :campfire
|
8
|
+
|
9
|
+
def initialize(env)
|
10
|
+
super env
|
11
|
+
arguments_required(:campfire_account, :campfire_room, :campfire_token)
|
12
|
+
|
13
|
+
require 'tinder'
|
14
|
+
|
15
|
+
ssl = environment.campfire_ssl? && environment.campfire_ssl
|
16
|
+
@campfire = ::Tinder::Campfire.new \
|
17
|
+
environment.campfire_account,
|
18
|
+
:token => environment.campfire_token,
|
19
|
+
:ssl => ssl
|
20
|
+
@campfire.find_room_by_name(environment.campfire_room)
|
21
|
+
end
|
22
|
+
|
23
|
+
def after_deploy
|
24
|
+
@campfire.speak environment.campfire_begin_message
|
25
|
+
end
|
26
|
+
|
27
|
+
def before_deploy
|
28
|
+
@campfire.speak environment.campfire_after_message
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
#
|
2
|
+
# Git module, mostly just used to query the repo, could be used to tag?
|
3
|
+
#
|
4
|
+
module Celebrations
|
5
|
+
class Git < Celebration
|
6
|
+
|
7
|
+
def initialize(env)
|
8
|
+
super env
|
9
|
+
|
10
|
+
require 'grit'
|
11
|
+
end
|
12
|
+
|
13
|
+
def commit_tracker_progress(env)
|
14
|
+
# Go through each finished story id we've seen in the git repo
|
15
|
+
# and deliver each story that is marked as finished
|
16
|
+
env.finished_store_ids.each do |story_id|
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def load_git_progress(env)
|
22
|
+
repo = Grit::Repo.new(Dir.pwd)
|
23
|
+
config = Grit::Config.new(repo)
|
24
|
+
|
25
|
+
feature_branch = config.fetch('gitflow.prefix.feature', 'feature/')
|
26
|
+
release_branch = config.fetch('gitflow.prefix.release', 'release/')
|
27
|
+
puts "Feature branch: #{feature_branch}"
|
28
|
+
puts "Release branch: #{release_branch}"
|
29
|
+
|
30
|
+
# Find the last release
|
31
|
+
latest_release = \
|
32
|
+
repo.commits('master').find do |commit|
|
33
|
+
commit.message =~ /\AMerge branch '#{release_branch}(\d+)/
|
34
|
+
end
|
35
|
+
latest_release_tag = $1
|
36
|
+
|
37
|
+
puts "Commit: #{latest_release} #{latest_release.message}"
|
38
|
+
previous_release = \
|
39
|
+
repo.commits('master', 100).find do |commit|
|
40
|
+
if commit.message =~ /\AMerge branch '#{release_branch}(\d+)/
|
41
|
+
latest_release_tag != $1
|
42
|
+
end
|
43
|
+
end
|
44
|
+
previous_release_tag = $1
|
45
|
+
puts "Commit: #{previous_release} #{previous_release.message}"
|
46
|
+
|
47
|
+
env.finished_story_ids =
|
48
|
+
repo.commits('develop').collect do |commit|
|
49
|
+
$1 if commit.message =~ /\AMerge branch '#{feature_branch}(\d+)/
|
50
|
+
end.compact
|
51
|
+
puts env.finished_story_ids
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), '..', 'announce')
|
2
|
+
require File.join(File.dirname(__FILE__), '..', 'errors')
|
3
|
+
|
4
|
+
#
|
5
|
+
# Celebrate by sending out emails
|
6
|
+
#
|
7
|
+
module Celebrations
|
8
|
+
class Mailer < Celebration
|
9
|
+
include Announce
|
10
|
+
|
11
|
+
attr :engine
|
12
|
+
|
13
|
+
def initialize(env)
|
14
|
+
super env
|
15
|
+
arguments_required(:template_engine, :template, :smtp_address, :smtp_port,
|
16
|
+
:from_address, :email_notification_to, :subject)
|
17
|
+
|
18
|
+
require 'mail'
|
19
|
+
|
20
|
+
template = env.template
|
21
|
+
raise ArgumentError, "Missing template file #{template}" unless File.exists?(template)
|
22
|
+
|
23
|
+
@engine = \
|
24
|
+
case environment.template_engine
|
25
|
+
when :haml
|
26
|
+
require 'haml'
|
27
|
+
Haml::Engine.new(File.read(template))
|
28
|
+
|
29
|
+
when :erb
|
30
|
+
require 'erb'
|
31
|
+
ERB.new(File.read(template))
|
32
|
+
|
33
|
+
else
|
34
|
+
raise ArgumentError, "Unsupported template engine #{environment.template_engine}"
|
35
|
+
end
|
36
|
+
|
37
|
+
address = environment.smtp_address
|
38
|
+
port = environment.smtp_port
|
39
|
+
domain = environment.smtp_domain
|
40
|
+
Mail.defaults do
|
41
|
+
delivery_method :smtp, :address => address, :port => port, :domain => domain
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def after_deploy
|
46
|
+
deliver_notification
|
47
|
+
end
|
48
|
+
|
49
|
+
private #######################################################################
|
50
|
+
|
51
|
+
def deliver_notification
|
52
|
+
mail = Mail.new
|
53
|
+
mail.to = environment.email_notification_to
|
54
|
+
mail.from = environment.from_address
|
55
|
+
mail.subject = environment.subject
|
56
|
+
html = engine.render environment
|
57
|
+
mail.html_part do
|
58
|
+
content_type 'text/html; charset=UTF-8'
|
59
|
+
body html
|
60
|
+
end
|
61
|
+
|
62
|
+
announce "Delivering deployment notice to #{environment.email_notification_to.inspect}"
|
63
|
+
mail.deliver!
|
64
|
+
|
65
|
+
rescue *SMTP_SERVER_ERRORS => error
|
66
|
+
announce "Unable to deliver deployment notice: #{error.message}"
|
67
|
+
|
68
|
+
else
|
69
|
+
announce "Deployment notice sent!"
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
#
|
2
|
+
# Pivotal tracker celebration module, supports tasks:
|
3
|
+
#
|
4
|
+
# Obtain progress
|
5
|
+
# Deliver features
|
6
|
+
#
|
7
|
+
module Celebrations
|
8
|
+
class PivotalTracker < Celebration
|
9
|
+
include Announce
|
10
|
+
|
11
|
+
attr :project_id, :project_api_key
|
12
|
+
attr :project
|
13
|
+
|
14
|
+
def initialize(env)
|
15
|
+
super env
|
16
|
+
arguments_required(:project_id, :project_api_key)
|
17
|
+
|
18
|
+
require 'pivotal-tracker'
|
19
|
+
|
20
|
+
@project_id = environment.project_id
|
21
|
+
@project_api_key = environment.project_api_key
|
22
|
+
|
23
|
+
::PivotalTracker::Client.token = environment.project_api_key
|
24
|
+
|
25
|
+
begin
|
26
|
+
@project = ::PivotalTracker::Project.find(environment.project_id)
|
27
|
+
rescue RestClient::Request::Unauthorized => e
|
28
|
+
announce 'Unable to authenticate with pivotal, perhaps your API key is wrong.' +
|
29
|
+
"Message: #{e.message}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def before_deploy
|
34
|
+
environment.finished_stories = finished_stories
|
35
|
+
environment.known_bugs = known_bugs
|
36
|
+
end
|
37
|
+
|
38
|
+
def after_deploy
|
39
|
+
# Deliver all finished stories if the deliver_finished flag is set
|
40
|
+
if environment.deliver_finished? && environment.deliver_finished
|
41
|
+
finished_stories.each do |story|
|
42
|
+
story.update(:current_state => 'delivered')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
private #######################################################################
|
48
|
+
|
49
|
+
def finished_stories
|
50
|
+
project.stories.all(:state => 'finished')
|
51
|
+
end
|
52
|
+
|
53
|
+
def known_bugs
|
54
|
+
project.stories.all(:state => ['unstarted', 'started'], :story_type => 'bug')
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
@@ -2,56 +2,55 @@ require File.join(File.dirname(__FILE__), 'release_file')
|
|
2
2
|
|
3
3
|
class Environment
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
attr :party
|
6
|
+
|
7
|
+
def initialize(party, config)
|
8
|
+
@party = party
|
9
|
+
@cap_config = config
|
10
|
+
@variables = {}
|
8
11
|
end
|
9
12
|
|
10
13
|
def method_missing(method_id, *args, &block)
|
11
14
|
case method_id.to_s
|
12
15
|
when /\A(.*)=\Z/
|
13
|
-
@
|
14
|
-
|
15
|
-
when /\A(.*)\?\Z/
|
16
|
-
@attributes.key?($1.to_sym)
|
16
|
+
@variables[$1.to_sym] = args.first || block
|
17
17
|
|
18
18
|
else
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
19
|
+
key = method_id.to_sym
|
20
|
+
value = if @variables.key?(key)
|
21
|
+
@variables[key]
|
22
|
+
else
|
23
|
+
@cap_config.fetch(key, defaults[key])
|
24
|
+
end
|
23
25
|
return value.call if value.is_a?(Proc)
|
24
26
|
value
|
25
27
|
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
31
|
+
# Process the Releasefile and merge the variables loaded
|
29
32
|
def load_release_file
|
30
|
-
# Process the Releasefile and merge the attributes loaded
|
31
33
|
release_file = ReleaseFile.new
|
32
|
-
@
|
33
|
-
end
|
34
|
-
|
35
|
-
def load_capistrano_defaults(cap_config)
|
36
|
-
# General cap info
|
37
|
-
self.user = cap_config.fetch(:user, `git config user.name`.chomp)
|
38
|
-
self.branch = cap_config.fetch(:branch, 'master')
|
39
|
-
self.stage = cap_config.fetch(:stage, 'staging')
|
40
|
-
self.repository = cap_config.fetch(:repository, nil)
|
41
|
-
self.domain = cap_config.fetch(:domain, nil)
|
42
|
-
self.display_name = cap_config.fetch(:display_name, 'Release Party')
|
34
|
+
@variables = @variables.merge release_file.variables
|
43
35
|
end
|
44
36
|
|
45
|
-
def
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
37
|
+
def defaults
|
38
|
+
{
|
39
|
+
:user => `git config user.name`.chomp,
|
40
|
+
:branch => 'master',
|
41
|
+
:stage => 'staging',
|
42
|
+
:domain => 'http://releaseparty.org',
|
43
|
+
:display_name => 'Release Party',
|
44
|
+
:from_address => 'Release Party <releaseparty@noreply.org>',
|
45
|
+
:smtp_address => 'localhost',
|
46
|
+
:smtp_port => 25,
|
47
|
+
:subject => Proc.new {"#{display_name} was released to #{domain}"},
|
48
|
+
:finished_stories => [],
|
49
|
+
:known_bugs => [],
|
50
|
+
:send_email => true,
|
51
|
+
:template_engine => :haml,
|
52
|
+
:deliver_stories => false,
|
53
|
+
}
|
55
54
|
end
|
56
55
|
|
57
56
|
end
|
@@ -1,22 +1,31 @@
|
|
1
|
+
#
|
2
|
+
# Release file just gives us some handy short hand for defining variables
|
3
|
+
# inside a file, e.g:
|
4
|
+
#
|
5
|
+
# x 1
|
6
|
+
# y 2
|
7
|
+
#
|
8
|
+
# Sets the configuration variables x and y to 1 and 2 respectively, plus it
|
9
|
+
# supports blocks and comments
|
10
|
+
#
|
1
11
|
class ReleaseFile
|
2
12
|
|
13
|
+
FileNotFoundError = Class.new(RuntimeError)
|
14
|
+
|
3
15
|
RELEASE_FILE = 'Releasefile'
|
16
|
+
RELEASE_PATH = File.join(Dir.pwd, RELEASE_FILE)
|
4
17
|
|
5
|
-
attr_reader :
|
18
|
+
attr_reader :variables
|
6
19
|
|
7
|
-
def initialize
|
8
|
-
@
|
20
|
+
def initialize(path = RELEASE_PATH)
|
21
|
+
@variables = {}
|
9
22
|
|
10
|
-
|
11
|
-
|
12
|
-
eval File.read(capfile_path)
|
13
|
-
else
|
14
|
-
puts "Warning: No #{RELEASE_FILE} found, you should put one in your project root."
|
15
|
-
end
|
23
|
+
raise FileNotFoundError, "No Releasefile found name at #{path}" unless File.exists?(path)
|
24
|
+
eval File.read(path)
|
16
25
|
end
|
17
26
|
|
18
27
|
def method_missing(method_id, *args, &block)
|
19
|
-
@
|
28
|
+
@variables[method_id.to_sym] = args.first || block
|
20
29
|
end
|
21
30
|
|
22
31
|
end
|
@@ -1,202 +1,87 @@
|
|
1
|
+
require 'rubygems'
|
1
2
|
require 'capistrano'
|
2
|
-
require 'pivotal-tracker'
|
3
|
-
require 'mail'
|
4
|
-
require 'grit'
|
5
3
|
|
4
|
+
require File.join(File.dirname(__FILE__), 'announce')
|
6
5
|
require File.join(File.dirname(__FILE__), 'environment')
|
6
|
+
require File.join(File.dirname(__FILE__), 'celebration')
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
configuration.load do
|
12
|
-
|
13
|
-
after 'deploy', 'release_party:finished'
|
14
|
-
|
15
|
-
namespace 'release_party' do
|
16
|
-
task 'started' do
|
17
|
-
@env = Environment.new
|
18
|
-
|
19
|
-
# Record when the release began
|
20
|
-
@env.release_started = Time.now
|
8
|
+
Dir[File.join(File.dirname(__FILE__), 'celebrations', '*.rb')].each do |file|
|
9
|
+
require file
|
10
|
+
end
|
21
11
|
|
22
|
-
|
23
|
-
|
12
|
+
module Capistrano::ReleaseParty
|
13
|
+
include Announce
|
24
14
|
|
25
|
-
|
15
|
+
# Singleton instance of the release party environment
|
16
|
+
def self.instance(party = nil, cap_config = nil, &block)
|
17
|
+
return @env unless @env.nil?
|
26
18
|
|
27
|
-
|
28
|
-
load_tracker_progress @env
|
29
|
-
end
|
19
|
+
raise ArgumentError, "Release finished without being started" if party.nil? || cap_config.nil?
|
30
20
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
announce "celebrating release, deployment finished successfully!"
|
21
|
+
@env = Environment.new party, cap_config
|
22
|
+
yield(@env) if block_given?
|
23
|
+
@env
|
24
|
+
end
|
36
25
|
|
37
|
-
|
38
|
-
|
26
|
+
def self.extended(configuration)
|
27
|
+
configuration.load do
|
39
28
|
|
29
|
+
before 'deploy', 'release_party:starting'
|
30
|
+
after 'deploy', 'release_party:finished'
|
40
31
|
|
41
|
-
|
42
|
-
|
43
|
-
commit_tracker_progress @env
|
44
|
-
end
|
32
|
+
namespace :release_party do
|
33
|
+
task :starting do
|
45
34
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
35
|
+
env = Capistrano::ReleaseParty.instance(Capistrano::ReleaseParty, configuration) do |environment|
|
36
|
+
begin
|
37
|
+
environment.load_release_file
|
38
|
+
rescue ReleaseFile::FileNotFoundError => error
|
39
|
+
announce error.message
|
50
40
|
end
|
51
|
-
|
52
|
-
#rescue ArgumentError => error
|
53
|
-
# puts "ERROR: #{error.message}"
|
54
41
|
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
42
|
|
60
|
-
|
61
|
-
# Go through each finished story id we've seen in the git repo
|
62
|
-
# and deliver each story that is marked as finished
|
63
|
-
env.finished_store_ids.each do |story_id|
|
43
|
+
announce "Beginning deployment, project details obtained."
|
64
44
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
def load_git_progress(env)
|
69
|
-
#repo = Grit::Repo.new(Dir.pwd)
|
70
|
-
repo = Grit::Repo.new("/Users/john/Projects/breeze")
|
71
|
-
config = Grit::Config.new(repo)
|
72
|
-
|
73
|
-
feature_branch = config.fetch('gitflow.prefix.feature', 'feature/')
|
74
|
-
release_branch = config.fetch('gitflow.prefix.release', 'release/')
|
75
|
-
puts "Feature branch: #{feature_branch}"
|
76
|
-
puts "Release branch: #{release_branch}"
|
77
|
-
|
78
|
-
# Find the last release
|
79
|
-
latest_release = \
|
80
|
-
repo.commits('master').find do |commit|
|
81
|
-
commit.message =~ /\AMerge branch '#{release_branch}(\d+)/
|
82
|
-
end
|
83
|
-
latest_release_tag = $1
|
84
|
-
|
85
|
-
puts "Commit: #{latest_release} #{latest_release.message}"
|
86
|
-
previous_release = \
|
87
|
-
repo.commits('master', 100).find do |commit|
|
88
|
-
if commit.message =~ /\AMerge branch '#{release_branch}(\d+)/
|
89
|
-
latest_release_tag != $1
|
90
|
-
end
|
91
|
-
end
|
92
|
-
previous_release_tag = $1
|
93
|
-
puts "Commit: #{previous_release} #{previous_release.message}"
|
94
|
-
|
95
|
-
env.finished_story_ids =
|
96
|
-
repo.commits('develop').collect do |commit|
|
97
|
-
$1 if commit.message =~ /\AMerge branch '#{feature_branch}(\d+)/
|
98
|
-
end.compact
|
99
|
-
puts env.finished_story_ids
|
100
|
-
end
|
101
|
-
|
102
|
-
def load_email_content(env)
|
103
|
-
arguments_required env, :template_engine, :template
|
45
|
+
# Record when the release began
|
46
|
+
env.release_started = Time.now
|
104
47
|
|
105
|
-
|
106
|
-
|
48
|
+
# Load all the celebrations
|
49
|
+
env.celebrations = \
|
50
|
+
Celebration.celebrations.collect do |celebration_class|
|
51
|
+
begin
|
52
|
+
celebration_class.new(env).tap(&:before_deploy)
|
107
53
|
|
108
|
-
|
109
|
-
|
110
|
-
when :haml
|
111
|
-
load_haml
|
112
|
-
Haml::Engine.new(File.read(template))
|
54
|
+
rescue LoadError => error
|
55
|
+
announce "Unable to load #{celebration_class}, message: #{error.message} you may have to install a gem"
|
113
56
|
|
114
|
-
|
115
|
-
|
116
|
-
ERB.new(File.read(template))
|
57
|
+
rescue ArgumentError => error
|
58
|
+
announce error.message
|
117
59
|
|
118
|
-
|
119
|
-
|
120
|
-
end
|
60
|
+
end
|
61
|
+
end.compact
|
121
62
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
def load_tracker_progress(env)
|
126
|
-
arguments_required env, :project_id, :project_api_key
|
63
|
+
self
|
64
|
+
|
65
|
+
end
|
127
66
|
|
128
|
-
|
67
|
+
task :finished do
|
68
|
+
env = Capistrano::ReleaseParty.instance
|
129
69
|
|
130
|
-
|
131
|
-
env.project = PivotalTracker::Project.find(env.project_id)
|
132
|
-
rescue RestClient::Request::Unauthorized => e
|
133
|
-
puts 'Unable to authenticate with pivotal, perhaps your API key is wrong.' +
|
134
|
-
"Message: #{e.message}"
|
135
|
-
end
|
70
|
+
announce "Performing post deploy celebrations!"
|
136
71
|
|
137
|
-
|
138
|
-
|
139
|
-
project.stories.all(:state => 'finished')
|
140
|
-
self.known_bugs = \
|
141
|
-
project.stories.all(:state => ['unstarted', 'started'], :story_type => 'bug')
|
142
|
-
end
|
143
|
-
end
|
72
|
+
# Record when the release finished
|
73
|
+
env.release_finished = Time.now
|
144
74
|
|
145
|
-
|
146
|
-
|
147
|
-
:smtp_address, :smtp_port, :smtp_domain, :from_address,
|
148
|
-
:email_notification_to, :subject
|
75
|
+
# Do after deploy
|
76
|
+
env.celebrations.each(&:after_deploy)
|
149
77
|
|
150
|
-
|
151
|
-
|
152
|
-
:address => env.smtp_address,
|
153
|
-
:port => env.smtp_port,
|
154
|
-
:domain => env.smtp_domain
|
155
|
-
end
|
156
|
-
announce "delivering deployment notice to #{env.email_notification_to.inspect}"
|
157
|
-
Mail.deliver do
|
158
|
-
from env.from_address
|
159
|
-
to env.email_notification_to
|
160
|
-
subject env.subject
|
161
|
-
html_part do
|
162
|
-
content_type 'text/html; charset=UTF-8'
|
163
|
-
body body
|
78
|
+
self
|
79
|
+
end
|
164
80
|
end
|
165
81
|
end
|
166
|
-
announce "deployment notice sent!"
|
167
|
-
end
|
168
|
-
|
169
|
-
def announce(message)
|
170
|
-
puts "ReleaseParty: #{message}"
|
171
82
|
end
|
172
|
-
|
173
|
-
def arguments_required(env, *arguments)
|
174
|
-
missing = arguments.reject do |argument|
|
175
|
-
env.send("#{argument}?".to_sym)
|
176
|
-
end
|
177
|
-
unless missing.empty?
|
178
|
-
raise ArgumentError, "Parameters #{missing.join(', ')} must be defined"
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
def load_haml
|
183
|
-
require 'haml'
|
184
|
-
rescue LoadError => error
|
185
|
-
raise ArgumentError,
|
186
|
-
'Unable to load HAML, you need to make sure the haml gem is installed '
|
187
|
-
'if it is specified as the template engine'
|
188
|
-
end
|
189
|
-
|
190
|
-
def load_erb
|
191
|
-
require 'erb'
|
192
|
-
rescue LoadError => error
|
193
|
-
raise ArgumentError,
|
194
|
-
'Unable to load ERB, you need to make sure the erb gem is installed '
|
195
|
-
'if it is specified as the template engine'
|
196
|
-
end
|
197
|
-
|
198
83
|
end
|
199
84
|
|
200
85
|
if Capistrano::Configuration.instance
|
201
|
-
Capistrano::Configuration.instance.extend(Capistrano::
|
86
|
+
Capistrano::Configuration.instance.extend(Capistrano::ReleaseParty)
|
202
87
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: release_party
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- John Barker
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-05-
|
18
|
+
date: 2011-05-24 00:00:00 +08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -35,57 +35,101 @@ dependencies:
|
|
35
35
|
type: :runtime
|
36
36
|
version_requirements: *id001
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
|
-
name:
|
38
|
+
name: capistrano_colors
|
39
39
|
prerelease: false
|
40
40
|
requirement: &id002 !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
43
|
- - ">="
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
hash:
|
45
|
+
hash: 3
|
46
46
|
segments:
|
47
47
|
- 0
|
48
|
-
|
49
|
-
- 0
|
50
|
-
version: 0.2.0
|
48
|
+
version: "0"
|
51
49
|
type: :runtime
|
52
50
|
version_requirements: *id002
|
53
51
|
- !ruby/object:Gem::Dependency
|
54
|
-
name:
|
52
|
+
name: colored
|
55
53
|
prerelease: false
|
56
54
|
requirement: &id003 !ruby/object:Gem::Requirement
|
57
55
|
none: false
|
58
56
|
requirements:
|
59
57
|
- - ">="
|
60
58
|
- !ruby/object:Gem::Version
|
61
|
-
hash:
|
59
|
+
hash: 3
|
62
60
|
segments:
|
63
|
-
-
|
64
|
-
|
65
|
-
- 1
|
66
|
-
version: 2.4.1
|
61
|
+
- 0
|
62
|
+
version: "0"
|
67
63
|
type: :runtime
|
68
64
|
version_requirements: *id003
|
69
65
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
66
|
+
name: rake
|
71
67
|
prerelease: false
|
72
68
|
requirement: &id004 !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ~>
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
hash: 49
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
- 8
|
77
|
+
- 7
|
78
|
+
version: 0.8.7
|
79
|
+
type: :development
|
80
|
+
version_requirements: *id004
|
81
|
+
- !ruby/object:Gem::Dependency
|
82
|
+
name: rspec
|
83
|
+
prerelease: false
|
84
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
73
85
|
none: false
|
74
86
|
requirements:
|
75
87
|
- - ">="
|
76
88
|
- !ruby/object:Gem::Version
|
77
|
-
hash:
|
89
|
+
hash: 27
|
90
|
+
segments:
|
91
|
+
- 2
|
92
|
+
- 5
|
93
|
+
- 0
|
94
|
+
version: 2.5.0
|
95
|
+
type: :development
|
96
|
+
version_requirements: *id005
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rr
|
99
|
+
prerelease: false
|
100
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
101
|
+
none: false
|
102
|
+
requirements:
|
103
|
+
- - ~>
|
104
|
+
- !ruby/object:Gem::Version
|
105
|
+
hash: 19
|
78
106
|
segments:
|
107
|
+
- 1
|
108
|
+
- 0
|
79
109
|
- 2
|
110
|
+
version: 1.0.2
|
111
|
+
type: :development
|
112
|
+
version_requirements: *id006
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: bundler
|
115
|
+
prerelease: false
|
116
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
117
|
+
none: false
|
118
|
+
requirements:
|
119
|
+
- - ">="
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
hash: 5
|
122
|
+
segments:
|
80
123
|
- 1
|
81
124
|
- 0
|
82
|
-
|
83
|
-
|
84
|
-
|
125
|
+
- 9
|
126
|
+
version: 1.0.9
|
127
|
+
type: :development
|
128
|
+
version_requirements: *id007
|
85
129
|
- !ruby/object:Gem::Dependency
|
86
|
-
name:
|
130
|
+
name: rcov
|
87
131
|
prerelease: false
|
88
|
-
requirement: &
|
132
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
89
133
|
none: false
|
90
134
|
requirements:
|
91
135
|
- - ">="
|
@@ -94,12 +138,12 @@ dependencies:
|
|
94
138
|
segments:
|
95
139
|
- 0
|
96
140
|
version: "0"
|
97
|
-
type: :
|
98
|
-
version_requirements: *
|
141
|
+
type: :development
|
142
|
+
version_requirements: *id008
|
99
143
|
- !ruby/object:Gem::Dependency
|
100
|
-
name:
|
144
|
+
name: capistrano-spec
|
101
145
|
prerelease: false
|
102
|
-
requirement: &
|
146
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
103
147
|
none: false
|
104
148
|
requirements:
|
105
149
|
- - ">="
|
@@ -108,8 +152,112 @@ dependencies:
|
|
108
152
|
segments:
|
109
153
|
- 0
|
110
154
|
version: "0"
|
111
|
-
type: :
|
112
|
-
version_requirements: *
|
155
|
+
type: :development
|
156
|
+
version_requirements: *id009
|
157
|
+
- !ruby/object:Gem::Dependency
|
158
|
+
name: yard
|
159
|
+
prerelease: false
|
160
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ">="
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
hash: 3
|
166
|
+
segments:
|
167
|
+
- 0
|
168
|
+
version: "0"
|
169
|
+
type: :development
|
170
|
+
version_requirements: *id010
|
171
|
+
- !ruby/object:Gem::Dependency
|
172
|
+
name: haml
|
173
|
+
prerelease: false
|
174
|
+
requirement: &id011 !ruby/object:Gem::Requirement
|
175
|
+
none: false
|
176
|
+
requirements:
|
177
|
+
- - ">="
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
hash: 3
|
180
|
+
segments:
|
181
|
+
- 0
|
182
|
+
version: "0"
|
183
|
+
type: :development
|
184
|
+
version_requirements: *id011
|
185
|
+
- !ruby/object:Gem::Dependency
|
186
|
+
name: sass
|
187
|
+
prerelease: false
|
188
|
+
requirement: &id012 !ruby/object:Gem::Requirement
|
189
|
+
none: false
|
190
|
+
requirements:
|
191
|
+
- - ">="
|
192
|
+
- !ruby/object:Gem::Version
|
193
|
+
hash: 3
|
194
|
+
segments:
|
195
|
+
- 0
|
196
|
+
version: "0"
|
197
|
+
type: :development
|
198
|
+
version_requirements: *id012
|
199
|
+
- !ruby/object:Gem::Dependency
|
200
|
+
name: pivotal-tracker
|
201
|
+
prerelease: false
|
202
|
+
requirement: &id013 !ruby/object:Gem::Requirement
|
203
|
+
none: false
|
204
|
+
requirements:
|
205
|
+
- - ">="
|
206
|
+
- !ruby/object:Gem::Version
|
207
|
+
hash: 23
|
208
|
+
segments:
|
209
|
+
- 0
|
210
|
+
- 2
|
211
|
+
- 0
|
212
|
+
version: 0.2.0
|
213
|
+
type: :development
|
214
|
+
version_requirements: *id013
|
215
|
+
- !ruby/object:Gem::Dependency
|
216
|
+
name: mail
|
217
|
+
prerelease: false
|
218
|
+
requirement: &id014 !ruby/object:Gem::Requirement
|
219
|
+
none: false
|
220
|
+
requirements:
|
221
|
+
- - ">="
|
222
|
+
- !ruby/object:Gem::Version
|
223
|
+
hash: 11
|
224
|
+
segments:
|
225
|
+
- 2
|
226
|
+
- 1
|
227
|
+
- 0
|
228
|
+
version: 2.1.0
|
229
|
+
type: :development
|
230
|
+
version_requirements: *id014
|
231
|
+
- !ruby/object:Gem::Dependency
|
232
|
+
name: grit
|
233
|
+
prerelease: false
|
234
|
+
requirement: &id015 !ruby/object:Gem::Requirement
|
235
|
+
none: false
|
236
|
+
requirements:
|
237
|
+
- - ">="
|
238
|
+
- !ruby/object:Gem::Version
|
239
|
+
hash: 29
|
240
|
+
segments:
|
241
|
+
- 2
|
242
|
+
- 4
|
243
|
+
- 1
|
244
|
+
version: 2.4.1
|
245
|
+
type: :development
|
246
|
+
version_requirements: *id015
|
247
|
+
- !ruby/object:Gem::Dependency
|
248
|
+
name: tinder
|
249
|
+
prerelease: false
|
250
|
+
requirement: &id016 !ruby/object:Gem::Requirement
|
251
|
+
none: false
|
252
|
+
requirements:
|
253
|
+
- - ">="
|
254
|
+
- !ruby/object:Gem::Version
|
255
|
+
hash: 3
|
256
|
+
segments:
|
257
|
+
- 0
|
258
|
+
version: "0"
|
259
|
+
type: :development
|
260
|
+
version_requirements: *id016
|
113
261
|
description: Perform a number of common post deployment tasks such as delivering pivotal stories, sending out a release email, notifying campfire.
|
114
262
|
email: jebarker@gmail.com
|
115
263
|
executables: []
|
@@ -119,14 +267,21 @@ extensions: []
|
|
119
267
|
extra_rdoc_files: []
|
120
268
|
|
121
269
|
files:
|
270
|
+
- lib/release_party/announce.rb
|
271
|
+
- lib/release_party/celebration.rb
|
272
|
+
- lib/release_party/celebrations/campfire.rb
|
273
|
+
- lib/release_party/celebrations/git.rb
|
274
|
+
- lib/release_party/celebrations/mailer.rb
|
275
|
+
- lib/release_party/celebrations/pivotal_tracker.rb
|
122
276
|
- lib/release_party/environment.rb
|
277
|
+
- lib/release_party/errors.rb
|
123
278
|
- lib/release_party/release_file.rb
|
124
279
|
- lib/release_party/release_party.rb
|
125
280
|
- lib/release_party.rb
|
126
281
|
has_rdoc: true
|
127
|
-
homepage:
|
128
|
-
licenses:
|
129
|
-
|
282
|
+
homepage: https://github.com/excepttheweasel/release_party
|
283
|
+
licenses:
|
284
|
+
- MIT
|
130
285
|
post_install_message:
|
131
286
|
rdoc_options: []
|
132
287
|
|
@@ -158,6 +313,6 @@ rubyforge_project:
|
|
158
313
|
rubygems_version: 1.6.2
|
159
314
|
signing_key:
|
160
315
|
specification_version: 3
|
161
|
-
summary: Celebrate releases
|
316
|
+
summary: Celebrate releases!
|
162
317
|
test_files: []
|
163
318
|
|