tdd_deploy 0.1.6 → 0.1.7

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.
Files changed (29) hide show
  1. data/lib/tasks/tdd_deploy.rake +1 -1
  2. data/lib/tdd_deploy/assertions.rb +1 -1
  3. data/lib/tdd_deploy/configurator.rb +1 -1
  4. data/lib/tdd_deploy/copy_methods.rb +78 -5
  5. data/lib/tdd_deploy/environ.rb +53 -17
  6. data/lib/tdd_deploy/server-templates/test_results.html.erb +42 -4
  7. data/lib/tdd_deploy/server.rb +7 -2
  8. data/lib/tdd_deploy/site-erb/{db_hosts → app_hosts}/config/one_thin_server.conf.erb +2 -2
  9. data/lib/tdd_deploy/site-erb/{db_hosts → app_hosts}/config/thin.conf.erb +2 -2
  10. data/lib/tdd_deploy/site-erb/{db_hosts → app_hosts}/site/monitrc.erb +3 -3
  11. data/lib/tdd_deploy/site-erb/{db_hosts → app_hosts}/site/one_thin_server.erb +1 -1
  12. data/lib/tdd_deploy/site-erb/balance_hosts/config/one_thin_server.conf.erb +2 -2
  13. data/lib/tdd_deploy/site-erb/balance_hosts/config/thin.conf.erb +2 -2
  14. data/lib/tdd_deploy/site-erb/balance_hosts/site/monitrc.erb +3 -3
  15. data/lib/tdd_deploy/site-erb/balance_hosts/site/nginx.conf.erb +1 -1
  16. data/lib/tdd_deploy/site-erb/balance_hosts/site/one_thin_server.erb +1 -1
  17. data/lib/tdd_deploy/site-erb/web_hosts/site/monitrc.erb +3 -3
  18. data/lib/tdd_deploy/site-erb/web_hosts/site/nginx.conf.erb +1 -1
  19. data/lib/tdd_deploy/site_tests/site_layout.rb +20 -20
  20. data/lib/tdd_deploy/site_tests/site_rvm.rb +26 -0
  21. data/lib/tdd_deploy/version.rb +1 -1
  22. data/tests/test_configurator.rb +2 -2
  23. data/tests/test_copy_methods.rb +139 -1
  24. data/tests/test_environ.rb +6 -6
  25. metadata +27 -19
  26. data/lib/tdd_deploy/site-erb/db_hosts/site/nginx.conf.erb +0 -29
  27. data/lib/tdd_deploy/site-erb/web_hosts/config/one_thin_server.conf.erb +0 -14
  28. data/lib/tdd_deploy/site-erb/web_hosts/config/thin.conf.erb +0 -14
  29. data/lib/tdd_deploy/site-erb/web_hosts/site/one_thin_server.erb +0 -6
@@ -14,7 +14,7 @@ namespace :tdd_deploy do
14
14
  desc "deletes tdd_deploy_configs/ & all it's files"
15
15
  task :rm_configs do
16
16
  tdd_deploy_configs = './tdd_deploy_configs'
17
- Dir.rm_r tdd_deploy_configs if File.exists? tdd_deploy_configs
17
+ FileUtils.rm_r tdd_deploy_configs if File.exists? tdd_deploy_configs
18
18
  end
19
19
 
20
20
  desc "copies tests & config templates to lib/tdd_deploy/"
@@ -131,7 +131,7 @@ module TddDeploy
131
131
  def remove_failed_tests
132
132
  tmp = {}
133
133
  Stats.test_results.each do |host, results|
134
- tmp[host] = results.select { |tmp| tmp[0] }
134
+ tmp[host] = results.select { |tmp| tmp[0] }.uniq.sort
135
135
  end
136
136
  Stats.test_results = tmp
137
137
  end
@@ -39,7 +39,7 @@ module TddDeploy
39
39
  tdd_deploy_configs = File.join Dir.pwd, 'tdd_deploy_configs'
40
40
  Dir.mkdir(tdd_deploy_configs) unless File.exists? tdd_deploy_configs
41
41
 
42
- ['balance_hosts', 'db_hosts', 'web_hosts'].each do |host_dir|
42
+ ['app_hosts', 'balance_hosts', 'db_hosts', 'web_hosts'].each do |host_dir|
43
43
  host_path = File.join(tdd_deploy_configs, host_dir)
44
44
  Dir.mkdir(host_path) unless File.exists? host_path
45
45
 
@@ -1,5 +1,6 @@
1
1
  require 'net/ssh'
2
2
  require 'net/sftp'
3
+ require 'fileutils'
3
4
 
4
5
  module TddDeploy
5
6
  module CopyMethods
@@ -21,13 +22,79 @@ module TddDeploy
21
22
  result
22
23
  end
23
24
 
25
+ def copy_dir_to_remote_on_hosts_as(userid, host_list, src_dir, dest_dir)
26
+ raise ::ArgumentError.new("copy_dir_to_remote_on_hosts_as: src_dir does not exist: #{src_dir}") \
27
+ unless File.directory? src_dir
28
+ host_list = [host_list] if host_list.is_a? String
29
+ result = true
30
+ host_list.uniq.each do |host|
31
+ result &= mkdir_on_remote_as userid, host, dest_dir
32
+ end
33
+ Dir.open(src_dir).each do |fname|
34
+ next if fname[0] == '.'
35
+ path = File.join(src_dir, fname)
36
+ result &= copy_file_to_remote_on_hosts_as userid, host_list, path, File.join(dest_dir, fname)
37
+ end
38
+ result
39
+ end
40
+
41
+ def append_string_to_remote_file_on_hosts_as userid, host_list, str, dst
42
+ result = true
43
+ host_list = [host_list] if host_list.is_a? String
44
+ host_list.uniq.each do |host|
45
+ result &= append_string_to_remote_file_as userid, host, str, dst
46
+ end
47
+ result
48
+ end
49
+
50
+ def append_file_to_remote_on_hosts_as userid, host_list, src, dst
51
+ result = true
52
+ host_list = [host_list] if host_list.is_a? String
53
+ host_list.uniq.each do |host|
54
+ result &= append_file_to_remote_file_as userid, host, src, dst
55
+ end
56
+ result
57
+ end
58
+
59
+ def append_dir_to_remote_on_hosts_as(userid, host_list, src_dir, dest_dir)
60
+ raise ::ArgumentError.new("append_dir_to_remote_on_hosts_as: src_dir does not exist: #{src_dir}") \
61
+ unless File.directory? src_dir
62
+ host_list = [host_list] if host_list.is_a? String
63
+ result = true
64
+ host_list.uniq.each do |host|
65
+ result &= mkdir_on_remote_as userid, host, dest_dir
66
+ end
67
+ Dir.open(src_dir).each do |fname|
68
+ next if fname[0] == '.'
69
+ path = File.join(src_dir, fname)
70
+ result &= append_file_to_remote_on_hosts_as userid, host_list, path, File.join(dest_dir, fname)
71
+ end
72
+ result
73
+ end
74
+
24
75
  #single host methods
