chicken_soup 0.5.3 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +128 -9
- data/lib/chicken_soup/capabilities/apache/apache-checks.rb +2 -0
- data/lib/chicken_soup/capabilities/apache/apache-defaults.rb +16 -12
- data/lib/chicken_soup/capabilities/bundler/bundler-checks.rb +2 -0
- data/lib/chicken_soup/capabilities/bundler/bundler-defaults.rb +2 -0
- data/lib/chicken_soup/capabilities/bundler/bundler-tasks.rb +12 -9
- data/lib/chicken_soup/capabilities/git/git-checks.rb +21 -0
- data/lib/chicken_soup/capabilities/git/git-defaults.rb +1 -2
- data/lib/chicken_soup/capabilities/github/github-defaults.rb +23 -0
- data/lib/chicken_soup/capabilities/github/github-tasks.rb +14 -0
- data/lib/chicken_soup/capabilities/heroku/heroku-checks.rb +2 -0
- data/lib/chicken_soup/capabilities/heroku/heroku-defaults.rb +2 -0
- data/lib/chicken_soup/capabilities/mysql/mysql-checks.rb +32 -0
- data/lib/chicken_soup/capabilities/nginx/nginx-checks.rb +2 -0
- data/lib/chicken_soup/capabilities/nginx/nginx-defaults.rb +12 -8
- data/lib/chicken_soup/capabilities/postgres/postgres-checks.rb +13 -0
- data/lib/chicken_soup/capabilities/rvm/rvm-checks.rb +7 -5
- data/lib/chicken_soup/capabilities/rvm/rvm-defaults.rb +7 -3
- data/lib/chicken_soup/capabilities/rvm/rvm-tasks.rb +8 -4
- data/lib/chicken_soup/capabilities/shared/db-checks.rb +2 -0
- data/lib/chicken_soup/capabilities/shared/db-defaults.rb +2 -0
- data/lib/chicken_soup/capabilities/shared/db-tasks.rb +17 -11
- data/lib/chicken_soup/capabilities/shared/web_server-tasks.rb +2 -0
- data/lib/chicken_soup/capabilities/svn/svn-defaults.rb +2 -0
- data/lib/chicken_soup/capabilities/unix/unix-checks.rb +2 -0
- data/lib/chicken_soup/capabilities/unix/unix-defaults.rb +2 -0
- data/lib/chicken_soup/capabilities/unix/unix-tasks.rb +5 -8
- data/lib/chicken_soup/capabilities.rb +4 -2
- data/lib/chicken_soup/deploy.rb +0 -1
- data/lib/chicken_soup/environment/checks.rb +2 -0
- data/lib/chicken_soup/environment/defaults.rb +5 -0
- data/lib/chicken_soup/global.rb +182 -121
- data/lib/chicken_soup/notifiers/airbrake/airbrake-tasks.rb +21 -0
- data/lib/chicken_soup/notifiers/email/email-checks.rb +2 -0
- data/lib/chicken_soup/notifiers/email/email-defaults.rb +2 -0
- data/lib/chicken_soup/notifiers/email/email-tasks.rb +19 -11
- data/lib/chicken_soup/notifiers/email/presenter.rb +3 -2
- data/lib/chicken_soup/notifiers/git/git-tasks.rb +3 -4
- data/lib/chicken_soup/notifiers.rb +2 -0
- data/lib/chicken_soup/version.rb +1 -1
- metadata +7 -3
- data/lib/chicken_soup/notifiers/hoptoad/hoptoad-tasks.rb +0 -6
@@ -2,6 +2,8 @@
|
|
2
2
|
# UNIX SERVER DEFAULTS #
|
3
3
|
######################################################################
|
4
4
|
Capistrano::Configuration.instance(:must_exist).load do
|
5
|
+
extend ChickenSoup
|
6
|
+
|
5
7
|
namespace :capabilities do
|
6
8
|
namespace :defaults do
|
7
9
|
desc "[internal] Sets intelligent defaults for unix server deployments."
|
@@ -2,6 +2,8 @@
|
|
2
2
|
# UNIX TASKS #
|
3
3
|
######################################################################
|
4
4
|
Capistrano::Configuration.instance(:must_exist).load do
|
5
|
+
extend ChickenSoup
|
6
|
+
|
5
7
|
before "deploy:shared_files:symlink", "deploy:shared_files:setup"
|
6
8
|
|
7
9
|
namespace :deploy do
|
@@ -22,8 +24,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
22
24
|
If it finds it, it will upload the file or directory to the shared directory on
|
23
25
|
the server and rename it to the proper file name.
|
24
26
|
|
25
|
-
If it doesn't find it, it will check to see if the remote file exists
|
26
|
-
it will use whatever local file is available with that name.
|
27
|
+
If it doesn't find it, it will check to see if the remote file exists.
|
27
28
|
|
28
29
|
As a last resort, it will error out because the symlink task which follows will
|
29
30
|
fail due to the missing file.
|
@@ -36,18 +37,14 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
36
37
|
run "mkdir -p '#{shared_path}/#{base_dir_of_shared_file}'"
|
37
38
|
|
38
39
|
remote_shared_file = "#{shared_path}/#{shared_file}"
|
39
|
-
local_shared_file = "#{
|
40
|
+
local_shared_file = "#{rails_root}/#{shared_file}"
|
40
41
|
local_environment_specific_file = "#{local_shared_file}.#{rails_env}"
|
41
42
|
permissions = File.directory? local_shared_file ? "755" : "600"
|
42
43
|
|
43
44
|
if File.exists?(local_environment_specific_file)
|
44
45
|
top.upload(local_environment_specific_file, remote_shared_file, :mode => permissions)
|
45
46
|
elsif !remote_file_exists?(remote_shared_file)
|
46
|
-
|
47
|
-
top.upload(local_shared_file, remote_shared_file, :mode => permissions)
|
48
|
-
else
|
49
|
-
abort "I'm sorry Dave, but I couldn't find a local file or directory at '#{local_shared_file}' or '#{local_environment_specific_file}'"
|
50
|
-
end
|
47
|
+
abort "I'm sorry Dave, but I couldn't find a local file or directory at '#{local_environment_specific_file}' or on the remote server at '#{remote_shared_file}'"
|
51
48
|
end
|
52
49
|
end
|
53
50
|
end
|
@@ -14,9 +14,11 @@
|
|
14
14
|
#
|
15
15
|
######################################################################
|
16
16
|
Capistrano::Configuration.instance(:must_exist).load do
|
17
|
+
extend ChickenSoup
|
18
|
+
|
17
19
|
require 'chicken_soup/capabilities/defaults'
|
18
|
-
require
|
19
|
-
require
|
20
|
+
require 'chicken_soup/capabilities/checks'
|
21
|
+
require 'chicken_soup/capabilities/tasks'
|
20
22
|
|
21
23
|
['defaults', 'checks', 'tasks'].each do |method|
|
22
24
|
desc "[internal] This task is only here because `require` cannot be used within a `namespace`"
|
data/lib/chicken_soup/deploy.rb
CHANGED
@@ -15,6 +15,8 @@
|
|
15
15
|
#
|
16
16
|
######################################################################
|
17
17
|
Capistrano::Configuration.instance(:must_exist).load do
|
18
|
+
extend ChickenSoup
|
19
|
+
|
18
20
|
on :start, 'environment:variable:check', :except => ['staging', 'production']
|
19
21
|
before 'deploy', 'environment:deployment:check'
|
20
22
|
before 'deploy:cold', 'environment:deployment:check'
|
@@ -17,7 +17,11 @@
|
|
17
17
|
# The latter should be set in the application's deploy.rb file.
|
18
18
|
#
|
19
19
|
######################################################################
|
20
|
+
require 'etc'
|
21
|
+
|
20
22
|
Capistrano::Configuration.instance(:must_exist).load do
|
23
|
+
extend ChickenSoup
|
24
|
+
|
21
25
|
after 'production', 'environment:defaults:production', 'environment:init'
|
22
26
|
after 'staging', 'environment:defaults:staging', 'environment:init'
|
23
27
|
|
@@ -37,6 +41,7 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
37
41
|
|
38
42
|
desc "[internal] Sets intelligent common defaults for deployments"
|
39
43
|
task :default do
|
44
|
+
_cset :local_user, Etc.getlogin
|
40
45
|
_cset :use_sudo, false
|
41
46
|
_cset :default_shell, false
|
42
47
|
|
data/lib/chicken_soup/global.rb
CHANGED
@@ -1,137 +1,198 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
#
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
module ChickenSoup
|
2
|
+
###
|
3
|
+
# Helper method to close all session connections to the remote servers
|
4
|
+
#
|
5
|
+
def close_sessions
|
6
|
+
sessions.values.each { |session| session.close }
|
7
|
+
sessions.clear
|
8
|
+
end
|
8
9
|
|
9
|
-
###
|
10
|
-
# Forces all connections to switch to the user passed into it.
|
11
|
-
#
|
12
|
-
# It will forcibly terminate all open connections in order to accomplish this.
|
13
|
-
#
|
14
|
-
# @example Switch to the 'deploy' user:
|
15
|
-
# set_user_to 'deploy'
|
16
|
-
#
|
17
|
-
# @param [String] username The username you would like to begin using.
|
18
|
-
#
|
19
|
-
def set_user_to(username)
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
10
|
+
###
|
11
|
+
# Forces all connections to switch to the user passed into it.
|
12
|
+
#
|
13
|
+
# It will forcibly terminate all open connections in order to accomplish this.
|
14
|
+
#
|
15
|
+
# @example Switch to the 'deploy' user:
|
16
|
+
# set_user_to 'deploy'
|
17
|
+
#
|
18
|
+
# @param [String] username The username you would like to begin using.
|
19
|
+
#
|
20
|
+
def set_user_to(username)
|
21
|
+
close_sessions
|
22
|
+
set :user, username
|
23
|
+
set(:password) {Capistrano::CLI.password_prompt("#{username.capitalize}'s Password: ")}
|
24
|
+
set(:user_home) { user == "root" ? "/root" : "/home/#{username}" }
|
25
|
+
end
|
25
26
|
|
26
|
-
###
|
27
|
-
# Helper method to run tasks in different contexts.
|
28
|
-
#
|
29
|
-
# The workflow is as follows:
|
30
|
-
# * Current user is saved
|
31
|
-
# * User is switched to the desired username passed in via the :as option
|
32
|
-
# * The task is run
|
33
|
-
# * The user is switched back to the original user
|
34
|
-
#
|
35
|
-
# By default the task hooks are prepared but the task itself is not executed.
|
36
|
-
# You can change this by passing :now as an option.
|
37
|
-
#
|
38
|
-
# Running a task 'now' does not create hooks. Standard calls to the task will
|
39
|
-
# be executed via the current user.
|
40
|
-
#
|
41
|
-
# @example Always run the task to install gems as the 'manage' user:
|
42
|
-
# run_task 'gems:install', :as => 'manage'
|
43
|
-
# @example Run the db migration task now as the 'deploy' user:
|
44
|
-
# run_task 'db:migrate', :as => 'deploy', :now => true
|
45
|
-
#
|
46
|
-
# @param [String] task_name The name of the task to run.
|
47
|
-
# @param [Hash] options Options to customize how the task is run. Valid options are:
|
48
|
-
# @option options [Boolean] :now - If present, the task will be executed immediately.
|
49
|
-
# @option options [String] :as - The name of the user you wish the task to be executed as.
|
50
|
-
#
|
51
|
-
# @todo Remove all previous hooks prior to adding new ones. Also disable hooks when running "now"
|
52
|
-
#
|
53
|
-
def run_task(task_name, options = {})
|
54
|
-
|
27
|
+
###
|
28
|
+
# Helper method to run tasks in different contexts.
|
29
|
+
#
|
30
|
+
# The workflow is as follows:
|
31
|
+
# * Current user is saved
|
32
|
+
# * User is switched to the desired username passed in via the :as option
|
33
|
+
# * The task is run
|
34
|
+
# * The user is switched back to the original user
|
35
|
+
#
|
36
|
+
# By default the task hooks are prepared but the task itself is not executed.
|
37
|
+
# You can change this by passing :now as an option.
|
38
|
+
#
|
39
|
+
# Running a task 'now' does not create hooks. Standard calls to the task will
|
40
|
+
# be executed via the current user.
|
41
|
+
#
|
42
|
+
# @example Always run the task to install gems as the 'manage' user:
|
43
|
+
# run_task 'gems:install', :as => 'manage'
|
44
|
+
# @example Run the db migration task now as the 'deploy' user:
|
45
|
+
# run_task 'db:migrate', :as => 'deploy', :now => true
|
46
|
+
#
|
47
|
+
# @param [String] task_name The name of the task to run.
|
48
|
+
# @param [Hash] options Options to customize how the task is run. Valid options are:
|
49
|
+
# @option options [Boolean] :now - If present, the task will be executed immediately.
|
50
|
+
# @option options [String] :as - The name of the user you wish the task to be executed as.
|
51
|
+
#
|
52
|
+
# @todo Remove all previous hooks prior to adding new ones. Also disable hooks when running "now"
|
53
|
+
#
|
54
|
+
def run_task(task_name, options = {})
|
55
|
+
abort "#run_task must be passed an `:as` option so that it knows who to change the user to." unless options[:as]
|
55
56
|
|
56
|
-
|
57
|
+
original_username = exists?(:user) ? user : nil
|
57
58
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
59
|
+
if options[:now]
|
60
|
+
set_user_to options[:as]
|
61
|
+
find_and_execute_task(task_name)
|
62
|
+
set_user_to original_username
|
63
|
+
else
|
64
|
+
before task_name, "os:users:#{options[:as]}:use"
|
65
|
+
after task_name, "os:users:#{original_username}:use"
|
66
|
+
end
|
65
67
|
end
|
66
|
-
end
|
67
68
|
|
68
|
-
###
|
69
|
-
# Checks an array of items to see if they are currently set within the
|
70
|
-
# Capistrano scope. If any of them fail, Capistrano execution will terminate.
|
71
|
-
#
|
72
|
-
# @param [Array, #each] required_variables An iterable list of items which
|
73
|
-
# represent the names of Capistrano environment variables. Each item in this
|
74
|
-
# list is expected to be set.
|
75
|
-
#
|
76
|
-
# @raise [CapistranoGoBoom] Calls #abort on the Capistrano execution if any of
|
77
|
-
# the variables are not set.
|
78
|
-
#
|
79
|
-
# @example Using an array:
|
80
|
-
# verify_variables [:user, :deploy_base_dir, :app_server]
|
81
|
-
#
|
82
|
-
def verify_variables(required_variables)
|
83
|
-
|
84
|
-
|
69
|
+
###
|
70
|
+
# Checks an array of items to see if they are currently set within the
|
71
|
+
# Capistrano scope. If any of them fail, Capistrano execution will terminate.
|
72
|
+
#
|
73
|
+
# @param [Array, #each] required_variables An iterable list of items which
|
74
|
+
# represent the names of Capistrano environment variables. Each item in this
|
75
|
+
# list is expected to be set.
|
76
|
+
#
|
77
|
+
# @raise [CapistranoGoBoom] Calls #abort on the Capistrano execution if any of
|
78
|
+
# the variables are not set.
|
79
|
+
#
|
80
|
+
# @example Using an array:
|
81
|
+
# verify_variables [:user, :deploy_base_dir, :app_server]
|
82
|
+
#
|
83
|
+
def verify_variables(required_variables)
|
84
|
+
required_variables.each do |expected_variable|
|
85
|
+
abort( "You have not defined '#{expected_variable}' which is necessary for deployment." ) unless exists?(expected_variable)
|
86
|
+
end
|
85
87
|
end
|
86
|
-
end
|
87
88
|
|
88
|
-
###
|
89
|
-
# @note Taken directly from the Capistrano codebase.
|
90
|
-
#
|
91
|
-
# Sets a variable only if it doesn't already exist.
|
92
|
-
#
|
93
|
-
def _cset(name, *args, &block)
|
94
|
-
|
95
|
-
|
89
|
+
###
|
90
|
+
# @note Taken directly from the Capistrano codebase.
|
91
|
+
#
|
92
|
+
# Sets a variable only if it doesn't already exist.
|
93
|
+
#
|
94
|
+
def _cset(name, *args, &block)
|
95
|
+
unless exists?(name)
|
96
|
+
set(name, *args, &block)
|
97
|
+
end
|
96
98
|
end
|
97
|
-
end
|
98
99
|
|
99
|
-
###
|
100
|
-
# Runs a command on the remote server to see if the file currently exists.
|
101
|
-
#
|
102
|
-
# @param [String] file The filename (optionally including path), directory,
|
103
|
-
# or symlink that is may or may not exist.
|
104
|
-
#
|
105
|
-
# @return [Boolean] Whether or not the file, directory or symlink exists.
|
106
|
-
#
|
107
|
-
# @example File without path:
|
108
|
-
# remote_file_exists? 'server.log'
|
109
|
-
# @example File with path:
|
110
|
-
# remote_file_exists? '/var/www/myappdir/log/production.log'
|
111
|
-
# @example Directory:
|
112
|
-
# remote_file_exists? '/var/www/myappdir/log'
|
113
|
-
# @example Symbolic Link:
|
114
|
-
# remote_file_exists? '/var/www/myappdir/current'
|
115
|
-
#
|
116
|
-
def remote_file_exists?(file)
|
117
|
-
|
118
|
-
end
|
100
|
+
###
|
101
|
+
# Runs a command on the remote server to see if the file currently exists.
|
102
|
+
#
|
103
|
+
# @param [String] file The filename (optionally including path), directory,
|
104
|
+
# or symlink that is may or may not exist.
|
105
|
+
#
|
106
|
+
# @return [Boolean] Whether or not the file, directory or symlink exists.
|
107
|
+
#
|
108
|
+
# @example File without path:
|
109
|
+
# remote_file_exists? 'server.log'
|
110
|
+
# @example File with path:
|
111
|
+
# remote_file_exists? '/var/www/myappdir/log/production.log'
|
112
|
+
# @example Directory:
|
113
|
+
# remote_file_exists? '/var/www/myappdir/log'
|
114
|
+
# @example Symbolic Link:
|
115
|
+
# remote_file_exists? '/var/www/myappdir/current'
|
116
|
+
#
|
117
|
+
def remote_file_exists?(file)
|
118
|
+
capture("if [[ -d #{file} ]] || [[ -h #{file} ]] || [[ -f #{file} ]]; then echo -n 'exists'; fi;") == "exists"
|
119
|
+
end
|
119
120
|
|
120
|
-
|
121
|
-
require file if
|
122
|
-
|
121
|
+
###
|
122
|
+
# Will require a file but will not throw an error if that file does not
|
123
|
+
# exist.
|
124
|
+
#
|
125
|
+
# @param [String] file The filename (optionally including path), directory,
|
126
|
+
# or symlink that is may or may not exist.
|
127
|
+
#
|
128
|
+
# @return [nil] nil will be returned if the file was loaded successfully.
|
129
|
+
#
|
130
|
+
# @example
|
131
|
+
# require_if_exists 'my_library'
|
132
|
+
#
|
133
|
+
def require_if_exists(file)
|
134
|
+
require file if File.exists?(File.join(File.dirname(__FILE__), '..', "#{file}.rb"))
|
135
|
+
end
|
123
136
|
|
124
|
-
|
125
|
-
|
126
|
-
|
137
|
+
###
|
138
|
+
# Compresses a specific remote file before transferring it to the local
|
139
|
+
# machine. Once the transfer is completed, the file will be uncompressed
|
140
|
+
# and the compressed version will be deleted.
|
141
|
+
#
|
142
|
+
# @param [String] remote The remote filename (optionally including path),
|
143
|
+
# or directory that you would like to transfer.
|
144
|
+
#
|
145
|
+
# @param [String] local The location locally where you would like the file
|
146
|
+
# or directory to be transferred.
|
147
|
+
#
|
148
|
+
# @param [String] options Any options that can be passed to Capistrano's
|
149
|
+
# #download method.
|
150
|
+
#
|
151
|
+
# @example
|
152
|
+
# download_compressed 'my/remote/file', 'my/local/file', :once => true
|
153
|
+
#
|
154
|
+
def download_compressed(remote, local, options = {})
|
155
|
+
remote_compressed_filename = "#{remote}.bz2"
|
156
|
+
local_compressed_filename = "#{local}.bz2"
|
127
157
|
|
128
|
-
|
129
|
-
|
158
|
+
run "bzip2 -zvck9 #{remote} > #{remote_compressed_filename}"
|
159
|
+
download remote_compressed_filename, local_compressed_filename, options
|
130
160
|
|
131
|
-
|
132
|
-
|
133
|
-
end
|
161
|
+
run "rm -f #{remote_compressed_filename}"
|
162
|
+
`bunzip2 -f #{local_compressed_filename} && rm -f #{local_compressed_filename}`
|
163
|
+
end
|
164
|
+
|
165
|
+
###
|
166
|
+
# A stub method which simply passes through to Capistrano's #run. This
|
167
|
+
# method is meant to be overridden when a Ruby manager capability (ie RVM)
|
168
|
+
# is installed.
|
169
|
+
#
|
170
|
+
# @param [String] ruby_version This is simply a noop on this method. It
|
171
|
+
# is not used. It is instead intended to be used with the Ruby manager
|
172
|
+
# that is installed.
|
173
|
+
#
|
174
|
+
# @param [String] command The command that is passed to #run
|
175
|
+
#
|
176
|
+
# @param [String] options Any options that can be passed to Capistrano's
|
177
|
+
# #run method.
|
178
|
+
#
|
179
|
+
# @example
|
180
|
+
# run_with_ruby_manager 'foo', 'gem list', :pty => false
|
181
|
+
#
|
182
|
+
def run_with_ruby_manager(ruby_version, command, options = {})
|
183
|
+
run command, options
|
184
|
+
end
|
134
185
|
|
135
|
-
|
136
|
-
nil
|
186
|
+
###
|
187
|
+
# A stub method which simply returns nil. It is meant to be overridden
|
188
|
+
# when a version control capability (ie Git) is installed.
|
189
|
+
#
|
190
|
+
# @return [nil] Always returns nil
|
191
|
+
#
|
192
|
+
# @example
|
193
|
+
# run_with_ruby_manager 'foo', 'gem list', :pty => false
|
194
|
+
#
|
195
|
+
def vc_log
|
196
|
+
nil
|
197
|
+
end
|
137
198
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
######################################################################
|
2
|
+
# AIRBRAKE NOTIFIER TASKS #
|
3
|
+
######################################################################
|
4
|
+
Capistrano::Configuration.instance(:must_exist).load do
|
5
|
+
after "deploy", "notify:via_airbrake"
|
6
|
+
|
7
|
+
namespace :notify do
|
8
|
+
desc <<-DESC
|
9
|
+
[internal] Sends Airbrake information regarding the deployment.
|
10
|
+
If you have a paid version of Airbrake, it will resolve all of
|
11
|
+
your errors.
|
12
|
+
DESC
|
13
|
+
task :via_airbrake, :except => { :no_release => true } do
|
14
|
+
notify_command = "rake hoptoad:deploy TO=#{rails_env} REVISION=#{current_revision} REPO=#{repository} USER=#{local_user}"
|
15
|
+
notify_command << " DRY_RUN=true" if dry_run
|
16
|
+
notify_command << " API_KEY=#{ENV['API_KEY']}" if ENV['API_KEY']
|
17
|
+
|
18
|
+
`#{notify_command}`
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -4,7 +4,7 @@
|
|
4
4
|
require 'mail'
|
5
5
|
|
6
6
|
Capistrano::Configuration.instance(:must_exist).load do |cap|
|
7
|
-
after 'deploy
|
7
|
+
after 'deploy', 'notify:via_email'
|
8
8
|
|
9
9
|
namespace :notify do
|
10
10
|
desc <<-DESC
|
@@ -16,20 +16,28 @@ Capistrano::Configuration.instance(:must_exist).load do |cap|
|
|
16
16
|
end
|
17
17
|
|
18
18
|
if !cap[:email_notifier_client_recipients].empty?
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
begin
|
20
|
+
Mail.deliver do
|
21
|
+
to cap[:email_notifier_client_recipients]
|
22
|
+
from cap[:email_notifier_sender]
|
23
|
+
subject cap[:email_notifier_subject]
|
24
|
+
body cap[:email_notifier_client_body]
|
25
|
+
end
|
26
|
+
rescue
|
27
|
+
puts "I'm sorry Dave, but I couldn't contact the mail server. The client email notifications you requested have not been sent"
|
24
28
|
end
|
25
29
|
end
|
26
30
|
|
27
31
|
if !cap[:email_notifier_internal_recipients].empty?
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
32
|
+
begin
|
33
|
+
Mail.deliver do
|
34
|
+
to cap[:email_notifier_internal_recipients]
|
35
|
+
from cap[:email_notifier_sender]
|
36
|
+
subject cap[:email_notifier_subject]
|
37
|
+
body cap[:email_notifier_internal_body]
|
38
|
+
end
|
39
|
+
rescue
|
40
|
+
puts "I'm sorry Dave, but I couldn't contact the mail server. The email notifications to the development team you requested have not been sent"
|
33
41
|
end
|
34
42
|
end
|
35
43
|
end
|
@@ -1,9 +1,10 @@
|
|
1
|
-
require 'etc'
|
2
1
|
require 'time'
|
3
2
|
|
4
3
|
module ChickenSoup
|
5
4
|
module Email
|
6
5
|
class Presenter
|
6
|
+
include ChickenSoup
|
7
|
+
|
7
8
|
LongDateFormat = "%A, %B %e, %Y at %l:%M%p %Z"
|
8
9
|
|
9
10
|
def initialize(capistrano)
|
@@ -19,7 +20,7 @@ module ChickenSoup
|
|
19
20
|
end
|
20
21
|
|
21
22
|
def deployed_by
|
22
|
-
|
23
|
+
@capistrano[:local_user]
|
23
24
|
end
|
24
25
|
|
25
26
|
def deploy_date_in_long_format
|
@@ -8,7 +8,7 @@ module ChickenSoup
|
|
8
8
|
end
|
9
9
|
|
10
10
|
Capistrano::Configuration.instance(:must_exist).load do
|
11
|
-
after 'deploy
|
11
|
+
after 'deploy', 'notify:via_git:tag'
|
12
12
|
|
13
13
|
namespace :notify do
|
14
14
|
namespace :via_git do
|
@@ -19,10 +19,9 @@ Capistrano::Configuration.instance(:must_exist).load do
|
|
19
19
|
Tag push happens in the background so it won't slow down deployment.
|
20
20
|
DESC
|
21
21
|
task :tag do
|
22
|
-
|
23
|
-
tag_name = "deployed_to_#{rails_env}_#{timestamp_string_without_seconds}"
|
22
|
+
tag_name = "deployment/#{rails_env}/#{current_release}"
|
24
23
|
|
25
|
-
`git tag -a -m "Tagging deploy to #{rails_env} at #{
|
24
|
+
`git tag -a -m "Tagging deploy to #{rails_env} at #{current_release}" #{tag_name} #{branch}`
|
26
25
|
`git push #{remote} --tags > /dev/null 2>&1 &`
|
27
26
|
`git push origin --tags > /dev/null 2>&1 &`
|
28
27
|
end
|
@@ -2,6 +2,8 @@
|
|
2
2
|
# NOTIFIERS SETUP #
|
3
3
|
######################################################################
|
4
4
|
Capistrano::Configuration.instance(:must_exist).load do
|
5
|
+
extend ChickenSoup
|
6
|
+
|
5
7
|
require 'chicken_soup/notifiers/defaults'
|
6
8
|
require "chicken_soup/notifiers/checks"
|
7
9
|
require "chicken_soup/notifiers/tasks"
|
data/lib/chicken_soup/version.rb
CHANGED
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: chicken_soup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.6.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- thekompanee
|
@@ -11,7 +11,7 @@ autorequire:
|
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
13
|
|
14
|
-
date: 2011-08-
|
14
|
+
date: 2011-08-11 00:00:00 -05:00
|
15
15
|
default_executable:
|
16
16
|
dependencies:
|
17
17
|
- !ruby/object:Gem::Dependency
|
@@ -96,10 +96,14 @@ files:
|
|
96
96
|
- lib/chicken_soup/capabilities/bundler/bundler-tasks.rb
|
97
97
|
- lib/chicken_soup/capabilities/checks.rb
|
98
98
|
- lib/chicken_soup/capabilities/defaults.rb
|
99
|
+
- lib/chicken_soup/capabilities/git/git-checks.rb
|
99
100
|
- lib/chicken_soup/capabilities/git/git-defaults.rb
|
101
|
+
- lib/chicken_soup/capabilities/github/github-defaults.rb
|
102
|
+
- lib/chicken_soup/capabilities/github/github-tasks.rb
|
100
103
|
- lib/chicken_soup/capabilities/heroku/heroku-checks.rb
|
101
104
|
- lib/chicken_soup/capabilities/heroku/heroku-defaults.rb
|
102
105
|
- lib/chicken_soup/capabilities/heroku/heroku-tasks.rb
|
106
|
+
- lib/chicken_soup/capabilities/mysql/mysql-checks.rb
|
103
107
|
- lib/chicken_soup/capabilities/mysql/mysql-tasks.rb
|
104
108
|
- lib/chicken_soup/capabilities/nginx/nginx-checks.rb
|
105
109
|
- lib/chicken_soup/capabilities/nginx/nginx-defaults.rb
|
@@ -129,6 +133,7 @@ files:
|
|
129
133
|
- lib/chicken_soup/environment/tasks.rb
|
130
134
|
- lib/chicken_soup/global.rb
|
131
135
|
- lib/chicken_soup/notifiers.rb
|
136
|
+
- lib/chicken_soup/notifiers/airbrake/airbrake-tasks.rb
|
132
137
|
- lib/chicken_soup/notifiers/checks.rb
|
133
138
|
- lib/chicken_soup/notifiers/defaults.rb
|
134
139
|
- lib/chicken_soup/notifiers/email/email-checks.rb
|
@@ -136,7 +141,6 @@ files:
|
|
136
141
|
- lib/chicken_soup/notifiers/email/email-tasks.rb
|
137
142
|
- lib/chicken_soup/notifiers/email/presenter.rb
|
138
143
|
- lib/chicken_soup/notifiers/git/git-tasks.rb
|
139
|
-
- lib/chicken_soup/notifiers/hoptoad/hoptoad-tasks.rb
|
140
144
|
- lib/chicken_soup/notifiers/tasks.rb
|
141
145
|
- lib/chicken_soup/templates/client_email.html.erb
|
142
146
|
- lib/chicken_soup/templates/internal_email.html.erb
|
@@ -1,6 +0,0 @@
|
|
1
|
-
######################################################################
|
2
|
-
# HOPTOAD NOTIFIER TASKS #
|
3
|
-
######################################################################
|
4
|
-
Capistrano::Configuration.instance(:must_exist).load do
|
5
|
-
# require 'hoptoad_notifier/capistrano'
|
6
|
-
end
|