sunshine 1.1.1 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +20 -0
- data/Manifest.txt +1 -1
- data/README.txt +41 -8
- data/examples/deploy_tasks.rake +0 -2
- data/examples/standalone_deploy.rb +2 -2
- data/examples/{deploy.rb → sunshine_deploy.rb} +6 -12
- data/lib/sunshine.rb +42 -32
- data/lib/sunshine/app.rb +53 -49
- data/lib/sunshine/daemon.rb +2 -2
- data/lib/sunshine/daemons/apache.rb +5 -1
- data/lib/sunshine/daemons/server.rb +1 -7
- data/lib/sunshine/dependencies.rb +2 -30
- data/lib/sunshine/dependency_lib.rb +28 -10
- data/lib/sunshine/package_managers/dependency.rb +13 -14
- data/lib/sunshine/remote_shell.rb +0 -2
- data/lib/sunshine/repo.rb +1 -1
- data/lib/sunshine/server_app.rb +41 -25
- data/lib/sunshine/shell.rb +9 -9
- data/templates/apache/apache.conf.erb +6 -2
- data/templates/sunshine/middleware/health.rb +1 -1
- data/templates/sunshine/sunshine.rake +32 -16
- data/test/unit/test_app.rb +50 -13
- data/test/unit/test_nginx.rb +9 -21
- data/test/unit/test_server.rb +1 -1
- data/test/unit/test_server_app.rb +17 -0
- metadata +4 -4
data/History.txt
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
=== 1.1.2 / 2010-04-15
|
2
|
+
|
3
|
+
* Improvements:
|
4
|
+
|
5
|
+
* Added array support to App#find.
|
6
|
+
|
7
|
+
* Added auto registration of Dependency subclasses for scalability.
|
8
|
+
|
9
|
+
* Added call to App#start in App#deploy.
|
10
|
+
|
11
|
+
* Bugfixes:
|
12
|
+
|
13
|
+
* Fixed bug where env wouldn't be applied correctly in control scripts.
|
14
|
+
|
15
|
+
* Changed App#with_filter to actually change the App#server_apps attribute.
|
16
|
+
|
17
|
+
* Shell#env_cmd now returns a flattened array.
|
18
|
+
|
19
|
+
* Added actual check of running process to Daemon#status_cmd.
|
20
|
+
|
1
21
|
=== 1.1.1 / 2010-04-05
|
2
22
|
|
3
23
|
* Improvements:
|
data/Manifest.txt
CHANGED
data/README.txt
CHANGED
@@ -17,16 +17,32 @@ This gem was made possible by the sponsoring of AT&T Interactive
|
|
17
17
|
|
18
18
|
Installing sunshine:
|
19
19
|
|
20
|
-
gem install sunshine
|
20
|
+
$ gem install sunshine
|
21
|
+
|
22
|
+
Call sunshine to create the config file:
|
23
|
+
|
24
|
+
$ sunshine
|
25
|
+
|
26
|
+
Missing config file was created for you: /Users/jsmith/.sunshine
|
27
|
+
|
28
|
+
---
|
29
|
+
web_directory: /var/www
|
30
|
+
max_deploy_versions: 5
|
31
|
+
auto_dependencies: true
|
32
|
+
level: info
|
33
|
+
auto: false
|
34
|
+
remote_checkouts: false
|
35
|
+
deploy_env: :development
|
36
|
+
|
21
37
|
|
22
38
|
You can either use sunshine by requiring the gem in your script, such as
|
23
39
|
in a rakefile (which is more common):
|
24
40
|
|
25
|
-
rake sunshine:deploy
|
41
|
+
$ rake sunshine:deploy
|
26
42
|
|
27
43
|
Or you can also call built-in sunshine commands:
|
28
44
|
|
29
|
-
sunshine run my_deploy.rb -e qa
|
45
|
+
$ sunshine run my_deploy.rb -e qa
|
30
46
|
|
31
47
|
|
32
48
|
== Rake Deploy Tasks in 5 Minutes
|
@@ -43,7 +59,7 @@ specific deploy. Rake tasks are great for that, and Sunshine comes with a
|
|
43
59
|
template rake file that you can modify to fit your needs.
|
44
60
|
|
45
61
|
You can copy the template rake file to lib/tasks/ by running:
|
46
|
-
sunshine --rakefile lib/tasks/.
|
62
|
+
$ sunshine --rakefile lib/tasks/.
|
47
63
|
|
48
64
|
If you open the file, you'll see a variety of tasks that handle deployment, to
|
49
65
|
application start/stop/restart-ing, to health checks. Most likely, the two tasks
|
@@ -86,8 +102,6 @@ to the @app.deploy block. Here's a sample of completed :app and :deploy tasks:
|
|
86
102
|
rainbows.setup
|
87
103
|
nginx.setup
|
88
104
|
end
|
89
|
-
|
90
|
-
@app.start :force => true
|
91
105
|
end
|
92
106
|
|
93
107
|
...
|
@@ -217,6 +231,27 @@ In this example, :prod inherits top level values from :qa (only :repo in this
|
|
217
231
|
instance). The :inherits key also supports an array as its value.
|
218
232
|
All environments also inherit from the :default environment. The :default is
|
219
233
|
also used if the app's deploy_env is not found in the config.
|
234
|
+
|
235
|
+
Finally, yaml configs get parsed by erb, exposing any options passed to the
|
236
|
+
App's constuctor, along with the deploy environment, letting your write configs
|
237
|
+
such as:
|
238
|
+
|
239
|
+
# deploy.rb
|
240
|
+
|
241
|
+
app = App.new "deploy.yml", :name => "my_app", :deploy_name => "release_001"
|
242
|
+
|
243
|
+
|
244
|
+
# deploy.yml
|
245
|
+
---
|
246
|
+
:default :
|
247
|
+
:repo :
|
248
|
+
:type : svn
|
249
|
+
:url : svn://subversion/<%= name %>/tags/<%= deploy_name %>
|
250
|
+
|
251
|
+
:remote_shells :
|
252
|
+
- <%= deploy_env %>1.<%= name %>.domain.com
|
253
|
+
- <%= deploy_env %>2.<%= name %>.domain.com
|
254
|
+
|
220
255
|
See Sunshine::App for more information.
|
221
256
|
|
222
257
|
|
@@ -237,8 +272,6 @@ Using Sunshine, this is most commonly defined as a part of the deploy process:
|
|
237
272
|
nginx.setup
|
238
273
|
end
|
239
274
|
|
240
|
-
app.start :force => true
|
241
|
-
|
242
275
|
When a new Server is instantiated and its setup method is run, it is added to
|
243
276
|
the app's control scripts. This means that when the deploy is complete, those
|
244
277
|
servers can be controlled by the app's start/stop/restart/status methods.
|
data/examples/deploy_tasks.rake
CHANGED
@@ -7,20 +7,17 @@ Sunshine::App.deploy do |app|
|
|
7
7
|
|
8
8
|
app.gem_install 'isolate', :version => '1.3.0'
|
9
9
|
|
10
|
-
app.
|
10
|
+
app.yum_install 'libxml2-devel', 'libxslt-devel', 'libaio', 'sqlite-devel',
|
11
11
|
'sqlite', 'ruby-devel', 'activerecord-oracle_enhanced-adapter'
|
12
12
|
|
13
|
-
|
14
13
|
app.run_bundler
|
15
14
|
|
16
|
-
|
17
15
|
app.with_filter :role => :db do
|
18
16
|
|
19
17
|
app.rake 'config/database.yml'
|
20
18
|
app.rake 'db:migrate'
|
21
19
|
end
|
22
20
|
|
23
|
-
|
24
21
|
app.with_filter :role => :cdn do
|
25
22
|
|
26
23
|
sass_yml_file = "#{app.checkout_path}/config/asset_packages.yml"
|
@@ -32,17 +29,14 @@ Sunshine::App.deploy do |app|
|
|
32
29
|
end
|
33
30
|
|
34
31
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
mail = Sunshine::ARSendmail.new app
|
39
|
-
mail.restart
|
32
|
+
Sunshine::DelayedJob.new(app).setup
|
33
|
+
Sunshine::ARSendmail.new(app).setup
|
40
34
|
|
41
35
|
unicorn = Sunshine::Unicorn.new app, :port => 10001, :processes => 8
|
42
|
-
unicorn
|
36
|
+
nginx = Sunshine::Nginx.new app, :point_to => unicorn
|
43
37
|
|
44
|
-
|
45
|
-
nginx.
|
38
|
+
unicorn.setup
|
39
|
+
nginx.setup
|
46
40
|
end
|
47
41
|
|
48
42
|
|
data/lib/sunshine.rb
CHANGED
@@ -19,7 +19,7 @@ module Sunshine
|
|
19
19
|
|
20
20
|
##
|
21
21
|
# Sunshine version.
|
22
|
-
VERSION = '1.1.
|
22
|
+
VERSION = '1.1.2'
|
23
23
|
|
24
24
|
##
|
25
25
|
# Path to the list of installed sunshine apps.
|
@@ -36,13 +36,14 @@ module Sunshine
|
|
36
36
|
##
|
37
37
|
# Default configuration.
|
38
38
|
DEFAULT_CONFIG = {
|
39
|
-
'level' => 'info',
|
40
|
-
'deploy_env' => :development,
|
41
39
|
'auto' => false,
|
42
|
-
'max_deploy_versions' => 5,
|
43
|
-
'web_directory' => '/var/www',
|
44
40
|
'auto_dependencies' => true,
|
45
|
-
'
|
41
|
+
'deploy_env' => :development,
|
42
|
+
'level' => 'info',
|
43
|
+
'max_deploy_versions' => 5,
|
44
|
+
'remote_checkouts' => false,
|
45
|
+
'timeout' => 300,
|
46
|
+
'web_directory' => '/var/www'
|
46
47
|
}
|
47
48
|
|
48
49
|
##
|
@@ -106,24 +107,6 @@ module Sunshine
|
|
106
107
|
end
|
107
108
|
|
108
109
|
|
109
|
-
##
|
110
|
-
# Handles input/output to the shell. See Sunshine::Shell.
|
111
|
-
|
112
|
-
def self.shell
|
113
|
-
@shell ||= Sunshine::Shell.new
|
114
|
-
end
|
115
|
-
|
116
|
-
|
117
|
-
##
|
118
|
-
# The default directory where apps should be deployed to:
|
119
|
-
# '/var/www' by default. Overridden in the ~/.sunshine config file
|
120
|
-
# or at setup time. See also App#deploy_path.
|
121
|
-
|
122
|
-
def self.web_directory
|
123
|
-
@config['web_directory']
|
124
|
-
end
|
125
|
-
|
126
|
-
|
127
110
|
##
|
128
111
|
# Should sunshine ever ask for user input? True by default; overridden with
|
129
112
|
# the -a option.
|
@@ -143,7 +126,7 @@ module Sunshine
|
|
143
126
|
|
144
127
|
##
|
145
128
|
# Maximum number of deploys (history) to keep on the remote server,
|
146
|
-
# 5 by default. Overridden in the
|
129
|
+
# 5 by default. Overridden in the config.
|
147
130
|
|
148
131
|
def self.max_deploy_versions
|
149
132
|
@config['max_deploy_versions']
|
@@ -152,13 +135,31 @@ module Sunshine
|
|
152
135
|
|
153
136
|
##
|
154
137
|
# Check if the codebase should be checked out remotely, or checked out
|
155
|
-
# locally and rsynced up. Overridden in the
|
138
|
+
# locally and rsynced up. Overridden in the config.
|
156
139
|
|
157
140
|
def self.remote_checkouts?
|
158
141
|
@config['remote_checkouts']
|
159
142
|
end
|
160
143
|
|
161
144
|
|
145
|
+
##
|
146
|
+
# Handles input/output to the shell. See Sunshine::Shell.
|
147
|
+
|
148
|
+
def self.shell
|
149
|
+
@shell ||= Sunshine::Shell.new
|
150
|
+
end
|
151
|
+
|
152
|
+
|
153
|
+
##
|
154
|
+
# How long to wait on a command to finish when no output is received.
|
155
|
+
# Defaults to 300 (seconds). Overridden in the config.
|
156
|
+
# Set to false to disable timeout.
|
157
|
+
|
158
|
+
def self.timeout
|
159
|
+
@config['timeout']
|
160
|
+
end
|
161
|
+
|
162
|
+
|
162
163
|
##
|
163
164
|
# Check if trace log should be output at all.
|
164
165
|
# This value can be assigned by default in ~/.sunshine
|
@@ -170,6 +171,16 @@ module Sunshine
|
|
170
171
|
end
|
171
172
|
|
172
173
|
|
174
|
+
##
|
175
|
+
# The default directory where apps should be deployed to:
|
176
|
+
# '/var/www' by default. Overridden in the config.
|
177
|
+
# See also App#deploy_path.
|
178
|
+
|
179
|
+
def self.web_directory
|
180
|
+
@config['web_directory']
|
181
|
+
end
|
182
|
+
|
183
|
+
|
173
184
|
##
|
174
185
|
# Adds an INT signal trap with its description on the stack.
|
175
186
|
# Returns a trap_item Array.
|
@@ -207,7 +218,6 @@ module Sunshine
|
|
207
218
|
end
|
208
219
|
|
209
220
|
|
210
|
-
|
211
221
|
##
|
212
222
|
# Global value of sudo to use. Returns true, nil, or a username.
|
213
223
|
# This value can be assigned by default in ~/.sunshine
|
@@ -356,10 +366,15 @@ module Sunshine
|
|
356
366
|
require 'sunshine/exceptions'
|
357
367
|
|
358
368
|
require 'sunshine/shell'
|
369
|
+
require 'sunshine/remote_shell'
|
370
|
+
|
359
371
|
require 'sunshine/output'
|
360
372
|
|
361
373
|
require 'sunshine/binder'
|
362
374
|
|
375
|
+
require 'sunshine/server_app'
|
376
|
+
require 'sunshine/app'
|
377
|
+
|
363
378
|
require 'sunshine/dependency_lib'
|
364
379
|
require 'sunshine/package_managers/dependency'
|
365
380
|
require 'sunshine/package_managers/apt'
|
@@ -387,11 +402,6 @@ module Sunshine
|
|
387
402
|
|
388
403
|
require 'sunshine/healthcheck'
|
389
404
|
|
390
|
-
require 'sunshine/remote_shell'
|
391
|
-
|
392
|
-
require 'sunshine/server_app'
|
393
|
-
require 'sunshine/app'
|
394
|
-
|
395
405
|
require 'commands/default'
|
396
406
|
require 'commands/list'
|
397
407
|
require 'commands/add'
|
data/lib/sunshine/app.rb
CHANGED
@@ -178,8 +178,6 @@ module Sunshine
|
|
178
178
|
|
179
179
|
@deploy_name = options[:deploy_name] || Time.now.to_i.to_s
|
180
180
|
|
181
|
-
@server_app_filter = nil
|
182
|
-
|
183
181
|
set_deploy_paths options[:root_path]
|
184
182
|
|
185
183
|
@server_apps = server_apps_from_config options[:remote_shells]
|
@@ -195,6 +193,8 @@ module Sunshine
|
|
195
193
|
shell_env options[:shell_env]
|
196
194
|
|
197
195
|
@post_user_lambdas = []
|
196
|
+
|
197
|
+
@has_session = false
|
198
198
|
end
|
199
199
|
|
200
200
|
|
@@ -213,9 +213,10 @@ module Sunshine
|
|
213
213
|
# Connect server apps. Supports any App#find options.
|
214
214
|
|
215
215
|
def connect options=nil
|
216
|
-
|
217
|
-
|
218
|
-
|
216
|
+
Sunshine.logger.info :app, "Connecting..." do
|
217
|
+
threaded_each options do |server_app|
|
218
|
+
server_app.shell.connect
|
219
|
+
end
|
219
220
|
end
|
220
221
|
end
|
221
222
|
|
@@ -224,7 +225,7 @@ module Sunshine
|
|
224
225
|
# Check if server apps are connected. Supports any App#find options.
|
225
226
|
|
226
227
|
def connected? options=nil
|
227
|
-
|
228
|
+
each options do |server_app|
|
228
229
|
return false unless server_app.shell.connected?
|
229
230
|
end
|
230
231
|
|
@@ -236,9 +237,10 @@ module Sunshine
|
|
236
237
|
# Disconnect server apps. Supports any App#find options.
|
237
238
|
|
238
239
|
def disconnect options=nil
|
239
|
-
|
240
|
-
|
241
|
-
|
240
|
+
Sunshine.logger.info :app, "Disconnecting..." do
|
241
|
+
threaded_each options do |server_app|
|
242
|
+
server_app.shell.disconnect
|
243
|
+
end
|
242
244
|
end
|
243
245
|
end
|
244
246
|
|
@@ -246,6 +248,12 @@ module Sunshine
|
|
246
248
|
##
|
247
249
|
# Deploy the application to deploy servers and
|
248
250
|
# call user's post-deploy code. Supports any App#find options.
|
251
|
+
#
|
252
|
+
# Note: The deploy method will stop the former deploy just before
|
253
|
+
# symlink and the passed block is run.
|
254
|
+
#
|
255
|
+
# Note: Once deployment is complete, the deploy method will attempt to
|
256
|
+
# run App#start.
|
249
257
|
|
250
258
|
def deploy options=nil
|
251
259
|
prev_connection = connected?
|
@@ -280,6 +288,8 @@ module Sunshine
|
|
280
288
|
|
281
289
|
register_as_deployed
|
282
290
|
remove_old_deploys
|
291
|
+
|
292
|
+
start :force => true
|
283
293
|
end
|
284
294
|
end
|
285
295
|
|
@@ -473,23 +483,21 @@ module Sunshine
|
|
473
483
|
# find :user => 'db'
|
474
484
|
# find :host => 'someserver.com'
|
475
485
|
# find :role => :web
|
486
|
+
#
|
487
|
+
# The find method also supports passing arrays and will match
|
488
|
+
# any server app that matches any one condition:
|
489
|
+
# find :user => ['root', 'john']
|
490
|
+
#
|
491
|
+
# Returns all server apps who's user is either 'root' or 'john'.
|
476
492
|
|
477
493
|
def find query=nil
|
478
|
-
if @server_app_filter
|
479
|
-
if Hash === query && Hash === @server_app_filter
|
480
|
-
query.merge! @server_app_filter
|
481
|
-
else
|
482
|
-
query = @server_app_filter
|
483
|
-
end
|
484
|
-
end
|
485
|
-
|
486
494
|
return @server_apps if query.nil? || query == :all
|
487
495
|
|
488
496
|
@server_apps.select do |sa|
|
489
|
-
next unless sa.shell.user
|
490
|
-
next unless sa.shell.host
|
497
|
+
next unless [*query[:user]].include? sa.shell.user if query[:user]
|
498
|
+
next unless [*query[:host]].include? sa.shell.host if query[:host]
|
491
499
|
|
492
|
-
next unless sa.has_roles?(query[:role])
|
500
|
+
next unless sa.has_roles?(query[:role], true) if query[:role]
|
493
501
|
|
494
502
|
true
|
495
503
|
end
|
@@ -514,22 +522,6 @@ module Sunshine
|
|
514
522
|
end
|
515
523
|
|
516
524
|
|
517
|
-
%w{gem yum apt}.each do |dep_type|
|
518
|
-
self.class_eval <<-STR, __FILE__, __LINE__ + 1
|
519
|
-
##
|
520
|
-
# Install one or more #{dep_type} packages.
|
521
|
-
# See Settler::#{dep_type.capitalize}#new for supported options.
|
522
|
-
|
523
|
-
def #{dep_type}_install(*names)
|
524
|
-
options = names.last if Hash === names.last
|
525
|
-
with_server_apps options,
|
526
|
-
:msg => "Installing #{dep_type} packages",
|
527
|
-
:send => [:#{dep_type}_install, *names]
|
528
|
-
end
|
529
|
-
STR
|
530
|
-
end
|
531
|
-
|
532
|
-
|
533
525
|
##
|
534
526
|
# Gets or sets the healthcheck state. Returns a hash of host/state
|
535
527
|
# pairs. State values are :enabled, :disabled, and :down. The method
|
@@ -711,7 +703,7 @@ module Sunshine
|
|
711
703
|
|
712
704
|
def run_post_user_lambdas
|
713
705
|
Sunshine.logger.info :app, "Running post deploy lambdas" do
|
714
|
-
@post_user_lambdas.each{|l| l.call self}
|
706
|
+
with_session{ @post_user_lambdas.each{|l| l.call self} }
|
715
707
|
end
|
716
708
|
end
|
717
709
|
|
@@ -819,23 +811,29 @@ module Sunshine
|
|
819
811
|
def threaded_each(options=nil, &block)
|
820
812
|
mutex = Mutex.new
|
821
813
|
threads = []
|
814
|
+
error = nil
|
822
815
|
|
823
816
|
return_val = each(options) do |server_app|
|
824
817
|
|
825
818
|
thread = Thread.new do
|
826
819
|
server_app.shell.with_mutex mutex do
|
827
|
-
|
820
|
+
|
821
|
+
begin
|
822
|
+
yield server_app
|
823
|
+
|
824
|
+
rescue => e
|
825
|
+
error = e
|
826
|
+
end
|
828
827
|
end
|
829
828
|
end
|
830
829
|
|
831
|
-
# We don't want deploy servers to keep doing things if one fails
|
832
|
-
thread.abort_on_exception = true
|
833
|
-
|
834
830
|
threads << thread
|
835
831
|
end
|
836
832
|
|
837
833
|
threads.each{|t| t.join }
|
838
834
|
|
835
|
+
raise error if error
|
836
|
+
|
839
837
|
return_val
|
840
838
|
end
|
841
839
|
|
@@ -870,17 +868,19 @@ module Sunshine
|
|
870
868
|
# end
|
871
869
|
|
872
870
|
def with_filter filter_hash
|
873
|
-
|
871
|
+
old_server_apps, @server_apps = @server_apps, find(filter_hash)
|
874
872
|
|
875
873
|
yield self
|
876
874
|
|
877
|
-
|
875
|
+
ensure
|
876
|
+
@server_apps = old_server_apps
|
878
877
|
end
|
879
878
|
|
880
879
|
|
881
880
|
##
|
882
881
|
# Calls a method for server_apps found with the passed options,
|
883
|
-
# and with an optional log message.
|
882
|
+
# and with an optional log message. Will attempt to run the methods in
|
883
|
+
# a session to avoid multiple ssh login prompts. Supports all App#find
|
884
884
|
# options, plus:
|
885
885
|
# :no_threads:: bool - disable threaded execution
|
886
886
|
# :msg:: "some message" - log message
|
@@ -912,11 +912,13 @@ module Sunshine
|
|
912
912
|
end
|
913
913
|
|
914
914
|
|
915
|
-
|
916
|
-
|
915
|
+
with_session options do
|
916
|
+
if message
|
917
|
+
Sunshine.logger.info(:app, message, &block)
|
917
918
|
|
918
|
-
|
919
|
-
|
919
|
+
else
|
920
|
+
block.call
|
921
|
+
end
|
920
922
|
end
|
921
923
|
end
|
922
924
|
|
@@ -927,11 +929,13 @@ module Sunshine
|
|
927
929
|
# already exists. Supports all App#find options.
|
928
930
|
|
929
931
|
def with_session options=nil
|
930
|
-
|
932
|
+
|
933
|
+
prev_connection = connected?(options)
|
931
934
|
connect options unless prev_connection
|
932
935
|
|
933
936
|
yield
|
934
937
|
|
938
|
+
ensure
|
935
939
|
disconnect options unless prev_connection
|
936
940
|
end
|
937
941
|
|
data/lib/sunshine/daemon.rb
CHANGED
@@ -285,7 +285,7 @@ module Sunshine
|
|
285
285
|
# Get the command to check if the daemon is running.
|
286
286
|
|
287
287
|
def status_cmd
|
288
|
-
@status_cmd || "test -f #{@pid}"
|
288
|
+
@status_cmd || "test -f #{@pid} && kill -0 $(cat #{@pid})"
|
289
289
|
end
|
290
290
|
|
291
291
|
|
@@ -425,7 +425,7 @@ module Sunshine
|
|
425
425
|
:flags => '--chmod=ugo=rwx'
|
426
426
|
|
427
427
|
|
428
|
-
cmd = sa.shell.sudo_cmd script_file, sudo
|
428
|
+
cmd = sa.shell.sudo_cmd "#{@app.root_path}/env #{script_file}", sudo
|
429
429
|
|
430
430
|
sa.scripts[script.to_sym] << [*cmd].join(" ")
|
431
431
|
end
|
@@ -9,6 +9,8 @@ module Sunshine
|
|
9
9
|
|
10
10
|
class Apache < Server
|
11
11
|
|
12
|
+
attr_accessor :rails_base_uri
|
13
|
+
|
12
14
|
def initialize app, options={}
|
13
15
|
super
|
14
16
|
|
@@ -21,6 +23,8 @@ module Sunshine
|
|
21
23
|
|
22
24
|
@connections = options[:connections] || 256
|
23
25
|
|
26
|
+
@rails_base_uri = options[:rails_base_uri]
|
27
|
+
|
24
28
|
@timeout = 1 if @timeout < 1
|
25
29
|
|
26
30
|
@dep_name = options[:dep_name] ||
|
@@ -35,7 +39,7 @@ module Sunshine
|
|
35
39
|
|
36
40
|
def setup
|
37
41
|
super do |server_app, binder|
|
38
|
-
binder.set :
|
42
|
+
binder.set :rails_base_uri, @rails_base_uri
|
39
43
|
yield(server_app, binder) if block_given?
|
40
44
|
end
|
41
45
|
end
|
@@ -79,13 +79,7 @@ module Sunshine
|
|
79
79
|
# Gets the root of the installer passenger gem.
|
80
80
|
|
81
81
|
def self.passenger_root shell
|
82
|
-
|
83
|
-
version = $1 if str =~ /passenger\s\((.*)\)$/
|
84
|
-
gempath = $1 if str =~ /Installed\sat:\s(.*)$/
|
85
|
-
|
86
|
-
return unless version && gempath
|
87
|
-
|
88
|
-
File.join(gempath, "gems/passenger-#{version}")
|
82
|
+
shell.call "passenger-config --root"
|
89
83
|
end
|
90
84
|
|
91
85
|
|
@@ -20,8 +20,6 @@ Sunshine.dependencies do
|
|
20
20
|
apt 'nginx'
|
21
21
|
yum 'nginx'
|
22
22
|
|
23
|
-
apt 'logrotate'
|
24
|
-
yum 'logrotate'
|
25
23
|
|
26
24
|
apt 'ruby', :pkg => 'ruby-full'
|
27
25
|
yum 'ruby'
|
@@ -29,33 +27,9 @@ Sunshine.dependencies do
|
|
29
27
|
apt 'ruby-devel', :pkg => 'ruby-dev'
|
30
28
|
yum 'ruby-devel'
|
31
29
|
|
32
|
-
apt 'irb'
|
33
|
-
yum 'irb', :pkg => 'ruby-irb'
|
34
30
|
|
35
|
-
apt 'rubygems'
|
36
|
-
|
37
|
-
end
|
38
|
-
yum 'rubygems' do
|
39
|
-
requires 'ruby', 'ruby-devel'
|
40
|
-
end
|
41
|
-
|
42
|
-
apt 'logrotate'
|
43
|
-
yum 'logrotate'
|
44
|
-
|
45
|
-
apt 'curl-devel', :pkg => 'libcurl-dev'
|
46
|
-
yum 'curl-devel'
|
47
|
-
|
48
|
-
apt 'libxml2-devel', :pkg => 'libxml2-dev'
|
49
|
-
yum 'libxml2-devel'
|
50
|
-
|
51
|
-
apt 'libxslt-devel', :pkg => 'libxslt-dev'
|
52
|
-
yum 'libxslt-devel'
|
53
|
-
|
54
|
-
apt 'sqlite', :pkg => 'sqlite3'
|
55
|
-
yum 'sqlite'
|
56
|
-
|
57
|
-
apt 'sqlite-devel', :pkg => 'libsqlite3-dev'
|
58
|
-
yum 'sqlite-devel'
|
31
|
+
apt 'rubygems', :requires => ['ruby', 'ruby-devel']
|
32
|
+
yum 'rubygems', :requires => ['ruby', 'ruby-devel']
|
59
33
|
|
60
34
|
|
61
35
|
##
|
@@ -117,8 +91,6 @@ Sunshine.dependencies do
|
|
117
91
|
|
118
92
|
gem 'bundler', :version => ">=0.9"
|
119
93
|
|
120
|
-
gem 'isolate', :version => ">=1.3.0"
|
121
|
-
|
122
94
|
gem 'rake', :version => ">=0.8"
|
123
95
|
|
124
96
|
gem 'geminstaller', :version => ">=0.5"
|
@@ -47,6 +47,34 @@ module Sunshine
|
|
47
47
|
end
|
48
48
|
|
49
49
|
|
50
|
+
##
|
51
|
+
# Registers a new dependency class, creates its constructor method
|
52
|
+
# (DependencyLib#[dep_class.short_name]).
|
53
|
+
|
54
|
+
def self.register_type dep_class
|
55
|
+
class_eval <<-STR, __FILE__, __LINE__ + 1
|
56
|
+
|
57
|
+
def #{dep_class.short_name}(name, options={}, &block)
|
58
|
+
dep = #{dep_class}.new(name, options.merge(:tree => self), &block)
|
59
|
+
self.add dep
|
60
|
+
dep
|
61
|
+
end
|
62
|
+
STR
|
63
|
+
|
64
|
+
dependency_types << dep_class
|
65
|
+
end
|
66
|
+
|
67
|
+
|
68
|
+
##
|
69
|
+
# Define if sudo should be used
|
70
|
+
|
71
|
+
def self.sudo= value
|
72
|
+
dependency_types.each do |dep_class|
|
73
|
+
dep_class.sudo = value
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
|
50
78
|
attr_reader :dependencies
|
51
79
|
|
52
80
|
def initialize
|
@@ -186,15 +214,5 @@ module Sunshine
|
|
186
214
|
dep.send method, options
|
187
215
|
end
|
188
216
|
end
|
189
|
-
|
190
|
-
|
191
|
-
##
|
192
|
-
# Define if sudo should be used
|
193
|
-
|
194
|
-
def self.sudo= value
|
195
|
-
dependency_types.each do |dep_class|
|
196
|
-
dep_class.sudo = value
|
197
|
-
end
|
198
|
-
end
|
199
217
|
end
|
200
218
|
end
|
@@ -317,8 +317,13 @@ module Sunshine
|
|
317
317
|
end
|
318
318
|
|
319
319
|
|
320
|
-
|
321
|
-
|
320
|
+
##
|
321
|
+
# Returns an underscored short version of the class name:
|
322
|
+
# Sunshine::Yum.short_name
|
323
|
+
# #=> "yum"
|
324
|
+
|
325
|
+
def self.short_name
|
326
|
+
@short_name ||= underscore self.name.to_s.split(":").last
|
322
327
|
end
|
323
328
|
|
324
329
|
|
@@ -328,19 +333,13 @@ module Sunshine
|
|
328
333
|
end
|
329
334
|
|
330
335
|
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
DependencyLib.class_eval <<-STR, __FILE__, __LINE__ + 1
|
336
|
-
def #{method_name}(name, options={}, &block)
|
337
|
-
dep = #{class_name}.new(name, options.merge(:tree => self), &block)
|
338
|
-
self.add dep
|
339
|
-
dep
|
340
|
-
end
|
341
|
-
STR
|
336
|
+
##
|
337
|
+
# Auto register the new Dependency class with DependencyLib and ServerApp
|
338
|
+
# when inherited.
|
342
339
|
|
343
|
-
|
340
|
+
def self.inherited subclass
|
341
|
+
DependencyLib.register_type subclass
|
342
|
+
ServerApp.register_dependency_type subclass
|
344
343
|
end
|
345
344
|
|
346
345
|
inherited self
|
data/lib/sunshine/repo.rb
CHANGED
@@ -22,7 +22,7 @@ module Sunshine
|
|
22
22
|
# Turn Sunshine::ScmNameRepo into :scm_name
|
23
23
|
class_key = subclass.to_s.split("::").last
|
24
24
|
class_key = $1 if class_key =~ /(\w+)Repo$/
|
25
|
-
class_key.gsub!
|
25
|
+
class_key.gsub!(/([a-z0-9])([A-Z])/, '\1_\2')
|
26
26
|
class_key = class_key.downcase
|
27
27
|
|
28
28
|
@@repo_types[class_key] = subclass
|
data/lib/sunshine/server_app.rb
CHANGED
@@ -47,6 +47,33 @@ module Sunshine
|
|
47
47
|
end
|
48
48
|
|
49
49
|
|
50
|
+
##
|
51
|
+
# Creates dependency instance methods such as gem_install, yum_install, etc
|
52
|
+
# on both App and ServerApp classes.
|
53
|
+
|
54
|
+
def self.register_dependency_type dep_class
|
55
|
+
class_eval <<-STR, __FILE__, __LINE__ + 1
|
56
|
+
def #{dep_class.short_name}_install(*names)
|
57
|
+
options = Hash === names.last ? names.delete_at(-1) : Hash.new
|
58
|
+
|
59
|
+
names.each do |name|
|
60
|
+
dep = #{dep_class}.new(name, options)
|
61
|
+
dep.install! :call => @shell
|
62
|
+
end
|
63
|
+
end
|
64
|
+
STR
|
65
|
+
|
66
|
+
App.class_eval <<-STR, __FILE__, __LINE__ + 1
|
67
|
+
def #{dep_class.short_name}_install(*names)
|
68
|
+
options = names.last if Hash === names.last
|
69
|
+
with_server_apps options,
|
70
|
+
:msg => "Installing #{dep_class.short_name} packages",
|
71
|
+
:send => [:#{dep_class.short_name}_install, *names]
|
72
|
+
end
|
73
|
+
STR
|
74
|
+
end
|
75
|
+
|
76
|
+
|
50
77
|
app_attr :name, :deploy_name
|
51
78
|
app_attr :root_path, :checkout_path, :current_path
|
52
79
|
app_attr :deploys_path, :log_path, :shared_path
|
@@ -193,7 +220,7 @@ module Sunshine
|
|
193
220
|
|
194
221
|
|
195
222
|
##
|
196
|
-
#
|
223
|
+
# Builds a hash with information about the deploy at hand.
|
197
224
|
|
198
225
|
def get_deploy_info
|
199
226
|
{ :deployed_at => Time.now.to_s,
|
@@ -231,33 +258,22 @@ module Sunshine
|
|
231
258
|
|
232
259
|
##
|
233
260
|
# Check if this server app includes the specified roles:
|
261
|
+
# server_app.has_roles? :web
|
262
|
+
# server_app.has_roles? [:web, :app]
|
263
|
+
#
|
264
|
+
# The boolean operator may be changed to OR by passing true as the
|
265
|
+
# second argument:
|
266
|
+
# server_app.roles = [:web, :app]
|
267
|
+
# server_app.has_roles? [:web, :db] #=> false
|
268
|
+
# server_app.has_roles? [:web, :db], true #=> true
|
234
269
|
|
235
|
-
def has_roles?
|
236
|
-
|
237
|
-
|
238
|
-
roles.each do |role|
|
239
|
-
return false unless @roles.include? role
|
240
|
-
end
|
241
|
-
|
242
|
-
true
|
243
|
-
end
|
244
|
-
|
245
|
-
|
246
|
-
%w{gem yum apt}.each do |dep_type|
|
247
|
-
self.class_eval <<-STR, __FILE__, __LINE__ + 1
|
248
|
-
##
|
249
|
-
# Install one or more #{dep_type} packages.
|
250
|
-
# See #{dep_type.capitalize}#new for supported options.
|
270
|
+
def has_roles? roles, match_any=false
|
271
|
+
roles = [*roles]
|
251
272
|
|
252
|
-
|
253
|
-
|
273
|
+
return true if @roles.include? :all
|
274
|
+
return !(roles & @roles).empty? if match_any
|
254
275
|
|
255
|
-
|
256
|
-
dep = #{dep_type.capitalize}.new(name, options)
|
257
|
-
dep.install! :call => @shell
|
258
|
-
end
|
259
|
-
end
|
260
|
-
STR
|
276
|
+
(roles & @roles).length == roles.length
|
261
277
|
end
|
262
278
|
|
263
279
|
|
data/lib/sunshine/shell.rb
CHANGED
@@ -7,11 +7,7 @@ module Sunshine
|
|
7
7
|
|
8
8
|
include Open4
|
9
9
|
|
10
|
-
class TimeoutError <
|
11
|
-
|
12
|
-
##
|
13
|
-
# Time to wait with no activity until giving up on a command.
|
14
|
-
TIMEOUT = 120
|
10
|
+
class TimeoutError < CriticalDeployError; end
|
15
11
|
|
16
12
|
LOCAL_USER = `whoami`.chomp
|
17
13
|
LOCAL_HOST = `hostname`.chomp
|
@@ -20,7 +16,7 @@ module Sunshine
|
|
20
16
|
SUDO_PROMPT = /^Password:/
|
21
17
|
|
22
18
|
attr_reader :user, :host, :password, :input, :output, :mutex
|
23
|
-
attr_accessor :env, :sudo
|
19
|
+
attr_accessor :env, :sudo, :timeout
|
24
20
|
|
25
21
|
def initialize output = $stdout, options={}
|
26
22
|
@output = output
|
@@ -35,6 +31,8 @@ module Sunshine
|
|
35
31
|
@env = options[:env] || {}
|
36
32
|
@password = options[:password]
|
37
33
|
|
34
|
+
@timeout = options[:timeout] || Sunshine.timeout
|
35
|
+
|
38
36
|
@cmd_activity = nil
|
39
37
|
|
40
38
|
@mutex = nil
|
@@ -153,7 +151,8 @@ module Sunshine
|
|
153
151
|
# Prompt the user for a password
|
154
152
|
|
155
153
|
def prompt_for_password
|
156
|
-
|
154
|
+
host_info = [@user, @host].compact.join("@")
|
155
|
+
@password = ask("#{host_info} Password:") do |q|
|
157
156
|
q.echo = false
|
158
157
|
end
|
159
158
|
end
|
@@ -165,7 +164,7 @@ module Sunshine
|
|
165
164
|
def env_cmd cmd, env_hash=@env
|
166
165
|
if env_hash && !env_hash.empty?
|
167
166
|
env_vars = env_hash.map{|e| e.join("=")}
|
168
|
-
cmd = ["env", env_vars, cmd]
|
167
|
+
cmd = ["env", env_vars, cmd].flatten
|
169
168
|
end
|
170
169
|
cmd
|
171
170
|
end
|
@@ -236,7 +235,8 @@ module Sunshine
|
|
236
235
|
##
|
237
236
|
# Checks if timeout occurred.
|
238
237
|
|
239
|
-
def timed_out? start_time=@cmd_activity, max_time
|
238
|
+
def timed_out? start_time=@cmd_activity, max_time=@timeout
|
239
|
+
return unless max_time
|
240
240
|
Time.now.to_i - start_time.to_i > max_time
|
241
241
|
end
|
242
242
|
|
@@ -39,11 +39,15 @@ NameVirtualHost *:<%= port %>
|
|
39
39
|
|
40
40
|
DocumentRoot <%= expand_path app.current_path %>/public
|
41
41
|
|
42
|
-
<Directory <%= app.current_path %>/public>
|
42
|
+
<Directory <%= expand_path app.current_path %>/public>
|
43
|
+
Options FollowSymLinks -MultiViews
|
44
|
+
AllowOverride None
|
45
|
+
Order allow,deny
|
43
46
|
Allow from all
|
44
|
-
Options -MultiViews
|
45
47
|
</Directory>
|
46
48
|
|
49
|
+
<%= "RailsBaseURI #{rails_base_uri}" if rails_base_uri %>
|
50
|
+
|
47
51
|
<% unless App === target -%>
|
48
52
|
|
49
53
|
<Proxy balancer://<%= proxy_name %>>
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'sunshine'
|
2
|
-
|
3
1
|
namespace :sunshine do
|
4
2
|
|
5
3
|
##
|
@@ -8,8 +6,10 @@ namespace :sunshine do
|
|
8
6
|
# ...
|
9
7
|
# end
|
10
8
|
|
11
|
-
desc "Instantiate
|
9
|
+
desc "Instantiate app"
|
12
10
|
task :app do
|
11
|
+
require 'sunshine'
|
12
|
+
|
13
13
|
deploy_env = ENV['env'] || ENV['RACK_ENV'] || ENV['RAILS_ENV']
|
14
14
|
|
15
15
|
Sunshine.setup 'deploy_env' => ( deploy_env || "development" )
|
@@ -29,18 +29,6 @@ namespace :sunshine do
|
|
29
29
|
task :deploy => :app do
|
30
30
|
Sunshine.setup 'trace' => true
|
31
31
|
|
32
|
-
# If you're not able to add your public key to remote servers,
|
33
|
-
# you can setup your tasks to use the App#with_session method
|
34
|
-
# to avoid having to login multiple times:
|
35
|
-
#
|
36
|
-
# @app.with_session do
|
37
|
-
# @app.deploy do |app|
|
38
|
-
# ...
|
39
|
-
# end
|
40
|
-
#
|
41
|
-
# @app.start :force => true
|
42
|
-
# end
|
43
|
-
|
44
32
|
@app.deploy do |app|
|
45
33
|
|
46
34
|
# Do deploy-specific stuff here, e.g.
|
@@ -52,8 +40,36 @@ namespace :sunshine do
|
|
52
40
|
# unicorn.setup
|
53
41
|
|
54
42
|
end
|
43
|
+
end
|
44
|
+
|
55
45
|
|
56
|
-
|
46
|
+
desc "Sets up deploy servers"
|
47
|
+
task :setup => :app do
|
48
|
+
Sunshine.setup 'trace' => true
|
49
|
+
|
50
|
+
# Setup servers here
|
51
|
+
#
|
52
|
+
# @app.with_filter :role => :app do |app|
|
53
|
+
# app.yum_install 'libxml2', 'libxml2-devel'
|
54
|
+
# app.gem_install 'mechanize'
|
55
|
+
# end
|
56
|
+
#
|
57
|
+
# @app.with_filter :role => :db do |app|
|
58
|
+
# app.yum_install 'sqlite'
|
59
|
+
# app.gem_install 'sqlite3'
|
60
|
+
# end
|
61
|
+
#
|
62
|
+
# If you're not able to add your public key to remote servers,
|
63
|
+
# you can setup your tasks to use the App#with_session method
|
64
|
+
# to avoid having to login multiple times:
|
65
|
+
#
|
66
|
+
# @app.with_session do
|
67
|
+
# @app.with_filter :role => :app do |app|
|
68
|
+
# app.yum_install 'libxml2', 'libxml2-devel'
|
69
|
+
# app.gem_install 'mechanize'
|
70
|
+
# end
|
71
|
+
# ...
|
72
|
+
# end
|
57
73
|
end
|
58
74
|
|
59
75
|
|
data/test/unit/test_app.rb
CHANGED
@@ -10,7 +10,8 @@ class TestApp < Test::Unit::TestCase
|
|
10
10
|
:name => "app_name",
|
11
11
|
:remote_checkout => true,
|
12
12
|
:repo => {:type => "svn", :url => @svn_url},
|
13
|
-
:remote_shells => ["user@some_server.com"
|
13
|
+
:remote_shells => ["user@some_server.com",
|
14
|
+
["server2.com", {:roles => "web db"}]],
|
14
15
|
:root_path => "/usr/local/my_user/app_name"}
|
15
16
|
|
16
17
|
@app = Sunshine::App.new @config
|
@@ -343,7 +344,6 @@ class TestApp < Test::Unit::TestCase
|
|
343
344
|
|
344
345
|
@app.install_deps 'rake', bundler_dep
|
345
346
|
|
346
|
-
|
347
347
|
each_remote_shell do |ds|
|
348
348
|
[rake_dep, bundler_dep].each do |dep|
|
349
349
|
|
@@ -486,6 +486,28 @@ class TestApp < Test::Unit::TestCase
|
|
486
486
|
end
|
487
487
|
|
488
488
|
|
489
|
+
def test_threaded_each_errors
|
490
|
+
err_host = "some_server.com"
|
491
|
+
finished = 0
|
492
|
+
|
493
|
+
@app.threaded_each do |server_app|
|
494
|
+
if server_app.shell.host == err_host
|
495
|
+
raise Sunshine::CriticalDeployError, server_app.shell.host
|
496
|
+
else
|
497
|
+
finished = finished.next
|
498
|
+
end
|
499
|
+
end
|
500
|
+
|
501
|
+
raise "Didn't raise threaded error when it should have"
|
502
|
+
|
503
|
+
rescue Sunshine::CriticalDeployError => e
|
504
|
+
host = @app.server_apps.first.shell.host
|
505
|
+
|
506
|
+
assert_equal host, e.message
|
507
|
+
assert_equal (@app.server_apps.length - 1), finished
|
508
|
+
end
|
509
|
+
|
510
|
+
|
489
511
|
def test_upload_tasks
|
490
512
|
path = "/path/to/tasks"
|
491
513
|
|
@@ -493,15 +515,17 @@ class TestApp < Test::Unit::TestCase
|
|
493
515
|
:host => 'some_server.com',
|
494
516
|
:remote_path => path
|
495
517
|
|
496
|
-
|
497
|
-
assert_ssh_call "mkdir -p /path/to/tasks"
|
518
|
+
shell = @app.find(:host => 'some_server.com').first.shell
|
498
519
|
|
499
|
-
|
500
|
-
from = "#{Sunshine::ROOT}/templates/tasks/#{task}.rake"
|
501
|
-
to = "#{ds.host}:#{path}/#{task}.rake"
|
520
|
+
use_remote_shell shell
|
502
521
|
|
503
|
-
|
504
|
-
|
522
|
+
assert_ssh_call "mkdir -p /path/to/tasks"
|
523
|
+
|
524
|
+
%w{common tpkg}.each do |task|
|
525
|
+
from = "#{Sunshine::ROOT}/templates/tasks/#{task}.rake"
|
526
|
+
to = "#{shell.host}:#{path}/#{task}.rake"
|
527
|
+
|
528
|
+
assert_rsync from, to
|
505
529
|
end
|
506
530
|
end
|
507
531
|
|
@@ -527,6 +551,21 @@ class TestApp < Test::Unit::TestCase
|
|
527
551
|
end
|
528
552
|
|
529
553
|
|
554
|
+
def test_with_filter
|
555
|
+
app = Sunshine::App.new :repo => {:type => "svn", :url => @svn_url},
|
556
|
+
:remote_shells => ["user@server1.com", "user@server2.com"]
|
557
|
+
|
558
|
+
assert_equal 2, app.server_apps.length
|
559
|
+
|
560
|
+
app.with_filter :host => 'server1.com' do |app|
|
561
|
+
assert_equal 1, app.server_apps.length
|
562
|
+
assert_equal 'server1.com', app.server_apps.first.shell.host
|
563
|
+
end
|
564
|
+
|
565
|
+
assert_equal 2, app.server_apps.length
|
566
|
+
end
|
567
|
+
|
568
|
+
|
530
569
|
def test_sudo_assignment
|
531
570
|
@app.sudo = "someuser"
|
532
571
|
|
@@ -545,10 +584,8 @@ class TestApp < Test::Unit::TestCase
|
|
545
584
|
assert_equal attr_hash[:root_path], app.root_path
|
546
585
|
|
547
586
|
attr_hash[:remote_shells].each_with_index do |server_def, i|
|
548
|
-
|
549
|
-
|
550
|
-
assert_equal host, app.server_apps[i].shell.host
|
551
|
-
assert_equal user, app.server_apps[i].shell.user
|
587
|
+
shell = Sunshine::RemoteShell.new(*server_def)
|
588
|
+
assert_equal shell, app.server_apps[i].shell
|
552
589
|
end
|
553
590
|
end
|
554
591
|
|
data/test/unit/test_nginx.rb
CHANGED
@@ -10,27 +10,16 @@ class TestNginx < Test::Unit::TestCase
|
|
10
10
|
|
11
11
|
@passenger = Sunshine::Nginx.new @app
|
12
12
|
@nginx = Sunshine::Nginx.new @app, :port => 5000, :point_to => @passenger
|
13
|
-
@gemout = <<-STR
|
14
13
|
|
15
|
-
|
14
|
+
@passenger_root = "/Library/Ruby/Gems/1.8/gems/passenger-2.2.11"
|
16
15
|
|
17
|
-
|
18
|
-
Author: Phusion - http://www.phusion.nl/
|
19
|
-
Rubyforge: http://rubyforge.org/projects/passenger
|
20
|
-
Homepage: http://www.modrails.com/
|
21
|
-
Installed at: /Library/Ruby/Gems/1.8
|
22
|
-
|
23
|
-
Apache module for Ruby on Rails support.
|
24
|
-
STR
|
25
|
-
|
26
|
-
@nginx_passenger_check =
|
27
|
-
"/opt/ruby-ypc/lib/ruby/gems/1.8/gems/passenger-2.2.11/ext/nginx"
|
16
|
+
@nginx_passenger_check = "#{@passenger_root}/ext/nginx"
|
28
17
|
end
|
29
18
|
|
30
19
|
|
31
20
|
def test_cmd
|
32
21
|
ds = @nginx.app.server_apps.first.shell
|
33
|
-
ds.set_mock_response 0, "
|
22
|
+
ds.set_mock_response 0, "passenger-config --root" => [:out, @passenger_root]
|
34
23
|
|
35
24
|
@nginx.start
|
36
25
|
@nginx.stop
|
@@ -42,7 +31,7 @@ passenger (2.2.4)
|
|
42
31
|
|
43
32
|
def test_custom_sudo_cmd
|
44
33
|
ds = @nginx.app.server_apps.first.shell
|
45
|
-
ds.set_mock_response 0, "
|
34
|
+
ds.set_mock_response 0, "passenger-config --root" => [:out, @passenger_root]
|
46
35
|
|
47
36
|
@nginx.sudo = "someuser"
|
48
37
|
|
@@ -70,14 +59,13 @@ passenger (2.2.4)
|
|
70
59
|
def test_setup_passenger
|
71
60
|
ds = @passenger.app.server_apps.first.shell
|
72
61
|
|
73
|
-
ds.set_mock_response 0,
|
74
|
-
|
75
|
-
"nginx -V 2>&1" => [:out, @nginx_passenger_check]
|
62
|
+
ds.set_mock_response 0, "passenger-config --root" => [:out, @passenger_root]
|
63
|
+
ds.set_mock_response 0, "nginx -V 2>&1" => [:out, @nginx_passenger_check]
|
76
64
|
|
77
65
|
@passenger.setup do |ds, binder|
|
78
66
|
assert binder.sudo
|
79
67
|
assert binder.use_passenger?
|
80
|
-
assert_equal "/Library/Ruby/Gems/1.8/gems/passenger-2.2.
|
68
|
+
assert_equal "/Library/Ruby/Gems/1.8/gems/passenger-2.2.11",
|
81
69
|
binder.passenger_root
|
82
70
|
end
|
83
71
|
end
|
@@ -85,12 +73,12 @@ passenger (2.2.4)
|
|
85
73
|
|
86
74
|
def test_setup
|
87
75
|
ds = @nginx.app.server_apps.first.shell
|
88
|
-
ds.set_mock_response 0, "
|
76
|
+
ds.set_mock_response 0, "passenger-config --root" => [:out, @passenger_root]
|
89
77
|
|
90
78
|
@nginx.setup do |ds, binder|
|
91
79
|
assert !binder.sudo
|
92
80
|
assert !binder.use_passenger?
|
93
|
-
assert_equal "/Library/Ruby/Gems/1.8/gems/passenger-2.2.
|
81
|
+
assert_equal "/Library/Ruby/Gems/1.8/gems/passenger-2.2.11",
|
94
82
|
binder.passenger_root
|
95
83
|
end
|
96
84
|
end
|
data/test/unit/test_server.rb
CHANGED
@@ -231,7 +231,7 @@ class TestServer < Test::Unit::TestCase
|
|
231
231
|
|
232
232
|
server.each_server_app do |sa|
|
233
233
|
%w{start stop restart status}.each do |script|
|
234
|
-
script_file = "#{server.config_path}/#{script}"
|
234
|
+
script_file = "#{@app.root_path}/env #{server.config_path}/#{script}"
|
235
235
|
cmd = sa.shell.sudo_cmd script_file, server.send(:pick_sudo, sa.shell)
|
236
236
|
|
237
237
|
assert sa.scripts[script.to_sym].include?(cmd.join(" "))
|
@@ -169,6 +169,23 @@ class TestServerApp < Test::Unit::TestCase
|
|
169
169
|
end
|
170
170
|
|
171
171
|
|
172
|
+
def test_has_all_roles
|
173
|
+
assert @sa.has_roles?([:web, :app, :blarg])
|
174
|
+
assert @sa.has_roles?([:web, :app, :blarg], true)
|
175
|
+
end
|
176
|
+
|
177
|
+
|
178
|
+
def test_has_roles
|
179
|
+
@sa.roles = [:web, :app]
|
180
|
+
|
181
|
+
assert @sa.has_roles?(:web)
|
182
|
+
assert @sa.has_roles?([:web, :app])
|
183
|
+
|
184
|
+
assert !@sa.has_roles?([:blarg, :web, :app])
|
185
|
+
assert @sa.has_roles?([:blarg, :web, :app], true)
|
186
|
+
end
|
187
|
+
|
188
|
+
|
172
189
|
def test_install_deps
|
173
190
|
nginx_dep = Sunshine.dependencies.get 'nginx', :prefer => @sa.pkg_manager
|
174
191
|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
version: 1.1.
|
8
|
+
- 2
|
9
|
+
version: 1.1.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jeremie Castagna
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-04-
|
17
|
+
date: 2010-04-15 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -108,9 +108,9 @@ files:
|
|
108
108
|
- README.txt
|
109
109
|
- Rakefile
|
110
110
|
- bin/sunshine
|
111
|
-
- examples/deploy.rb
|
112
111
|
- examples/deploy_tasks.rake
|
113
112
|
- examples/standalone_deploy.rb
|
113
|
+
- examples/sunshine_deploy.rb
|
114
114
|
- lib/commands/add.rb
|
115
115
|
- lib/commands/default.rb
|
116
116
|
- lib/commands/list.rb
|