25
76
 
26
77
  def mkdir_on_remote_as userid, host, dir, options = {}
27
78
  result = nil
28
79
  options[:permissions] = 0755 unless options.include? :permissions
29
80
  Net::SFTP.start(host, userid) do |sftp|
30
- result = sftp.mkdir dir, options
81
+ begin
82
+ result = sftp.opendir! dir
83
+ rescue ::Net::SFTP::StatusException
84
+ result = sftp.mkdir dir, options
85
+ end
86
+ end
87
+ result
88
+ end
89
+
90
+ def append_string_to_remote_file_as userid, host, str, dst
91
+ result = nil
92
+ Net::SFTP.start(host, userid) do |sftp|
93
+ if handle = sftp.open!(dst, 'a+')
94
+ stat_buf = sftp.fstat! handle
95
+ result = sftp.write handle, stat_buf.size, str
96
+ sftp.close! handle
97
+ end
31
98
  end
32
99
  result
33
100
  end
@@ -35,17 +102,23 @@ module TddDeploy
35
102
  def copy_string_to_remote_file_as userid, host, str, dst
36
103
  result = nil
37
104
  Net::SFTP.start(host, userid) do |sftp|
38
- result = sftp.file.open(dst, "w") do |f|
105
+ result = sftp.file.open(dst, 'w') do |f|
39
106
  f.write str
40
107
  end
41
108
  end
42
109
  result
43
110
  end
44
111
 
112
+ def append_file_to_remote_file_as(userid, host, src, dst)
113
+ raise ::ArgumentError.new("file name cannot be empty") if src.empty?
114
+ raise ::RuntimeError.new("unable to copy #{src} to #{userid}@#{host}: #{src} not found") unless File.exists? src
115
+
116
+ append_string_to_remote_file_as userid, host, File.new(src).read, dst
117
+ end
118
+
45
119
  def copy_file_to_remote_as(userid, host, src, dst)
46
- require 'net/sftp'
47
- raise ArgumentError.new("file name cannot be empty") if src.empty?
48
- raise RuntimeError.new("unable to copy #{src} to #{userid}@#{host}: #{src} not found") unless File.exists? src
120
+ raise ::ArgumentError.new("file name cannot be empty") if src.empty?
121
+ raise ::RuntimeError.new("unable to copy #{src} to #{userid}@#{host}: #{src} not found") unless File.exists? src
49
122
 
50
123
  copy_string_to_remote_file_as userid, host, File.new(src).read, dst
51
124
  end
@@ -31,7 +31,8 @@ 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_path' - the absolute path to DocumentRoot for the site
34
+ # * 'site_doc_root' - the absolute path to DocumentRoot for the site
35
+ # * 'site_special_dir' - absolute path to site special directory - for system configuration fragments, commands, etc
35
36
  # * 'site_url' - the url for the site (w/o scheme - as in 'www.foo.com')
36
37
  # * 'site_aliases' - aliases for the site. The delimiters will depend on your web server
37
38
  # * 'site_user' - name of site user. TddDeploy assumes that each site will have a unique user on the remote host.
@@ -65,7 +66,7 @@ module TddDeploy
65
66
  # include TddDeploy::Environ
66
67
  class DataCache
67
68
  class << self
68
- attr_accessor :env_hash, :env_types, :env_defaults, :capfile
69
+ attr_accessor :env_hash, :env_types, :env_desc, :env_defaults, :capfile
69
70
  end
70
71
  end
71
72
 
@@ -79,18 +80,18 @@ module TddDeploy
79
80
  end
80
81
 
81
82
  def env_hash=(hash)
82
- raise ArgumentError.new("env_hash=(): arg must be a hash") unless hash.is_a? Hash
83
+ raise ::ArgumentError.new("env_hash=(): arg must be a hash") unless hash.is_a? Hash
83
84
  if !(tmp = hash.keys - DataCache.env_types.keys).empty?
84
- raise ArgumentError.new("env_hash=(): Illegal Keys in value: #{tmp.join(',')}")
85
+ raise ::ArgumentError.new("env_hash=(): Illegal Keys in value: #{tmp.join(',')}")
85
86
  elsif !(tmp = DataCache.env_types.keys - hash.keys).empty?
86
- raise ArgumentError.new("env_hash=(): Missing Keys in value: #{tmp.join(',')}")
87
+ raise ::ArgumentError.new("env_hash=(): Missing Keys in value: #{tmp.join(',')}")
87
88
  else
88
89
  DataCache.env_hash = hash
89
90
  end
90
91
  end
91
92
 
92
93
  def capfile
93
- raise RuntimeError.new('Attempt to access capfile data w/o capfile_paths defined') unless DataCache.env_hash['capfile_paths']
94
+ raise ::RuntimeError.new('Attempt to access capfile data w/o capfile_paths defined') unless DataCache.env_hash['capfile_paths']
94
95
  unless DataCache.capfile
95
96
  DataCache.capfile = TddDeploy::Capfile.new
96
97
  DataCache.env_hash['capfile_paths'].each do |path|
@@ -112,7 +113,8 @@ module TddDeploy
112
113
  'site' => :string,
113
114
  'site_url' => :string,
114
115
  'site_aliases' => :string,
115
- 'site_path' => :string,
116
+ 'site_doc_root' => :string,
117
+ 'site_special_dir' => :string,
116
118
  'site_user' => :string,
117
119
 
118
120
  'app_hosts' => :list,
@@ -127,6 +129,35 @@ module TddDeploy
127
129
  'migration_hosts' => :pseudo,
128
130
  'web' => :pseudo,
129
131
  }
132
+
133
+ DataCache.env_desc = {
134
+ 'ssh_timeout' => "ssh activity timeout in seconds",
135
+ 'site_base_port' => "the lowest port number used by your mongrel or thin cluster",
136
+ 'site_num_servers' => "number of mongrel or thin servers in your cluster",
137
+
138
+ 'host_admin' => "userid of the non-root administrator on all your remote hosts",
139
+ 'local_admin' => "userid on your local host which can ssh into all hosts as host_admin, root, and site_user",
140
+ 'local_admin_email' => "email address of the recipient of montoring email - currently put in monitrc fragments",
141
+
142
+ 'site' => 'name of site - will be the name of the deployment directory - as in /home/user/site/',
143
+ 'site_url' => 'the site url - www.foo.com',
144
+ 'site_aliases' => 'all the site aliases we need to put in nginx/apache configuration fragments',
145
+ 'site_doc_root' => 'this is DocumentRoot for the site. probably /home/site_user/site/current',
146
+ 'site_special_dir' => 'directory for monitrc, nginx config fragments, monit commands, etc',
147
+ '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
+
149
+ 'app_hosts' => 'list of hosts the app will be installed on. Must have app stuff, like rvm, ruby, bundler, etc',
150
+ 'balance_hosts' => 'list of hosts running load balancers',
151
+ 'capfile_paths' => 'list of paths to Capistrano Capfile or ./config/deploy.rb or wherever you recipes are. Only used to get definitions of Capistrano roles.',
152
+ 'db_hosts' => 'list of hosts running database servers',
153
+ 'web_hosts' => 'list of hosts running real web servers - Apache or Nginx or ...',
154
+
155
+ 'hosts' => 'uniquified sum of app_hosts, balance_hosts, db_hosts, and web_hosts',
156
+ 'app' => 'list of servers in the Capistrano :app role',
157
+ 'db' => 'list of servers in the Capistrano :db role',
158
+ 'migration_hosts' => 'list of servers in the Capistrano :db role with :primary => truen',
159
+ 'web' => 'list of servers in the Capistrano :web role',
160
+ }
130
161
 
