tdd_deploy 0.1.9 → 0.1.10
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/Gemfile +3 -0
- data/bin/tdd_deploy_context +3 -3
- data/lib/tdd_deploy/copy_methods.rb +19 -4
- data/lib/tdd_deploy/deploy_test_methods.rb +1 -1
- data/lib/tdd_deploy/environ.rb +13 -9
- data/lib/tdd_deploy/host_tests/remote_ip_tables.rb +7 -2
- data/lib/tdd_deploy/installer.rb +1 -1
- data/lib/tdd_deploy/server-templates/test_results.html.erb +2 -2
- data/lib/tdd_deploy/site-erb/app_hosts/config/one_thin_server.conf.erb +1 -3
- data/lib/tdd_deploy/site-erb/app_hosts/config/thin.conf.erb +2 -2
- data/lib/tdd_deploy/site-erb/app_hosts/site/monitrc.erb +4 -4
- data/lib/tdd_deploy/site-erb/app_hosts/site/one_thin_server.erb +27 -3
- data/lib/tdd_deploy/site-erb/balance_hosts/site/monitrc.erb +1 -11
- data/lib/tdd_deploy/site-erb/balance_hosts/site/nginx.conf.erb +14 -16
- data/lib/tdd_deploy/site-erb/web_hosts/site/monitrc.erb +1 -11
- data/lib/tdd_deploy/site-erb/web_hosts/site/nginx.conf.erb +32 -17
- data/lib/tdd_deploy/site_tests/site_layout.rb +9 -4
- data/lib/tdd_deploy/version.rb +1 -1
- data/tests/test_copy_methods.rb +9 -1
- data/tests/test_environ.rb +9 -7
- data/tests/test_site_layout.rb +7 -3
- metadata +13 -16
- data/lib/tdd_deploy/site-erb/balance_hosts/config/one_thin_server.conf.erb +0 -14
- data/lib/tdd_deploy/site-erb/balance_hosts/config/thin.conf.erb +0 -14
- data/lib/tdd_deploy/site-erb/balance_hosts/site/one_thin_server.erb +0 -6
data/Gemfile
CHANGED
data/bin/tdd_deploy_context
CHANGED
@@ -51,7 +51,7 @@ class TddDeployEnv
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def save
|
54
|
-
if self.modified?
|
54
|
+
if self.modified? || !File.exists?(TddDeploy::Environ::ENV_FNAME)
|
55
55
|
self.flash = 'Updates Saved'
|
56
56
|
self.save_env
|
57
57
|
end
|
@@ -60,13 +60,13 @@ class TddDeployEnv
|
|
60
60
|
|
61
61
|
def parse_cmd(cmd)
|
62
62
|
puts cmd
|
63
|
-
unless cmd =~ /^\s*(\w+)(\s+.*?)
|
63
|
+
unless cmd =~ /^\s*(\w+)(\s+.*?)?\s*$/i
|
64
64
|
self.flash = "unable to parse command: '#{cmd}'" unless cmd.strip.empty?
|
65
65
|
return
|
66
66
|
end
|
67
67
|
|
68
68
|
key_prefix = $1
|
69
|
-
param_value = $2.strip
|
69
|
+
param_value = $2.nil? ? '' : $2.strip
|
70
70
|
|
71
71
|
key_regx = Regexp.new('^' + key_prefix, Regexp::IGNORECASE)
|
72
72
|
matching_keys = self.env_types.keys.select { |k| key_regx.match(k) }
|
@@ -74,6 +74,7 @@ module TddDeploy
|
|
74
74
|
|
75
75
|
#single host methods
|
76
76
|
|
77
|
+
# options are passed to Net::SFTP process. :permissions default to 0755
|
77
78
|
def mkdir_on_remote_as userid, host, dir, options = {}
|
78
79
|
result = nil
|
79
80
|
options[:permissions] = 0755 unless options.include? :permissions
|
@@ -96,7 +97,7 @@ module TddDeploy
|
|
96
97
|
sftp.close! handle
|
97
98
|
end
|
98
99
|
end
|
99
|
-
result
|
100
|
+
! result.nil?
|
100
101
|
end
|
101
102
|
|
102
103
|
def copy_string_to_remote_file_as userid, host, str, dst
|
@@ -106,21 +107,35 @@ module TddDeploy
|
|
106
107
|
f.write str
|
107
108
|
end
|
108
109
|
end
|
109
|
-
result
|
110
|
+
! result.nil?
|
110
111
|
end
|
111
112
|
|
112
113
|
def append_file_to_remote_file_as(userid, host, src, dst)
|
113
114
|
raise ::ArgumentError.new("file name cannot be empty") if src.empty?
|
114
115
|
raise ::RuntimeError.new("unable to copy #{src} to #{userid}@#{host}: #{src} not found") unless File.exists? src
|
116
|
+
|
117
|
+
f = File.new(src)
|
118
|
+
file_mode = f.stat.mode & 0777
|
115
119
|
|
116
|
-
append_string_to_remote_file_as
|
120
|
+
if (result = append_string_to_remote_file_as(userid, host, f.read, dst))
|
121
|
+
stdout, stderr, cmd = run_on_a_host_as(userid, host, "chmod 0#{sprintf('%o', file_mode)} #{dst}")
|
122
|
+
result &= stderr.nil?
|
123
|
+
end
|
124
|
+
result
|
117
125
|
end
|
118
126
|
|
119
127
|
def copy_file_to_remote_as(userid, host, src, dst)
|
120
128
|
raise ::ArgumentError.new("file name cannot be empty") if src.empty?
|
121
129
|
raise ::RuntimeError.new("unable to copy #{src} to #{userid}@#{host}: #{src} not found") unless File.exists? src
|
122
130
|
|
123
|
-
|
131
|
+
f = File.new(src)
|
132
|
+
file_mode = f.stat.mode & 0777
|
133
|
+
|
134
|
+
if (result = copy_string_to_remote_file_as(userid, host, f.read, dst))
|
135
|
+
stdout, stderr, cmd = run_on_a_host_as(userid, host, "chmod 0#{sprintf('%o', file_mode)} #{dst}")
|
136
|
+
result &= stderr.nil?
|
137
|
+
end
|
138
|
+
result
|
124
139
|
end
|
125
140
|
end
|
126
141
|
end
|
@@ -22,7 +22,7 @@ module TddDeploy
|
|
22
22
|
def deploy_test_process_running_on_hosts_as(userid, host_list, pid_file_path, success_msg = nil)
|
23
23
|
host_list = rationalize_host_list(host_list)
|
24
24
|
success_msg ||= "Process associated with #{pid_file_path} should be running"
|
25
|
-
ret = deploy_test_file_exists_on_hosts_as(userid, host_list, pid_file_path, success_msg + "
|
25
|
+
ret = deploy_test_file_exists_on_hosts_as(userid, host_list, pid_file_path, success_msg + " based on pid file: #{pid_file_path}") ||
|
26
26
|
ret &= deploy_test_on_hosts_as(userid, host_list, /.+\n\s*\d+.*?\d\d:\d\d:\d\d/, "Process for #{pid_file_path} is running") do
|
27
27
|
"ps -p `cat #{pid_file_path} | awk '{ print $1 ; exit }'`"
|
28
28
|
end
|
data/lib/tdd_deploy/environ.rb
CHANGED
@@ -31,6 +31,7 @@ module TddDeploy
|
|
31
31
|
# * 'local_admin' - user name of on local hosts which can ssh into remote hosts via public key authentication
|
32
32
|
# * 'local_admin_email' - email of local admin who should receive monitoring emails
|
33
33
|
# * 'site' - name of site This should satisfy /[a-z][a-z0-9_]*.
|
34
|
+
# * 'site_app_root' - the absolute path to DocumentRoot for the site
|
34
35
|
# * 'site_doc_root' - the absolute path to DocumentRoot for the site
|
35
36
|
# * 'site_special_dir' - absolute path to site special directory - for system configuration fragments, commands, etc
|
36
37
|
# * 'site_url' - the url for the site (w/o scheme - as in 'www.foo.com')
|
@@ -48,7 +49,7 @@ module TddDeploy
|
|
48
49
|
# * 'capfile_paths' - relative paths to capistrano recipe files. Defaults to './config/deploy.rb'
|
49
50
|
#
|
50
51
|
# === Pseudo Variables
|
51
|
-
# * 'hosts' - list of all hosts - always returns balance_hosts + db_hosts + web_hosts.
|
52
|
+
# * 'hosts' - list of all hosts - always returns app_hosts + balance_hosts + db_hosts + web_hosts.
|
52
53
|
#may be assigned to if all three host lists are identical, otherwise raises an exception.
|
53
54
|
#'tdd_deploy_context' hides it from view unless it can be assigned
|
54
55
|
# * 'app' - list of all hosts in the :app role of the Capistrano recipes
|
@@ -113,6 +114,7 @@ module TddDeploy
|
|
113
114
|
'site' => :string,
|
114
115
|
'site_url' => :string,
|
115
116
|
'site_aliases' => :string,
|
117
|
+
'site_app_root' => :string,
|
116
118
|
'site_doc_root' => :string,
|
117
119
|
'site_special_dir' => :string,
|
118
120
|
'site_user' => :string,
|
@@ -142,7 +144,8 @@ module TddDeploy
|
|
142
144
|
'site' => 'name of site - will be the name of the deployment directory - as in /home/user/site/',
|
143
145
|
'site_url' => 'the site url - www.foo.com',
|
144
146
|
'site_aliases' => 'all the site aliases we need to put in nginx/apache configuration fragments',
|
145
|
-
'
|
147
|
+
'site_app_root' => 'this is the root of the current app. probably /home/site_user/site/current',
|
148
|
+
'site_doc_root' => 'this is DocumentRoot for the site. probably /home/site_user/site/current/public',
|
146
149
|
'site_special_dir' => 'directory for monitrc, nginx config fragments, monit commands, etc',
|
147
150
|
'site_user' => 'userid that the app lives in. This need not be host_admin. It\' separate so multiple sites can live on the same host',
|
148
151
|
|
@@ -171,7 +174,8 @@ module TddDeploy
|
|
171
174
|
'site' => "site",
|
172
175
|
'site_url' => 'www.site.com', # don't include the scheme
|
173
176
|
'site_aliases' => '',
|
174
|
-
'
|
177
|
+
'site_app_root' => '/home/site_user/site/current',
|
178
|
+
'site_doc_root' => '/home/site_user/site/current/public', # default for Capistrano
|
175
179
|
'site_special_dir' => '/home/site_user/site_special',
|
176
180
|
'site_user' => "site_user",
|
177
181
|
|
@@ -179,7 +183,7 @@ module TddDeploy
|
|
179
183
|
|
180
184
|
# 'hosts' => "bar,foo",
|
181
185
|
'app_hosts' => 'arch',
|
182
|
-
'balance_hosts' => '
|
186
|
+
'balance_hosts' => '',
|
183
187
|
'db_hosts' => 'arch',
|
184
188
|
'web_hosts' => 'arch',
|
185
189
|
}
|
@@ -211,12 +215,12 @@ module TddDeploy
|
|
211
215
|
when :pseudo then
|
212
216
|
if k == 'hosts'
|
213
217
|
if (tmp = DataCache.env_hash['web_hosts']) == DataCache.env_hash['db_hosts'] \
|
214
|
-
&&
|
218
|
+
&& [] == DataCache.env_hash['balance_hosts'] \
|
215
219
|
&& tmp == DataCache.env_hash['app_hosts']
|
216
220
|
DataCache.env_hash['web_hosts'] =
|
217
221
|
DataCache.env_hash['db_hosts'] =
|
218
|
-
DataCache.env_hash['
|
219
|
-
|
222
|
+
DataCache.env_hash['app_hosts'] = self.str_to_list(v)
|
223
|
+
DataCache.env_hash['balance_hosts'] = []
|
220
224
|
else
|
221
225
|
raise ::RuntimeError.new("#{self}#reset_env(): Cannot assign value to 'hosts' if web_hosts &/or db_hosts already set.\n web_hosts: #{DataCache.env_hash['web_hosts']}\n db_hosts: #{DataCache.env_hash['db_hosts']}")
|
222
226
|
# raise RuntimeError.new("Cannot change hosts key if web_hosts != db_hosts")
|
@@ -382,8 +386,8 @@ module TddDeploy
|
|
382
386
|
if (self.web_hosts.nil? && self.db_hosts.nil?) || self.web_hosts == self.db_hosts
|
383
387
|
self.web_hosts =
|
384
388
|
self.db_hosts =
|
385
|
-
self.
|
386
|
-
|
389
|
+
self.app_hosts = self.str_to_list(list)
|
390
|
+
self.balance_hosts = []
|
387
391
|
else
|
388
392
|
raise ::RuntimeError.new("Cannot assign value to 'hosts' if web_hosts &/or db_hosts already set.\n web_hosts: #{self.web_hosts}\n db_hosts: #{self.db_hosts}")
|
389
393
|
end
|
@@ -9,14 +9,19 @@ module TddDeploy
|
|
9
9
|
class RemoteIpTables < TddDeploy::TestBase
|
10
10
|
# tcp_some_blocked_ports - checks TCP ports
|
11
11
|
def tcp_some_blocked_ports
|
12
|
+
@port_to_check ||= [20, 23, 25, 53, 5432, 2812]
|
12
13
|
self.hosts.each do |host|
|
14
|
+
result = true
|
13
15
|
# Linode seems to refuse to block 21 - FTP control
|
14
16
|
# [20, 21, 23, 25, 53, 5432, 2812].each do |port|
|
15
17
|
if self.ping_host(host)
|
16
|
-
|
18
|
+
@port_to_check.each do |port|
|
17
19
|
tcp_socket = TCPSocket.new(host, port) rescue 'failed'
|
18
|
-
|
20
|
+
unless tcp_socket == 'failed'
|
21
|
+
result &= fail host, "Host: #{host}: iptables test: Should not be able to connect via tcp to port #{port}"
|
22
|
+
end
|
19
23
|
end
|
24
|
+
pass host, "tcp ports #{@port_to_check.join(',')} blocked"
|
20
25
|
else
|
21
26
|
fail host, "Host: #{host}: iptables cannot be tested - host does not respond to ping"
|
22
27
|
end
|
data/lib/tdd_deploy/installer.rb
CHANGED
@@ -109,10 +109,10 @@ end
|
|
109
109
|
<td><a href="/?install_special">Site Specials</a></td>
|
110
110
|
<td><a href="/?install_configs">Site Config</a></td>
|
111
111
|
</tr>
|
112
|
-
<tr class="<%= even_odd %>">
|
112
|
+
<!-- <tr class="<%= even_odd %>">
|
113
113
|
<th>Capistrano</th>
|
114
114
|
<td><a href="/?run_cap_deploy">run cap deploy:update</a></td>
|
115
|
-
</tr>
|
115
|
+
</tr> -->
|
116
116
|
</table>
|
117
117
|
</div> <!-- test summary -->
|
118
118
|
|
@@ -1,10 +1,10 @@
|
|
1
|
-
chdir: <%=
|
1
|
+
chdir: <%= site_app_root %>
|
2
2
|
environment: production
|
3
3
|
address: 127.0.0.1
|
4
4
|
port: <%= site_base_port %>
|
5
5
|
timeout: 30
|
6
6
|
log: log/thin.log
|
7
|
-
pid: <%=
|
7
|
+
pid: <%= site_app_root %>/tmp/pids/thin.pid
|
8
8
|
max_conns: 1024
|
9
9
|
max_persistent_conns: 512
|
10
10
|
require: []
|
@@ -1,11 +1,11 @@
|
|
1
1
|
<% ((site_base_port)...(site_base_port+site_num_servers)).each do |port| %>
|
2
|
-
check process <%= site %>_server_<%= port %> with pidfile <%= "#{
|
3
|
-
start
|
4
|
-
stop
|
2
|
+
check process <%= site %>_server_<%= port %> with pidfile <%= "#{site_app_root}/tmp/pids/thin.#{port}.pid" %>
|
3
|
+
start program = "/bin/su -c '<%= "#{site_special_dir}/one_thin_server start #{port}" %>' -l <%= site_user %>" with timeout 60 seconds
|
4
|
+
stop program = "/bin/su -c '<%= "#{site_special_dir}/one_thin_server stop #{port}" %>' -l <%= site_user %>"
|
5
5
|
if failed host localhost port <%= port %> protocol http
|
6
6
|
and request "/"
|
7
7
|
then restart
|
8
8
|
if 3 restarts within 5 cycles then timeout
|
9
9
|
group server
|
10
10
|
|
11
|
-
<% end %>
|
11
|
+
<% end %>
|
@@ -1,6 +1,30 @@
|
|
1
1
|
#! /bin/sh
|
2
|
+
# must have perms 0755
|
2
3
|
|
3
|
-
|
4
|
+
USEAGE="Usage: `basename $0` <stop | start> <port>"
|
4
5
|
|
5
|
-
|
6
|
-
|
6
|
+
source "$HOME/.rvm/scripts/rvm"
|
7
|
+
|
8
|
+
case $# in
|
9
|
+
2) CMD=$1 ; PORT=$2 ;;
|
10
|
+
*) echo $USEAGE ; exit 1;;
|
11
|
+
esac
|
12
|
+
|
13
|
+
cd <%= site_app_root %>
|
14
|
+
case $CMD in
|
15
|
+
start)
|
16
|
+
bundle exec thin \
|
17
|
+
--config <%= site_app_root %>/config/one_thin_server.conf \
|
18
|
+
--environment production \
|
19
|
+
--log <%= site_app_root %>/log/thin.${PORT}.log \
|
20
|
+
--pid <%= site_app_root %>/tmp/pids/thin.${PORT}.pid \
|
21
|
+
--port $PORT \
|
22
|
+
start
|
23
|
+
;;
|
24
|
+
stop)
|
25
|
+
test -s ./tmp/pids/thin.${PORT}.pid && /bin/kill `cat ./tmp/pids/thin.${PORT}.pid`
|
26
|
+
;;
|
27
|
+
*)
|
28
|
+
echo $USAGE ; exit 1
|
29
|
+
;;
|
30
|
+
esac
|
@@ -1,11 +1 @@
|
|
1
|
-
|
2
|
-
check process <%= site %>_server_<%= port %> with pidfile <%= "#{site_doc_root}/tmp/pids/thin.#{port}.pid" %>
|
3
|
-
start process = "<%= "#{site_doc_root}/site/thin_one_server start #{port}" %>" with timeout 60 seconds
|
4
|
-
stop process = "<%= "#{site_doc_root}/site/thin_one_server stop #{port}" %>"
|
5
|
-
if failed host localhost port <%= port %> protocol http
|
6
|
-
and request "/"
|
7
|
-
then restart
|
8
|
-
if 3 restarts within 5 cycles then timeout
|
9
|
-
group server
|
10
|
-
|
11
|
-
<% end %>
|
1
|
+
# Empty monitrc fragment
|
@@ -1,29 +1,27 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
#
|
2
|
+
# balance_host config fragment for <%= site %>
|
3
|
+
#
|
4
4
|
upstream <%= site %> {
|
5
|
-
<%
|
6
|
-
server
|
5
|
+
<% web_hosts.each do |host| %>
|
6
|
+
server <%= host %>;
|
7
7
|
<% end %>
|
8
8
|
}
|
9
9
|
server {
|
10
10
|
listen 80;
|
11
|
-
server_name <%= site_url %>;
|
12
|
-
root <%= site_doc_root %>/current;
|
11
|
+
server_name <%= site_url %> <%= site_aliases %>;
|
13
12
|
location / {
|
13
|
+
# proxy configuration - customarily offloaded to an include file
|
14
14
|
proxy_set_header X-Real-IP $remote_addr;
|
15
15
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
16
16
|
proxy_set_header Host $http_host;
|
17
17
|
proxy_redirect false;
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
18
|
+
client_max_body_size 10m;
|
19
|
+
client_body_buffer_size 128k;
|
20
|
+
proxy_connect_timeout 90;
|
21
|
+
proxy_send_timeout 90;
|
22
|
+
proxy_read_timeout 90;
|
23
|
+
proxy_buffers 32 4k;
|
24
24
|
|
25
|
-
|
26
|
-
location = /500.html {
|
27
|
-
root html;
|
25
|
+
proxy_pass http://<%= site %>;
|
28
26
|
}
|
29
27
|
}
|
@@ -1,11 +1 @@
|
|
1
|
-
|
2
|
-
check process <%= site %>_server_<%= port %> with pidfile <%= "#{site_doc_root}/tmp/pids/thin.#{port}.pid" %>
|
3
|
-
start process = "<%= "#{site_doc_root}/site/thin_one_server start #{port}" %>" with timeout 60 seconds
|
4
|
-
stop process = "<%= "#{site_doc_root}/site/thin_one_server stop #{port}" %>"
|
5
|
-
if failed host localhost port <%= port %> protocol http
|
6
|
-
and request "/"
|
7
|
-
then restart
|
8
|
-
if 3 restarts within 5 cycles then timeout
|
9
|
-
group server
|
10
|
-
|
11
|
-
<% end %>
|
1
|
+
# Empty monitrc config fragment
|
@@ -1,29 +1,44 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
1
|
+
#
|
2
|
+
# web_host config fragment for <%= site %>
|
3
|
+
#
|
4
4
|
upstream <%= site %> {
|
5
|
+
# backend servers
|
5
6
|
<% ((site_base_port)...(site_base_port+site_num_servers)).each do |port| %>
|
6
7
|
server 127.0.0.1:<%= port %>;
|
7
8
|
<% end %>
|
8
9
|
}
|
9
10
|
server {
|
10
11
|
listen 80;
|
11
|
-
server_name <%= site_url %>;
|
12
|
-
|
12
|
+
server_name <%= site_url %> <%= site_aliases %>;
|
13
|
+
|
14
|
+
root <%= site_doc_root %>;
|
15
|
+
|
16
|
+
access_log <%= site_app_root %>/log/<%= site %>.access.log;
|
17
|
+
error_log <%= site_app_root %>/log/<%= site %>.error.log debug;
|
18
|
+
# access_log /etc/nginx/logs/<%= site %>.access.log;
|
19
|
+
# error_log /etc/nginx/logs/<%= site %>.error.log debug;
|
20
|
+
|
13
21
|
location / {
|
14
|
-
|
15
|
-
|
16
|
-
proxy_set_header
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
proxy_pass http://<%= site %>;
|
22
|
-
}
|
22
|
+
# proxy configuration - customarily offloaded to an include file
|
23
|
+
proxy_redirect off;
|
24
|
+
proxy_set_header Host $host;
|
25
|
+
proxy_set_header X-Real-IP $remote_addr;
|
26
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
27
|
+
|
28
|
+
try_files $uri $uri/index.html $uri.html @thin-<%= site %>;
|
23
29
|
}
|
24
30
|
|
25
|
-
|
26
|
-
|
27
|
-
|
31
|
+
location @thin-<%= site %> {
|
32
|
+
# proxy configuration - customarily offloaded to an include file
|
33
|
+
client_max_body_size 10m;
|
34
|
+
client_body_buffer_size 128k;
|
35
|
+
proxy_connect_timeout 90;
|
36
|
+
proxy_send_timeout 90;
|
37
|
+
proxy_read_timeout 90;
|
38
|
+
proxy_buffers 32 4k;
|
39
|
+
|
40
|
+
proxy_pass http://<%= site %>;
|
28
41
|
}
|
42
|
+
|
43
|
+
error_page 500 502 503 504 /500.html;
|
29
44
|
}
|
@@ -8,6 +8,7 @@ module TddDeploy
|
|
8
8
|
#
|
9
9
|
# The sub directories tested for are:
|
10
10
|
#
|
11
|
+
# * 'site_app_root' - application root (current installed version)
|
11
12
|
# * 'site_doc_root' - DocumentRoot
|
12
13
|
# * 'site_doc_root'/../releases - a standard directory used by Capistrano
|
13
14
|
# * 'site_doc_root'/config/thin.conf - config file for 'thin' server
|
@@ -16,12 +17,16 @@ module TddDeploy
|
|
16
17
|
# * ~/site/monitrc - a monit configuration fragment which tells monit how to monitor the site's *thin* servers.
|
17
18
|
# * ~/site/one_thin_server - shell script to start a single server instance
|
18
19
|
class SiteLayout < TddDeploy::TestBase
|
19
|
-
def
|
20
|
+
def test_site_app_root
|
21
|
+
deploy_test_file_exists_on_hosts_as self.site_user, self.app_hosts, "#{self.site_app_root}"
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_site_doc_root
|
20
25
|
deploy_test_file_exists_on_hosts_as self.site_user, self.app_hosts, "#{self.site_doc_root}"
|
21
26
|
end
|
22
27
|
|
23
28
|
def test_releases_subdir
|
24
|
-
deploy_test_file_exists_on_hosts_as self.site_user, self.app_hosts, "#{self.
|
29
|
+
deploy_test_file_exists_on_hosts_as self.site_user, self.app_hosts, "#{self.site_app_root}/../../releases"
|
25
30
|
end
|
26
31
|
|
27
32
|
def test_special_dir
|
@@ -29,11 +34,11 @@ module TddDeploy
|
|
29
34
|
end
|
30
35
|
|
31
36
|
def test_thin_conf
|
32
|
-
deploy_test_file_exists_on_hosts_as self.site_user, self.app_hosts, "#{
|
37
|
+
deploy_test_file_exists_on_hosts_as self.site_user, self.app_hosts, "#{site_app_root}/config/thin.conf"
|
33
38
|
end
|
34
39
|
|
35
40
|
def test_one_thin_server_conf
|
36
|
-
deploy_test_file_exists_on_hosts_as self.site_user, self.app_hosts, "#{
|
41
|
+
deploy_test_file_exists_on_hosts_as self.site_user, self.app_hosts, "#{site_app_root}/config/one_thin_server.conf"
|
37
42
|
end
|
38
43
|
|
39
44
|
def test_site_dir_exists
|
data/lib/tdd_deploy/version.rb
CHANGED
data/tests/test_copy_methods.rb
CHANGED
@@ -23,10 +23,12 @@ class RunMethodsTestCase < Test::Unit::TestCase
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def test_mkdir_on_remote_as
|
26
|
-
result = mkdir_on_remote_as 'site_user', 'arch', 'test-dir'
|
26
|
+
result = mkdir_on_remote_as 'site_user', 'arch', 'test-dir', :permissions => 0555
|
27
27
|
assert result, "mkdir_on_remote_as site_user on arch returns true"
|
28
28
|
stdout, stderr, cmd = run_on_a_host_as 'site_user', 'arch', 'test -d test-dir && echo "success"'
|
29
29
|
assert_equal "success\n", stdout, "deploy_test_file_exists_on_hosts_as says 'test-dir' exists"
|
30
|
+
stdout, stderr, cmd = run_on_a_host_as 'site_user', 'arch', 'ls -ld test-dir'
|
31
|
+
assert_match /^dr-xr-xr-x/, stdout, "deploy_test_file_exists_on_hosts_as says 'test-dir' exists"
|
30
32
|
|
31
33
|
stdout, stderr, cmd = run_on_a_host_as 'site_user', 'arch', 'rmdir test-dir ; test -d test-dir || echo "success"'
|
32
34
|
assert_equal "success\n", stdout, "deploy_test_file_exists_on_hosts_as says 'test-dir' removed"
|
@@ -64,6 +66,7 @@ class RunMethodsTestCase < Test::Unit::TestCase
|
|
64
66
|
require 'tempfile'
|
65
67
|
tmp_file = Tempfile.new('foo')
|
66
68
|
begin
|
69
|
+
tmp_file_perms = tmp_file.stat.mode
|
67
70
|
input_text = "line one\nline two\nline 3\n"
|
68
71
|
tmp_file.write input_text
|
69
72
|
tmp_file.close
|
@@ -71,6 +74,8 @@ class RunMethodsTestCase < Test::Unit::TestCase
|
|
71
74
|
|
72
75
|
stdout, stderr, cmd = run_on_a_host_as 'site_user', 'arch', 'cat test-file'
|
73
76
|
assert_equal input_text, stdout, "remote file should contain input_text"
|
77
|
+
stdout, stderr, cmd = run_on_a_host_as 'site_user', 'arch', 'ls -ld test-file'
|
78
|
+
assert_match /^-rw-------/, stdout, "test-file should have correct permissions"
|
74
79
|
|
75
80
|
assert result, "copy should return true"
|
76
81
|
ensure
|
@@ -97,6 +102,9 @@ class RunMethodsTestCase < Test::Unit::TestCase
|
|
97
102
|
assert append_file_to_remote_file_as('site_user', 'arch', tmp2_file.path, 'test-file'), 'append should return true'
|
98
103
|
stdout, stderr, cmd = run_on_a_host_as 'site_user', 'arch', 'cat test-file'
|
99
104
|
assert_equal input_text + input2_text, stdout, "remote file should contain input_text + input2_text"
|
105
|
+
|
106
|
+
stdout, stderr, cmd = run_on_a_host_as 'site_user', 'arch', 'ls -ld test-file'
|
107
|
+
assert_match /^-rw-------/, stdout, "test-file should have correct permissions"
|
100
108
|
ensure
|
101
109
|
tmp_file.unlink
|
102
110
|
tmp2_file.unlink
|
data/tests/test_environ.rb
CHANGED
@@ -61,7 +61,7 @@ class TestEnvironTestCase < Test::Unit::TestCase
|
|
61
61
|
def test_resonse_to_instance_assessors
|
62
62
|
[:env_hash, :ssh_timeout, :site_base_port, :site_num_servers,
|
63
63
|
:host_admin, :local_admin, :local_admin_email,
|
64
|
-
:site, :site_user, :site_doc_root, :site_special_dir, :site_url,
|
64
|
+
:site, :site_user, :site_app_root, :site_doc_root, :site_special_dir, :site_url,
|
65
65
|
:capfile_paths, :app, :db, :migration_hosts, :web,
|
66
66
|
:hosts, :app_hosts, :balance_hosts, :db_hosts, :web_hosts].each do |meth|
|
67
67
|
assert @foo.respond_to?(meth), "@foo should respond to #{meth}"
|
@@ -71,13 +71,14 @@ class TestEnvironTestCase < Test::Unit::TestCase
|
|
71
71
|
|
72
72
|
def test_env_type
|
73
73
|
["ssh_timeout", "site_base_port", "site_num_servers", "host_admin", "local_admin", "local_admin_email",
|
74
|
-
"site", "site_user", "site_doc_root", "site_special_dir", "site_url", 'app_hosts', "balance_hosts", "db_hosts", "web_hosts"].each do |sym|
|
74
|
+
"site", "site_user", "site_app_root", "site_doc_root", "site_special_dir", "site_url", 'app_hosts', "balance_hosts", "db_hosts", "web_hosts"].each do |sym|
|
75
75
|
assert @foo.env_types.keys.include?(sym.to_s), "@foo.env_types.keys includes #{sym}"
|
76
76
|
end
|
77
77
|
["ssh_timeout", "site_base_port", "site_num_servers"].each do |key|
|
78
78
|
assert_equal :int, @foo.env_types[key], "@foo.env_types[#{key}] should be :int"
|
79
79
|
end
|
80
|
-
["host_admin", "local_admin", "local_admin_email", "site", "site_user", "
|
80
|
+
["host_admin", "local_admin", "local_admin_email", "site", "site_user", "site_app_root",
|
81
|
+
"site_doc_root", "site_special_dir", "site_special_dir", "site_url"].each do |key|
|
81
82
|
assert_equal :string, @foo.env_types[key], "@foo.env_types[#{key}] should be :string"
|
82
83
|
end
|
83
84
|
['app_hosts', "balance_hosts", "capfile_paths", "db_hosts", "web_hosts"].each do |key|
|
@@ -93,21 +94,22 @@ class TestEnvironTestCase < Test::Unit::TestCase
|
|
93
94
|
assert_equal [], @foo.app_hosts, "assigning '' to app_hosts should create empty list"
|
94
95
|
@foo.set_env :hosts => 'foo,bar'
|
95
96
|
assert_equal ['bar', 'foo'], @foo.hosts, "assigning foo,bar to hosts should create ['bar', 'foo']"
|
96
|
-
['app_hosts', 'web_hosts', 'db_hosts'
|
97
|
+
['app_hosts', 'web_hosts', 'db_hosts'].each do |hst|
|
97
98
|
assert_equal @foo.send(hst.to_sym), @foo.hosts, "hosts should be same as @foo.#{hst}"
|
98
99
|
end
|
100
|
+
assert_equal [], @foo.balance_hosts, "balance_hosts should still be empty"
|
99
101
|
end
|
100
102
|
|
101
103
|
def test_env_hash
|
102
104
|
["ssh_timeout", "site_base_port", "site_num_servers", "host_admin", "local_admin", "local_admin_email",
|
103
|
-
"site", "site_user", "site_doc_root", "site_special_dir", "site_url", 'app_hosts', "balance_hosts", "db_hosts", "web_hosts"].each do |key|
|
105
|
+
"site", "site_user", "site_app_root", "site_doc_root", "site_special_dir", "site_url", 'app_hosts', "balance_hosts", "db_hosts", "web_hosts"].each do |key|
|
104
106
|
assert_not_nil @foo.env_hash[key], "@foo.env_hash[#{key}] should not be nil"
|
105
107
|
end
|
106
108
|
end
|
107
109
|
|
108
110
|
def test_env_defaults
|
109
111
|
["ssh_timeout", "site_base_port", "site_num_servers", "host_admin", "local_admin", "local_admin_email",
|
110
|
-
"site", "site_user", "site_doc_root", "site_special_dir", "site_url", 'app_hosts', "balance_hosts", "db_hosts", "web_hosts"].each do |key|
|
112
|
+
"site", "site_user", "site_app_root", "site_doc_root", "site_special_dir", "site_url", 'app_hosts', "balance_hosts", "db_hosts", "web_hosts"].each do |key|
|
111
113
|
assert_not_nil @foo.env_defaults[key], "@foo.env_defaults[#{key}] should not be nil"
|
112
114
|
end
|
113
115
|
end
|
@@ -122,7 +124,7 @@ class TestEnvironTestCase < Test::Unit::TestCase
|
|
122
124
|
@foo.send "#{key}=", tmp
|
123
125
|
assert_equal tmp, @foo.send(key.to_sym), "@foo.#{key} should now be #{tmp}"
|
124
126
|
end
|
125
|
-
["host_admin", "local_admin", "local_admin_email", "site", "site_user", "site_doc_root", "site_special_dir", "site_url"].each do |key|
|
127
|
+
["host_admin", "local_admin", "local_admin_email", "site", "site_user", "site_app_root", "site_doc_root", "site_special_dir", "site_url"].each do |key|
|
126
128
|
tmp = "#{key}-changed"
|
127
129
|
@foo.send "#{key}=", tmp
|
128
130
|
assert_equal tmp, @foo.send(key.to_sym), "@foo.#{key} should now be #{tmp}"
|
data/tests/test_site_layout.rb
CHANGED
@@ -20,12 +20,16 @@ class TestSiteLayoutTestCase < Test::Unit::TestCase
|
|
20
20
|
@tester = nil
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
24
|
-
assert @tester.
|
23
|
+
def test_site_app_root
|
24
|
+
assert @tester.test_site_app_root, "Directory #{@tester.site_app_root} should exist"
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_site_doc_root
|
28
|
+
assert @tester.test_site_doc_root, "Directory #{@tester.site_doc_root} should exist"
|
25
29
|
end
|
26
30
|
|
27
31
|
def test_site_releases
|
28
|
-
assert @tester.test_releases_subdir, "Directory #{@tester.
|
32
|
+
assert @tester.test_releases_subdir, "Directory #{@tester.site_app_root}/../releases should exist"
|
29
33
|
end
|
30
34
|
|
31
35
|
def test_site_configuration_dir_exists
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tdd_deploy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.10
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -13,7 +13,7 @@ date: 2011-08-16 00:00:00.000000000Z
|
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: capistrano
|
16
|
-
requirement: &
|
16
|
+
requirement: &2164627560 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2164627560
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: net-ping
|
27
|
-
requirement: &
|
27
|
+
requirement: &2164609200 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *2164609200
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: net-ssh
|
38
|
-
requirement: &
|
38
|
+
requirement: &2164599580 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *2164599580
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rack
|
49
|
-
requirement: &
|
49
|
+
requirement: &2164595860 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ! '>='
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '0'
|
55
55
|
type: :runtime
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *2164595860
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: ZenTest
|
60
|
-
requirement: &
|
60
|
+
requirement: &2164578920 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ~>
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: 4.5.0
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *2164578920
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: autotest-growl
|
71
|
-
requirement: &
|
71
|
+
requirement: &2164558440 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,7 +76,7 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *2164558440
|
80
80
|
description: Test driven support for host provisioning & Capistrano deployment - for
|
81
81
|
those who don't want to bother learning too much
|
82
82
|
email: ! ' mike@clove.com '
|
@@ -146,11 +146,8 @@ files:
|
|
146
146
|
- lib/tdd_deploy/site-erb/app_hosts/config/thin.conf.erb
|
147
147
|
- lib/tdd_deploy/site-erb/app_hosts/site/monitrc.erb
|
148
148
|
- lib/tdd_deploy/site-erb/app_hosts/site/one_thin_server.erb
|
149
|
-
- lib/tdd_deploy/site-erb/balance_hosts/config/one_thin_server.conf.erb
|
150
|
-
- lib/tdd_deploy/site-erb/balance_hosts/config/thin.conf.erb
|
151
149
|
- lib/tdd_deploy/site-erb/balance_hosts/site/monitrc.erb
|
152
150
|
- lib/tdd_deploy/site-erb/balance_hosts/site/nginx.conf.erb
|
153
|
-
- lib/tdd_deploy/site-erb/balance_hosts/site/one_thin_server.erb
|
154
151
|
- lib/tdd_deploy/site-erb/web_hosts/site/monitrc.erb
|
155
152
|
- lib/tdd_deploy/site-erb/web_hosts/site/nginx.conf.erb
|
156
153
|
homepage: https://github.com/mikehoward/tdd_deploy
|
@@ -1,14 +0,0 @@
|
|
1
|
-
---
|
2
|
-
chdir: <%= site_doc_root %>
|
3
|
-
environment: production
|
4
|
-
address: 127.0.0.1
|
5
|
-
timeout: 30
|
6
|
-
log: log/thin.log
|
7
|
-
pid: <%= site_doc_root %>/tmp/pids/thin.pid
|
8
|
-
max_conns: 1024
|
9
|
-
max_persistent_conns: 512
|
10
|
-
require: []
|
11
|
-
|
12
|
-
wait: 30
|
13
|
-
server: 1
|
14
|
-
daemonize: true
|
@@ -1,14 +0,0 @@
|
|
1
|
-
chdir: <%= site_doc_root %>
|
2
|
-
environment: production
|
3
|
-
address: 127.0.0.1
|
4
|
-
port: <%= site_base_port %>
|
5
|
-
timeout: 30
|
6
|
-
log: log/thin.log
|
7
|
-
pid: <%= site_doc_root %>/tmp/pids/thin.pid
|
8
|
-
max_conns: 1024
|
9
|
-
max_persistent_conns: 512
|
10
|
-
require: []
|
11
|
-
|
12
|
-
wait: 30
|
13
|
-
servers: <%= site_num_servers %>
|
14
|
-
daemonize: true
|