131
162
  DataCache.env_defaults ||= {
132
163
  'ssh_timeout' => 5,
@@ -140,7 +171,8 @@ module TddDeploy
140
171
  'site' => "site",
141
172
  'site_url' => 'www.site.com', # don't include the scheme
142
173
  'site_aliases' => '',
143
- 'site_path' => '/home/site_user/site.d/current', # default for Capistrano
174
+ 'site_doc_root' => '/home/site_user/site/current', # default for Capistrano
175
+ 'site_special_dir' => '/home/site_user/site_special',
144
176
  'site_user' => "site_user",
145
177
 
146
178
  'capfile_paths' => './config/deploy.rb',
@@ -161,6 +193,10 @@ module TddDeploy
161
193
  def env_defaults
162
194
  DataCache.env_defaults
163
195
  end
196
+
197
+ def env_desc
198
+ DataCache.env_desc
199
+ end
164
200
 
165
201
  # set_env(value_hash {}) - convenience method which sets values of the environment
166
202
  # hash using a hash rather than one-at-a-time
@@ -182,14 +218,14 @@ module TddDeploy
182
218
  DataCache.env_hash['balance_hosts'] =
183
219
  DataCache.env_hash['app_hosts'] = self.str_to_list(v)
184
220
  else
185
- 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']}")
221
+ 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']}")
186
222
  # raise RuntimeError.new("Cannot change hosts key if web_hosts != db_hosts")
187
223
  end
188
224
  else
189
225
  next
190
226
  end
191
227
  else
192
- raise ArgumentError.new("#{self}#reset_env(): Illegal environment key: #{k}")
228
+ raise ::ArgumentError.new("#{self}#reset_env(): Illegal environment key: #{k}")
193
229
  end
194
230
  end
195
231
  end
@@ -224,10 +260,10 @@ module TddDeploy
224
260
  self.send "#{key}=".to_sym, $2
225
261
  # self.env_hash[key] = self.env_types[key] == :list ? self.str_to_list($2) : $2.to_s
226
262
  else
227
- raise ArugmentError.new("TddDeploy::Environ#read_env: Error in #{TddDeploy::Error::ENV_FNAME}: #{line_no}: Illegal Key: #{key}")
263
+ raise ::ArugmentError.new("TddDeploy::Environ#read_env: Error in #{TddDeploy::Error::ENV_FNAME}: #{line_no}: Illegal Key: #{key}")
228
264
  end
229
265
  else
230
- raise ArugmentError.new("TddDeploy::Environ#read_env: Error in #{TddDeploy::Error::ENV_FNAME}: #{line_no}: Unmatched Line: #{line}}")
266
+ raise ::ArugmentError.new("TddDeploy::Environ#read_env: Error in #{TddDeploy::Error::ENV_FNAME}: #{line_no}: Unmatched Line: #{line}}")
231
267
  end
232
268
  end
233
269
  ensure
@@ -245,7 +281,7 @@ module TddDeploy
245
281
  end
246
282
  return self.env_hash
247
283
  else
248
- raise RuntimeError.new("Unable to open #{path} for reading")
284
+ raise ::RuntimeError.new("Unable to open #{path} for reading")
249
285
  end
250
286
  elsif dir_path.length <= 1
251
287
  # reached root level, so initialize to defaults and exit
@@ -264,7 +300,7 @@ module TddDeploy
264
300
  when str.is_a?(String) then str.split(/[\s,]+/).uniq.sort
265
301
  when str.is_a?(Array) then str.uniq.sort
266
302
  else
267
- raise ArgumentError.new("str_to_list: #{str}")
303
+ raise ::ArgumentError.new("str_to_list: #{str}")
268
304
  end
269
305
  end
270
306
 
@@ -279,7 +315,7 @@ module TddDeploy
279
315
  # 'site_host_setup.env' [aka TddDeploy::Environ::ENV_FNAME]
280
316
  def save_env
281
317
  f = File.new(TddDeploy::Environ::ENV_FNAME, "w")
282
- self.env_types.keys.each do |k|
318
+ self.env_types.keys.sort.each do |k|
283
319
  v = self.env_hash[k] || ''
284
320
  case self.env_types[k]
285
321
  when :int then f.write "#{k}=#{v}\n"
@@ -288,7 +324,7 @@ module TddDeploy
288
324
  f.write "#{k}=#{self.list_to_str(k)}\n" unless k == 'hosts'
289
325
  when :pseudo then next
290
326
  else
291
- raise RuntimeError("unknown key: #{k}")
327
+ raise ::RuntimeError.new("unknown key: #{k}")
292
328
  end
293
329
  end
294
330
  f.close
@@ -349,7 +385,7 @@ module TddDeploy
349
385
  self.balance_hosts =
350
386
  self.app_hosts = self.str_to_list(list)
351
387
  else
352
- 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}")
388
+ 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}")
353
389
  end
354
390
  end
355
391
 
@@ -20,6 +20,7 @@ end
20
20
  }
21
21
  h1 { font-size: 1.4em;}
22
22
  h2 { font-size: 1.2em;}
23
+ th, td { text-align: left;}
23
24
 
24
25
  #test-summary {
25
26
  padding: 10px;
@@ -69,6 +70,9 @@ end
69
70
  }
70
71
  .odd { background: #eee;}
71
72
  .even { background: #ccc;}
73
+ .red { color: #800;}
74
+ .green { color: #080;}
75
+ .warn { color: #f80;}
72
76
  </style>
73
77
  <!-- Date: 2011-08-20 -->
74
78
  </head>
@@ -81,17 +85,51 @@ end
81
85
  <% else %>
82
86
  <p id="test-summary-failed"><%= failures %> of <%= total_tests %> Tests Failed</p>
83
87
  <% end %>
84
- <p><a href="/">Re-Run All Tests</a></p>
85
- <p><a href="/?failed-tests=<%= failed_tests.join(',') %>">Re-Run Failed Tests</a></p>
88
+ <h3>Actions:</h3>
89
+ <table>
90
+ <% reset_even_odd %>
91
+ <tr class="<%= even_odd %>">
92
+ <th>Tests</th>
93
+ <td><a href="/">All Tests</a></td>
94
+ <td><a href="/?failed-tests=<%= failed_tests.join(',') %>">Failed Tests</a></td>
95
+ </tr>
96
+ <tr class="<%= even_odd %>">
97
+ <th>Configurator</th>
98
+ <td><a href="/?run_configurator">Run Configurator</a></td>
99
+ <td></td>
100
+ </tr>
101
+ <!-- <tr class="<%= even_odd %>">
102
+ <th>Installation</th>
103
+ <td>Site Specials</td>
104
+ <td>Site Config</td>
105
+ </tr> -->
106
+ </table>
86
107
  </div> <!-- test summary -->
87
108
 
88
109
 
89
110
  <div class="env-summary">
90
111
  <h2>Host / Site environment</h2>
112
+ <h3>TddDeploy Variables</h3>
91
113
  <table>
114
+ <tr><th>Env Var (hover for info)</th><th>Current Value</th></tr>
92
115
  <% reset_even_odd %>
93
116
  <% env_hash.keys.sort.each do |k| %>
94
- <tr class="<%= even_odd %>"><th class="env-key"><%= k %></th> <td class="env-value"><%= env_hash[k] %></td></tr>
117
+ <tr class="<%= even_odd %>"><th class="env-key" title="<%= server_obj.env_desc[k] %>"><%= k %></th> <td class="env-value"><%= env_hash[k] %></td></tr>
118
+ <% end %>
119
+ </table>
120
+
121
+ <h3>Capistrano Variables</h3>
122
+ <% if server_obj.app_hosts.sort != (server_obj.app + server_obj.migration_hosts).uniq.sort %>
123
+ <p class="warn">'app_hosts' does not match Capistrano 'app' and 'migration_hosts'</p>
124
+ <% end %>
125
+ <% if server_obj.db_hosts.uniq.sort != server_obj.db.uniq.sort %>
126
+ <p class="warn">'db_hosts' does not match Capistrano 'db'</p>
127
+ <% end %>
128
+ <table>
129
+ <% reset_even_odd %>
130
+ <tr><th>Cap Var (hover for info)</th><th>Current Value</th></tr>
131
+ <% ['app', 'db', 'migration_hosts', 'web'].each do |k| %>
132
+ <tr class="<%= even_odd %>"><th class="env-key" title="<%= server_obj.env_desc[k] %>"><%= k %></th><td class="env-value"><%= server_obj.send(k.to_sym) %></td></tr>
95
133
  <% end %>
96
134
  </table>
97
135
  </div>
@@ -104,7 +142,7 @@ end
104
142
  <% if File.exists? tdd_deploy_configs %>
105
143
  <table>
106
144
  <tr class="<%= even_odd %>"><td><%= tdd_deploy_configs %></td></tr>
107
- <% ['balance_hosts', 'db_hosts', 'web_hosts'].each do |host_dir| %>
145
+ <% ['app_hosts', 'balance_hosts', 'db_hosts', 'web_hosts'].each do |host_dir| %>
108
146
  <% host_path = File.join(tdd_deploy_configs, host_dir) %>
109
147
  <% unless File.exists? host_path %>
110
148
  <tr class="<%= even_odd %>"><td></td><td><%= host_dir %> does not exist</td></tr>
@@ -9,6 +9,9 @@ module TddDeploy
9
9
  #
10
10
  # implements a simple 'rack' server. Methods are either used internally or called
11
11
  # from the web page during page reloads.
12
+ #
13
+ # It only displays one page - which is defined in the gem in
14
+ # lib/tdd_deploy/server-templates/test_results.html.erb.
12
15
  class Server < TddDeploy::Base
13
16
  LIB_DIR = File.expand_path('../..', __FILE__)
14
17
  HOST_TESTS_DIR = File.join(Dir.pwd, 'lib', 'tdd_deploy', 'host_tests')
@@ -52,7 +55,7 @@ module TddDeploy
52
55
  def call(env)
53
56
  self.query_hash = parse_query_string(env['QUERY_STRING'])
54
57
 
55
- if query_hash['run_configurator']
58
+ if self.query_hash['run_configurator']
56
59
  require 'tdd_deploy/configurator'
57
60
  configurator = TddDeploy::Configurator.new
58
61
  configurator.make_configuration_files
@@ -162,7 +165,9 @@ module TddDeploy
162
165
  f = File.new(TEMPLATE_PATH)
163
166
  template = ERB.new f.read, nil, '<>'
164
167
  f.close
165
-
168
+
169
+ # add 'server_obj' so accessors are accessible from erb template
170
+ server_obj = self
166
171
  template.result(binding)
167
172
  end
168
173
 
@@ -1,10 +1,10 @@
1
1
  ---
2
- chdir: <%= site_path %>
2
+ chdir: <%= site_doc_root %>
3
3
  environment: production
4
4
  address: 127.0.0.1
5
5
  timeout: 30
6
6
  log: log/thin.log
7
- pid: <%= site_path %>/tmp/pids/thin.pid
7
+ pid: <%= site_doc_root %>/tmp/pids/thin.pid
8
8
  max_conns: 1024
9
9
  max_persistent_conns: 512
10
10
  require: []
@@ -1,10 +1,10 @@
1
- chdir: <%= site_path %>
1
+ chdir: <%= site_doc_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: <%= site_path %>/tmp/pids/thin.pid
7
+ pid: <%= site_doc_root %>/tmp/pids/thin.pid
8
8
  max_conns: 1024
9
9
  max_persistent_conns: 512
10
10
  require: []
@@ -1,7 +1,7 @@
1
1
  <% ((site_base_port)...(site_base_port+site_num_servers)).each do |port| %>
2
- check process <%= site %>_server_<%= port %> with pidfile <%= "#{site_path}/tmp/pids/thin.#{port}.pid" %>
3
- start process = "<%= "#{site_path}/site/thin_one_server start #{port}" %>" with timeout 60 seconds
4
- stop process = "<%= "#{site_path}/site/thin_one_server stop #{port}" %>"
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
5
  if failed host localhost port <%= port %> protocol http
6
6
  and request "/"
7
7
  then restart
@@ -2,5 +2,5 @@
2
2
 
3
3
  PORT=$1
4
4
 
5
- cd <%= site_path %>
5
+ cd <%= site_doc_root %>
6
6
  bundle exec thin --config ./config/thin_one_server.config --port $PORT start
@@ -1,10 +1,10 @@
1
1
  ---
2
- chdir: <%= site_path %>
2
+ chdir: <%= site_doc_root %>
3
3
  environment: production
4
4
  address: 127.0.0.1
5
5
  timeout: 30
6
6
  log: log/thin.log
7
- pid: <%= site_path %>/tmp/pids/thin.pid
7
+ pid: <%= site_doc_root %>/tmp/pids/thin.pid
8
8
  max_conns: 1024
9
9
  max_persistent_conns: 512
10
10
  require: []
@@ -1,10 +1,10 @@
1
- chdir: <%= site_path %>
1
+ chdir: <%= site_doc_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: <%= site_path %>/tmp/pids/thin.pid
7
+ pid: <%= site_doc_root %>/tmp/pids/thin.pid
8
8
  max_conns: 1024
9
9
  max_persistent_conns: 512
10
10
  require: []
@@ -1,7 +1,7 @@
1
1
  <% ((site_base_port)...(site_base_port+site_num_servers)).each do |port| %>
2
- check process <%= site %>_server_<%= port %> with pidfile <%= "#{site_path}/tmp/pids/thin.#{port}.pid" %>
3
- start process = "<%= "#{site_path}/site/thin_one_server start #{port}" %>" with timeout 60 seconds
4
- stop process = "<%= "#{site_path}/site/thin_one_server stop #{port}" %>"
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
5
  if failed host localhost port <%= port %> protocol http
6
6
  and request "/"
7
7
  then restart
@@ -9,7 +9,7 @@ upstream <%= site %> {
9
9
  server {
10
10
  listen 80;
11
11
  server_name <%= site_url %>;
12
- root <%= site_path %>/current;
12
+ root <%= site_doc_root %>/current;
13
13
  location / {
14
14
  proxy_set_header X-Real-IP $remote_addr;
15
15
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@@ -2,5 +2,5 @@
2
2
 
3
3
  PORT=$1
4
4
 
5
- cd <%= site_path %>
5
+ cd <%= site_doc_root %>
6
6
  bundle exec thin --config ./config/thin_one_server.config --port $PORT start
@@ -1,7 +1,7 @@
1
1
  <% ((site_base_port)...(site_base_port+site_num_servers)).each do |port| %>
2
- check process <%= site %>_server_<%= port %> with pidfile <%= "#{site_path}/tmp/pids/thin.#{port}.pid" %>
3
- start process = "<%= "#{site_path}/site/thin_one_server start #{port}" %>" with timeout 60 seconds
4
- stop process = "<%= "#{site_path}/site/thin_one_server stop #{port}" %>"
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
5
  if failed host localhost port <%= port %> protocol http
6
6
  and request "/"
7
7
  then restart
@@ -9,7 +9,7 @@ upstream <%= site %> {
9
9
  server {
10
10
  listen 80;
11
11
  server_name <%= site_url %>;
12
- root <%= site_path %>/current;
12
+ root <%= site_doc_root %>/current;
13
13
  location / {
14
14
  proxy_set_header X-Real-IP $remote_addr;
15
15
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@@ -8,44 +8,44 @@ module TddDeploy
8
8
  #
9
9
  # The sub directories tested for are:
10
10
  #
11
- # * 'site_path' - DocumentRoot
12
- # * 'site_path'/../releases - a standard directory used by Capistrano
13
- # * 'site_path'/site/nginx.conf - an nginx configuratino fragment which tells nginx to proxy the site's *thin* servers
14
- # * 'site_path'/site/monitrc - a monit configuration fragment which tells monit how to monitor the site's *thin* servers.
15
- # * 'site_path'/config/thin.conf - config file for 'thin' server
16
- # * 'site_path'/config/one_thin_server.conf - config file for monit to use to restart a single server instance
17
- # * 'site_path'/site/one_thin_server - shell script to start a single server instance
11
+ # * 'site_doc_root' - DocumentRoot
12
+ # * 'site_doc_root'/../releases - a standard directory used by Capistrano
13
+ # * 'site_doc_root'/config/thin.conf - config file for 'thin' server
14
+ # * 'site_doc_root'/config/one_thin_server.conf - config file for monit to use to restart a single server instance
15
+ # * '~/site/nginx.conf - an nginx configuratino fragment which tells nginx to proxy the site's *thin* servers
16
+ # * ~/site/monitrc - a monit configuration fragment which tells monit how to monitor the site's *thin* servers.
17
+ # * ~/site/one_thin_server - shell script to start a single server instance
18
18
  class SiteLayout < TddDeploy::Base
19
19
  def test_site_subdir
20
- deploy_test_file_exists_on_hosts_as self.site_user, self.web_hosts, "#{self.site_path}"
20
+ deploy_test_file_exists_on_hosts_as self.site_user, self.web_hosts, "#{self.site_doc_root}"
21
21
  end
22
22
 
23
23
  def test_releases_subdir
24
- deploy_test_file_exists_on_hosts_as self.site_user, self.web_hosts, "#{self.site_path}/../releases"
24
+ deploy_test_file_exists_on_hosts_as self.site_user, self.web_hosts, "#{self.site_doc_root}/../releases"
25
25
  end
26
26
 
27
- def test_site_dir_exists
28
- deploy_test_file_exists_on_hosts_as self.site_user, self.web_hosts, "#{self.site_path}/site"
27
+ def test_thin_conf
28
+ deploy_test_file_exists_on_hosts_as self.site_user, self.web_hosts, "#{site_doc_root}/config/thin.conf"
29
29
  end
30
30
 
31
- def test_monitrc
32
- deploy_test_file_exists_on_hosts_as self.site_user, self.web_hosts, "#{self.site_path}/site/monitrc"
31
+ def test_one_thin_server_conf
32
+ deploy_test_file_exists_on_hosts_as self.site_user, self.web_hosts, "#{site_doc_root}/config/one_thin_server.conf"
33
33
  end
34
34
 
35
- def test_nginx_conf
36
- deploy_test_file_exists_on_hosts_as self.site_user, self.web_hosts, "#{self.site_path}/site/nginx.conf"
35
+ def test_site_dir_exists
36
+ deploy_test_file_exists_on_hosts_as self.site_user, self.web_hosts, "#{site_special_dir}"
37
37
  end
38
38
 
39
- def test_thin_conf
40
- deploy_test_file_exists_on_hosts_as self.site_user, self.web_hosts, "#{site_path}/config/thin.conf"
39
+ def test_monitrc
40
+ deploy_test_file_exists_on_hosts_as self.site_user, self.web_hosts, "#{site_special_dir}/monitrc"
41
41
  end
42
42
 
43
- def test_one_thin_server_conf
44
- deploy_test_file_exists_on_hosts_as self.site_user, self.web_hosts, "#{site_path}/config/one_thin_server.conf"
43
+ def test_nginx_conf
44
+ deploy_test_file_exists_on_hosts_as self.site_user, self.web_hosts, "#{site_special_dir}/nginx.conf"
45
45
  end
46
46
 
47
47
  def test_one_thin_server
48
- deploy_test_file_exists_on_hosts_as self.site_user, self.web_hosts, "#{site_path}/site/one_thin_server"
48
+ deploy_test_file_exists_on_hosts_as self.site_user, self.web_hosts, "#{site_special_dir}/one_thin_server"
49
49
  end
50
50
  end
51
51
  end
@@ -0,0 +1,26 @@
1
+ require 'tdd_deploy/base'
2
+
3
+ module TddDeploy
4
+ # = TddDeploy::SiteUser
5
+ #
6
+ # tests all hosts to make sure that the local user can log on as *site_user*
7
+ class SiteRvm < TddDeploy::Base
8
+ def test_rvm
9
+ deploy_test_on_hosts_as self.site_user, self.app_hosts, /RVM is the Ruby/, "rvm should be installed" do
10
+ 'source ~/.rvm/scripts/rvm ; rvm'
11
+ end
12
+ end
13
+
14
+ def test_rvm_current
15
+ deploy_test_on_hosts_as self.site_user, self.app_hosts, /(ruby|jruby|rbx|ree)-\d\.\d\.\d/, "rvm current should display a ruby" do
16
+ 'source ~/.rvm/scripts/rvm ; rvm current'
17
+ end
18
+ end
19
+
20
+ def test_bundle_prescence
21
+ deploy_test_on_hosts_as self.site_user, self.app_hosts, /Bundler version/, "bundler should run" do
22
+ 'source ~/.rvm/scripts/rvm ; bundle --version'
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,3 +1,3 @@
1
1
  module TddDeploy
2
- VERSION = '0.1.6'
2
+ VERSION = '0.1.7'
3
3
  end
@@ -21,13 +21,13 @@ class TestTddDeployConfiguratorTestCase < Test::Unit::TestCase
21
21
  FileUtils.rm_rf 'tdd_deploy_configs'
22
22
  @configurator.make_configuration_files
23
23
  assert File.exists?('tdd_deploy_configs'), "tdd_deploy_configs/ exists"
24
- [ 'balance_hosts', 'db_hosts', 'web_hosts'].each do |host_dir|
24
+ ['app_hosts', 'balance_hosts', 'db_hosts', 'web_hosts'].each do |host_dir|
25
25
  host_path = File.join('tdd_deploy_configs', host_dir)
26
26
  assert File.exists?(host_path), "#{host_path} exists"
27
27
  ['config', 'site'].each do |subdir|
28
28
  subdir_path = File.join(host_path, subdir)
29
29
  assert File.exists?(subdir_path), "#{subdir_path} exists"
30
- assert Dir.new(subdir_path).entries.length > 2, "#{subdir_path} has 3 or more entries"
30
+ assert Dir.new(subdir_path).entries.length >= 2, "#{subdir_path} has 3 or more entries"
31
31
  end
32
32
  end
33
33
  end
@@ -18,7 +18,8 @@ class RunMethodsTestCase < Test::Unit::TestCase
18
18
 
19
19
  def teardown
20
20
  run_on_hosts_as 'site_user', 'arch', 'rm -f test-file'
21
- run_on_hosts_as 'site_user', 'arch', 'rmdir test-dir'
21
+ run_on_hosts_as 'site_user', 'arch', 'rm -r test-dir'
22
+ FileUtils.rm_r 'test-dir' if File.exists? 'test-dir'
22
23
  end
23
24
 
24
25
  def test_mkdir_on_remote_as
@@ -31,6 +32,24 @@ class RunMethodsTestCase < Test::Unit::TestCase
31
32
  assert_equal "success\n", stdout, "deploy_test_file_exists_on_hosts_as says 'test-dir' removed"
32
33
  end
33
34
 
35
+ def test_append_string_to_remote_file_as
36
+ str = "line 1\nline 2\nline 3\n"
37
+ result = append_string_to_remote_file_as 'site_user', 'arch', str, 'test-file'
38
+ assert result, "append_string_to_remote_file_as returns true on success"
39
+
40
+ stdout, stderr, cmd = run_in_ssh_session_on_host_as('site_user', 'arch', 'cat test-file')
41
+ assert_equal str, stdout, "test-file should exist on arch"
42
+ assert_nil stderr, "stderr should be nil"
43
+
44
+ result = append_string_to_remote_file_as 'site_user', 'arch', "another line\n", 'test-file'
45
+ assert result, "append_string_to_remote_file_as returns true on success"
46
+
47
+ stdout, stderr, cmd = run_in_ssh_session_on_host_as('site_user', 'arch', 'cat test-file')
48
+ assert_match /line 1/, stdout, "output should contain 'line 1'"
49
+ assert_match /another line/, stdout, "output should contain 'another line'"
50
+ assert_equal 4, stdout.split("\n").length, "output should contain 4 lines"
51
+ end
52
+
34
53
  def test_copy_string_to_remote_file_as
35
54
  str = "line 1\nline 2\nline 3\n"
36
55
  result = copy_string_to_remote_file_as 'site_user', 'arch', str, 'test-file'
@@ -58,6 +77,31 @@ class RunMethodsTestCase < Test::Unit::TestCase
58
77
  tmp_file.unlink
59
78
  end
60
79
  end
80
+
81
+ def test_append_file_to_remote_file_as
82
+ require 'tempfile'
83
+ tmp_file = Tempfile.new('foo')
84
+ tmp2_file = Tempfile.new('bar')
85
+ begin
86
+ input_text = "line one\nline two\nline 3\n"
87
+ tmp_file.write input_text
88
+ tmp_file.close
89
+
90
+ input2_text = "line from file 2\n"
91
+ tmp2_file.write input2_text
92
+ tmp2_file.close
93
+ assert append_file_to_remote_file_as('site_user', 'arch', tmp_file.path, 'test-file'), 'copy file should work'
94
+ stdout, stderr, cmd = run_in_ssh_session_on_host_as 'site_user', 'arch', 'cat test-file'
95
+ assert_equal input_text, stdout, "remote file should contain input_text"
96
+
97
+ assert append_file_to_remote_file_as('site_user', 'arch', tmp2_file.path, 'test-file'), 'append should return true'
98
+ stdout, stderr, cmd = run_in_ssh_session_on_host_as 'site_user', 'arch', 'cat test-file'
99
+ assert_equal input_text + input2_text, stdout, "remote file should contain input_text + input2_text"
100
+ ensure
101
+ tmp_file.unlink
102
+ tmp2_file.unlink
103
+ end
104
+ end
61
105
 
62
106
  def test_copy_string_to_remote_on_hosts_as
63
107
  host_list = ['arch']
@@ -104,4 +148,98 @@ class RunMethodsTestCase < Test::Unit::TestCase
104
148
  end
105
149
  end
106
150
 
151
+ def test_copy_dir_to_remote_on_hosts_as
152
+ host_list = ['arch']
153
+ dir_name = 'test-dir'
154
+ Dir.mkdir dir_name unless File.exists? dir_name
155
+ ['foo', 'bar', 'baz'].each do |fname|
156
+ path = File.join(dir_name, fname)
157
+ f = File.new(path, 'w')
158
+ f.write "This is a file named #{fname}\n"
159
+ f.close
160
+ end
161
+
162
+ assert copy_dir_to_remote_on_hosts_as('site_user', host_list, dir_name, dir_name), 'copy directory should work'
163
+
164
+ result_hash = run_on_hosts_as 'site_user', host_list, "ls"
165
+ assert_match Regexp.new(dir_name), result_hash['arch'][0], "ls of home should contain directory name"
166
+
167
+ result_hash = run_on_hosts_as 'site_user', host_list, "ls #{dir_name}"
168
+ listing = result_hash['arch'][0].split(/\n/)
169
+ ['foo', 'bar', 'baz'].each do |fname|
170
+ assert listing.include?(fname), "listing of remote directory contains '#{fname}'"
171
+ end
172
+ ['foo', 'bar', 'baz'].each do |fname|
173
+ path = File.join dir_name, fname
174
+ stdout, stderr, cmd = run_in_ssh_session_on_host_as 'site_user', 'arch', "cat #{path}"
175
+ assert_equal "This is a file named #{fname}\n", stdout, "copy_dir... should copy file contents of #{fname}"
176
+ end
177
+ end
178
+
179
+ def test_append_string_to_remote_on_hosts_as_with_host_list_as_str
180
+ host_list = 'arch'
181
+ str = "line 1\nline 2\nline 3\n"
182
+ result = append_string_to_remote_file_on_hosts_as 'site_user', host_list, str, 'test-file'
183
+ assert result, "append_string_to_remote_file_as returns true on success"
184
+
185
+ result = run_on_hosts_as('site_user', host_list, 'cat test-file')
186
+ refute_nil result, "run_on_hosts_as ran on #{host_list.inspect}"
187
+ assert_equal str, result['arch'][0], "test-file should exist on arch"
188
+ assert_nil result['arch'][1], "stderr should be nil"
189
+
190
+ str2 = "another string\n"
191
+ assert append_string_to_remote_file_on_hosts_as 'site_user', host_list, str2, 'test-file'
192
+
193
+ result = run_on_hosts_as('site_user', host_list, 'cat test-file')
194
+ assert_equal str + str2, result['arch'][0], "test-file should exist on arch"
195
+ end
196
+
197
+
198
+ def test_append_file_to_remote_on_hosts_as
199
+ host_list = ['arch']
200
+ require 'tempfile'
201
+ tmp_file = Tempfile.new('foo')
202
+ begin
203
+ input_text = "line one\nline two\nline 3\n"
204
+ tmp_file.write input_text
205
+ tmp_file.close
206
+ assert append_file_to_remote_on_hosts_as('site_user', host_list, tmp_file.path, 'test-file'), 'should work'
207
+ assert append_file_to_remote_on_hosts_as('site_user', host_list, tmp_file.path, 'test-file'), 'should work'
208
+
209
+ results = run_on_hosts_as 'site_user', host_list, 'cat test-file'
210
+ assert_equal input_text * 2, results['arch'][0], "remote file should contain input_text"
211
+ ensure
212
+ tmp_file.unlink
213
+ end
214
+ end
215
+
216
+ def test_append_dir_to_remote_on_hosts_as
217
+ host_list = ['arch']
218
+ dir_name = 'test-dir'
219
+ Dir.mkdir dir_name unless File.exists? dir_name
220
+ ['foo', 'bar', 'baz'].each do |fname|
221
+ path = File.join(dir_name, fname)
222
+ f = File.new(path, 'w')
223
+ f.write "This is a file named #{fname}\n"
224
+ f.close
225
+ end
226
+
227
+ assert append_dir_to_remote_on_hosts_as('site_user', host_list, dir_name, dir_name), 'append directory should work'
228
+ assert append_dir_to_remote_on_hosts_as('site_user', host_list, dir_name, dir_name), 'append directory should work'
229
+
230
+ result_hash = run_on_hosts_as 'site_user', host_list, "ls"
231
+ assert_match Regexp.new(dir_name), result_hash['arch'][0], "ls of home should contain directory name"
232
+
233
+ result_hash = run_on_hosts_as 'site_user', host_list, "ls #{dir_name}"
234
+ listing = result_hash['arch'][0].split(/\n/)
235
+ ['foo', 'bar', 'baz'].each do |fname|
236
+ assert listing.include?(fname), "listing of remote directory contains '#{fname}'"
237
+ end
238
+ ['foo', 'bar', 'baz'].each do |fname|
239
+ path = File.join dir_name, fname
240
+ stdout, stderr, cmd = run_in_ssh_session_on_host_as 'site_user', 'arch', "cat #{path}"
241
+ assert_equal "This is a file named #{fname}\nThis is a file named #{fname}\n", stdout, "append_dir... should append file contents of #{fname}"
242
+ end
243
+ end
244
+
107
245
  end
@@ -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_path, :site_url,
64
+ :site, :site_user, :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,13 @@ 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_path", "site_url", 'app_hosts', "balance_hosts", "db_hosts", "web_hosts"].each do |sym|
74
+ "site", "site_user", "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", "site_path", "site_url"].each do |key|
80
+ ["host_admin", "local_admin", "local_admin_email", "site", "site_user", "site_doc_root", "site_special_dir", "site_special_dir", "site_url"].each do |key|
81
81
  assert_equal :string, @foo.env_types[key], "@foo.env_types[#{key}] should be :string"
82
82
  end
83
83
  ['app_hosts', "balance_hosts", "capfile_paths", "db_hosts", "web_hosts"].each do |key|
@@ -100,14 +100,14 @@ class TestEnvironTestCase < Test::Unit::TestCase
100
100
 
101
101
  def test_env_hash
102
102
  ["ssh_timeout", "site_base_port", "site_num_servers", "host_admin", "local_admin", "local_admin_email",
103
- "site", "site_user", "site_path", "site_url", 'app_hosts', "balance_hosts", "db_hosts", "web_hosts"].each do |key|
103
+ "site", "site_user", "site_doc_root", "site_special_dir", "site_url", 'app_hosts', "balance_hosts", "db_hosts", "web_hosts"].each do |key|
104
104
  assert_not_nil @foo.env_hash[key], "@foo.env_hash[#{key}] should not be nil"
105
105
  end
106
106
  end
107
107
 
108
108
  def test_env_defaults
109
109
  ["ssh_timeout", "site_base_port", "site_num_servers", "host_admin", "local_admin", "local_admin_email",
110
- "site", "site_user", "site_path", "site_url", 'app_hosts', "balance_hosts", "db_hosts", "web_hosts"].each do |key|
110
+ "site", "site_user", "site_doc_root", "site_special_dir", "site_url", 'app_hosts', "balance_hosts", "db_hosts", "web_hosts"].each do |key|
111
111
  assert_not_nil @foo.env_defaults[key], "@foo.env_defaults[#{key}] should not be nil"
112
112
  end
113
113
  end
@@ -122,7 +122,7 @@ class TestEnvironTestCase < Test::Unit::TestCase
122
122
  @foo.send "#{key}=", tmp
123
123
  assert_equal tmp, @foo.send(key.to_sym), "@foo.#{key} should now be #{tmp}"
124
124
  end
125
- ["host_admin", "local_admin", "local_admin_email", "site", "site_user", "site_path", "site_url"].each do |key|
125
+ ["host_admin", "local_admin", "local_admin_email", "site", "site_user", "site_doc_root", "site_special_dir", "site_url"].each do |key|
126
126
  tmp = "#{key}-changed"
127
127
  @foo.send "#{key}=", tmp
128
128
  assert_equal tmp, @foo.send(key.to_sym), "@foo.#{key} should now be #{tmp}"
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.6
4
+ version: 0.1.7
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: &2165394200 !ruby/object:Gem::Requirement
16
+ requirement: &2160122860 !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: *2165394200
24
+ version_requirements: *2160122860
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: net-ping
27
- requirement: &2165393520 !ruby/object:Gem::Requirement
27
+ requirement: &2160122180 !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: *2165393520
35
+ version_requirements: *2160122180
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: net-ssh
38
- requirement: &2165392800 !ruby/object:Gem::Requirement
38
+ requirement: &2160121720 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,21 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2165392800
46
+ version_requirements: *2160121720
47
+ - !ruby/object:Gem::Dependency
48
+ name: rack
49
+ requirement: &2160121060 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *2160121060
47
58
  - !ruby/object:Gem::Dependency
48
59
  name: ZenTest
49
- requirement: &2165392020 !ruby/object:Gem::Requirement
60
+ requirement: &2160120340 !ruby/object:Gem::Requirement
50
61
  none: false
51
62
  requirements:
52
63
  - - ~>
@@ -54,10 +65,10 @@ dependencies:
54
65
  version: 4.5.0
55
66
  type: :development
56
67
  prerelease: false
57
- version_requirements: *2165392020
68
+ version_requirements: *2160120340
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: autotest-growl
60
- requirement: &2165391360 !ruby/object:Gem::Requirement
71
+ requirement: &2160119700 !ruby/object:Gem::Requirement
61
72
  none: false
62
73
  requirements:
63
74
  - - ! '>='
@@ -65,7 +76,7 @@ dependencies:
65
76
  version: '0'
66
77
  type: :development
67
78
  prerelease: false
68
- version_requirements: *2165391360
79
+ version_requirements: *2160119700
69
80
  description: Test driven support for host provisioning & Capistrano deployment - for
70
81
  those who don't want to bother learning too much
71
82
  email: ! ' mike@clove.com '
@@ -99,6 +110,7 @@ files:
99
110
  - lib/tdd_deploy/server.rb
100
111
  - lib/tdd_deploy/site_tests/site_database.rb
101
112
  - lib/tdd_deploy/site_tests/site_layout.rb
113
+ - lib/tdd_deploy/site_tests/site_rvm.rb
102
114
  - lib/tdd_deploy/site_tests/site_user.rb
103
115
  - lib/tdd_deploy/version.rb
104
116
  - lib/tdd_deploy.rb
@@ -126,21 +138,17 @@ files:
126
138
  - tests/test_tdd_deploy_server.rb
127
139
  - lib/tasks/tdd_deploy.rake
128
140
  - lib/tdd_deploy/server-templates/test_results.html.erb
141
+ - lib/tdd_deploy/site-erb/app_hosts/config/one_thin_server.conf.erb
142
+ - lib/tdd_deploy/site-erb/app_hosts/config/thin.conf.erb
143
+ - lib/tdd_deploy/site-erb/app_hosts/site/monitrc.erb
144
+ - lib/tdd_deploy/site-erb/app_hosts/site/one_thin_server.erb
129
145
  - lib/tdd_deploy/site-erb/balance_hosts/config/one_thin_server.conf.erb
130
146
  - lib/tdd_deploy/site-erb/balance_hosts/config/thin.conf.erb
131
147
  - lib/tdd_deploy/site-erb/balance_hosts/site/monitrc.erb
132
148
  - lib/tdd_deploy/site-erb/balance_hosts/site/nginx.conf.erb
133
149
  - lib/tdd_deploy/site-erb/balance_hosts/site/one_thin_server.erb
134
- - lib/tdd_deploy/site-erb/db_hosts/config/one_thin_server.conf.erb
135
- - lib/tdd_deploy/site-erb/db_hosts/config/thin.conf.erb
136
- - lib/tdd_deploy/site-erb/db_hosts/site/monitrc.erb
137
- - lib/tdd_deploy/site-erb/db_hosts/site/nginx.conf.erb
138
- - lib/tdd_deploy/site-erb/db_hosts/site/one_thin_server.erb
139
- - lib/tdd_deploy/site-erb/web_hosts/config/one_thin_server.conf.erb
140
- - lib/tdd_deploy/site-erb/web_hosts/config/thin.conf.erb
141
150
  - lib/tdd_deploy/site-erb/web_hosts/site/monitrc.erb
142
151
  - lib/tdd_deploy/site-erb/web_hosts/site/nginx.conf.erb
143
- - lib/tdd_deploy/site-erb/web_hosts/site/one_thin_server.erb
144
152
  homepage: https://github.com/mikehoward/tdd_deploy
145
153
  licenses:
146
154
  - GPL3
@@ -1,29 +0,0 @@
1
- host {
2
-
3
- }
4
- upstream <%= site %> {
5
- <% ((site_base_port)...(site_base_port+site_num_servers)).each do |port| %>
6
- server 127.0.0.1:<%= port %>;
7
- <% end %>
8
- }
9
- server {
10
- listen 80;
11
- server_name <%= site_url %>;
12
- root <%= site_path %>/current;
13
- location / {
14
- proxy_set_header X-Real-IP $remote_addr;
15
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
16
- proxy_set_header Host $http_host;
17
- proxy_redirect false;
18
- try_files $uri $uri/index.html $uri.html @thin;
19
- location / {
20
- include proxy.conf;
21
- proxy_pass http://<%= site %>;
22
- }
23
- }
24
-
25
- error_page 500 502 503 504 /500.html;
26
- location = /500.html {
27
- root html;
28
- }
29
- }
@@ -1,14 +0,0 @@
1
- ---
2
- chdir: <%= site_path %>
3
- environment: production
4
- address: 127.0.0.1
5
- timeout: 30
6
- log: log/thin.log
7
- pid: <%= site_path %>/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_path %>
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_path %>/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
@@ -1,6 +0,0 @@
1
- #! /bin/sh
2
-
3
- PORT=$1
4
-
5
- cd <%= site_path %>
6
- bundle exec thin --config ./config/thin_one_server.config --port $PORT start