brightbox 2.0.3 → 2.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/bin/brightbox +60 -20
- data/brightbox-gemspec.rb +2 -2
- data/lib/brightbox/maintenance.rb +24 -0
- data/lib/brightbox/recipes/callbacks.rb +4 -4
- data/lib/brightbox/recipes/configure.rb +47 -20
- data/lib/brightbox/recipes/deploy.rb +57 -2
- data/lib/brightbox/recipes/gems.rb +23 -2
- data/lib/brightbox/recipes/{shared_local.rb → shared_assets.rb} +61 -19
- data/lib/brightbox/recipes/variables.rb +14 -2
- data/lib/brightbox/version.rb +3 -1
- metadata +7 -5
data/bin/brightbox
CHANGED
@@ -29,15 +29,14 @@ require 'optparse'
|
|
29
29
|
require 'brightbox/version'
|
30
30
|
|
31
31
|
@options = {}
|
32
|
-
@progname = File.basename($0)
|
33
32
|
|
34
33
|
def has_required_options?
|
35
34
|
[@server].all?
|
36
35
|
end
|
37
36
|
|
38
|
-
OptionParser.new do |opts|
|
37
|
+
opts = OptionParser.new do |opts|
|
39
38
|
opts.banner = "Set up your Rails application for deployment\n"
|
40
|
-
opts.banner << "Usage: #{
|
39
|
+
opts.banner << "Usage: #{opts.program_name} [options] <directory_name>\n\n"
|
41
40
|
|
42
41
|
opts.on("-n APPLICATION_NAME", "--name APPLICATION_NAME",
|
43
42
|
"Name of application (a short useful",
|
@@ -57,16 +56,6 @@ OptionParser.new do |opts|
|
|
57
56
|
"(e.g: example-001.vm.brightbox.net)\n"
|
58
57
|
) { |value| @server = value }
|
59
58
|
|
60
|
-
opts.on_tail("-h", "--help", "Displays this help page") do
|
61
|
-
puts opts
|
62
|
-
exit 0
|
63
|
-
end
|
64
|
-
|
65
|
-
opts.on_tail("-v", "--version", "Displays the version number") do
|
66
|
-
puts "#{@progname}: version #{Brightbox::VERSION}"
|
67
|
-
exit 0
|
68
|
-
end
|
69
|
-
|
70
59
|
begin
|
71
60
|
opts.parse!(ARGV)
|
72
61
|
raise OptionParser::ParseError,
|
@@ -79,7 +68,7 @@ OptionParser.new do |opts|
|
|
79
68
|
end
|
80
69
|
|
81
70
|
|
82
|
-
abort "Please specify the directory containing the Rails app, e.g. '#{
|
71
|
+
abort "Please specify the directory containing the Rails app, e.g. '#{opts.program_name} .'" if ARGV.empty?
|
83
72
|
abort "Too many arguments; please provide a single directory name." unless ARGV.length == 1
|
84
73
|
abort "'#{ARGV.first}' does not exist." unless File.exists?(ARGV.first)
|
85
74
|
abort "'#{ARGV.first}' is not a directory." unless File.directory?(ARGV.first)
|
@@ -94,14 +83,14 @@ end
|
|
94
83
|
|
95
84
|
files = {
|
96
85
|
"Capfile" => unindent(<<-FILE),
|
97
|
-
# Generated with '#{
|
86
|
+
# Generated with '#{opts.program_name}' on #{Time.now}
|
98
87
|
load 'deploy' if respond_to?(:namespace) # cap2 differentiator
|
99
88
|
Dir['vendor/plugins/*/recipes/*.rb'].each { |plugin| load(plugin) }
|
100
89
|
load 'config/deploy'
|
101
90
|
FILE
|
102
91
|
|
103
92
|
"lib/tasks/bbgem.rake" => unindent(<<-FILE),
|
104
|
-
# Generated with '#{
|
93
|
+
# Generated with '#{opts.program_name}' on #{Time.now}
|
105
94
|
unless Rake::Task.task_defined?("gems:install")
|
106
95
|
def install_gems
|
107
96
|
gems={
|
@@ -187,7 +176,7 @@ end
|
|
187
176
|
FILE
|
188
177
|
|
189
178
|
"config/deploy.rb" => unindent(<<-FILE),
|
190
|
-
## Generated with '#{
|
179
|
+
## Generated with '#{opts.program_name}' on #{Time.now}
|
191
180
|
gem 'brightbox', '>=#{Brightbox::VERSION}'
|
192
181
|
require 'brightbox/recipes'
|
193
182
|
|
@@ -216,16 +205,44 @@ end
|
|
216
205
|
|
217
206
|
## Local Shared Area
|
218
207
|
# These are the list of files and directories that you want
|
219
|
-
# to share between
|
208
|
+
# to share between the releases of your application on a particular
|
209
|
+
# server. It uses the same shared area as the log files.
|
210
|
+
#
|
211
|
+
# NOTE: local areas trump global areas, allowing you to have some
|
212
|
+
# servers using local assets if required.
|
213
|
+
#
|
220
214
|
# So if you have an 'upload' directory in public, add 'public/upload'
|
221
215
|
# to the :local_shared_dirs array.
|
222
216
|
# If you want to share the database.yml add 'config/database.yml'
|
223
217
|
# to the :local_shared_files array.
|
218
|
+
#
|
224
219
|
# The shared area is prepared with 'deploy:setup' and all the shared
|
225
220
|
# items are symlinked in when the code is updated.
|
226
221
|
# set :local_shared_dirs, %w(public/upload)
|
227
222
|
# set :local_shared_files, %w(config/database.yml)
|
228
223
|
|
224
|
+
## Global Shared Area
|
225
|
+
# These are the list of files and directories that you want
|
226
|
+
# to share between all releases of your application across all servers.
|
227
|
+
# For it to work you need a directory on a network file server shared
|
228
|
+
# between all your servers. Specify the path to the root of that area
|
229
|
+
# in :global_shared_path. Defaults to the same value as :shared_path.
|
230
|
+
# set :global_shared_path, "/srv/share/myapp"
|
231
|
+
#
|
232
|
+
# NOTE: local areas trump global areas, allowing you to have some
|
233
|
+
# servers using local assets if required.
|
234
|
+
#
|
235
|
+
# Beyond that it is the same as the local shared area.
|
236
|
+
# So if you have an 'upload' directory in public, add 'public/upload'
|
237
|
+
# to the :global_shared_dirs array.
|
238
|
+
# If you want to share the database.yml add 'config/database.yml'
|
239
|
+
# to the :global_shared_files array.
|
240
|
+
#
|
241
|
+
# The shared area is prepared with 'deploy:setup' and all the shared
|
242
|
+
# items are symlinked in when the code is updated.
|
243
|
+
# set :global_shared_dirs, %w(public/upload)
|
244
|
+
# set :global_shared_files, %w(config/database.yml)
|
245
|
+
|
229
246
|
# SSL Certificates. If you specify an SSL certificate name then
|
230
247
|
# the gem will create an 'https' configuration for this application
|
231
248
|
# TODO: Upload and install the keys on the server
|
@@ -234,6 +251,15 @@ end
|
|
234
251
|
# or
|
235
252
|
# set :ssl_certificate, "name_of_installed_certificate"
|
236
253
|
|
254
|
+
## Static asset caching.
|
255
|
+
# By default static assets served directly by the web server are
|
256
|
+
# cached by the client web browser for 10 years, and cache invalidation
|
257
|
+
# of static assets is handled by the Rails helpers using asset
|
258
|
+
# timestamping.
|
259
|
+
# You may need to adjust this value if you have hard coded static
|
260
|
+
# assets, or other special cache requirements. The value is in seconds.
|
261
|
+
# set :max_age, 315360000
|
262
|
+
|
237
263
|
# SSH options. The forward agent option is used so that loopback logins
|
238
264
|
# with keys work properly
|
239
265
|
# ssh_options[:forward_agent] = true
|
@@ -261,12 +287,26 @@ end
|
|
261
287
|
# set :scm, :subversion
|
262
288
|
|
263
289
|
## Mongrel settings
|
264
|
-
#
|
265
|
-
#
|
290
|
+
# Addresses that Mongrel listens on. Defaults to :local
|
291
|
+
# Use :remote if your mongrels are on a different host to the web
|
292
|
+
# server.
|
293
|
+
# set :mongrel_host, :local
|
294
|
+
# set :mongrel_host, :remote
|
295
|
+
# set :mongrel_host, "192.168.1.1"
|
266
296
|
# Port number where mongrel starts. Defaults to 9200
|
267
297
|
# set :mongrel_port, 9200
|
268
298
|
# Number of mongrel servers to start. Defaults to 2
|
269
299
|
# set :mongrel_servers, 2
|
300
|
+
|
301
|
+
## Mongrel monitoring settings
|
302
|
+
# Url to check to make sure application is working.
|
303
|
+
# Defaults to "http://localhost"
|
304
|
+
# set :mongrel_check_url, "http://localhost"
|
305
|
+
# set :mongrel_check_url, "http://user:password@localhost/path/to/check"
|
306
|
+
# Maximum amount of memory to use per mongrel instance. Default 110Mb
|
307
|
+
# set :mongrel_max_memory, 110
|
308
|
+
# Maximum cpu allowable per mongrel. Defaults to 80%
|
309
|
+
# set :mongrel_max_cpu, 80
|
270
310
|
|
271
311
|
## Deployment settings
|
272
312
|
# The brightbox gem deploys as the user 'rails' by default and
|
data/brightbox-gemspec.rb
CHANGED
@@ -30,7 +30,7 @@ end
|
|
30
30
|
@server = Gem::Specification.new do |s|
|
31
31
|
add_common(s)
|
32
32
|
s.name = "brightbox-server-tools"
|
33
|
-
s.files = FileList["LICENSE", "Rakefile", "*.rb", "bin/railsapp-*","{
|
33
|
+
s.files = FileList["LICENSE", "Rakefile", "*.rb", "bin/railsapp-*","lib/**/*.{rb,gz}"].exclude(/recipe/).to_a
|
34
34
|
s.summary = "Brightbox Server configuration scripts"
|
35
35
|
s.executables = FileList["bin/railsapp-*"].sub(/bin\//,'')
|
36
36
|
end
|
@@ -39,7 +39,7 @@ end
|
|
39
39
|
add_common(s)
|
40
40
|
s.name = "brightbox"
|
41
41
|
s.files = FileList["LICENSE", "Rakefile", "*.rb", "lib/**/*.rb","bin/brightbox"].exclude("lib/brightbox/webserver-common.rb").to_a
|
42
|
-
s.add_dependency("capistrano", ">= 2.
|
42
|
+
s.add_dependency("capistrano", ">= 2.5")
|
43
43
|
s.summary = "Brightbox rails deployment scripts for Capistrano"
|
44
44
|
s.executable = 'brightbox'
|
45
45
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Brightbox - Easy Ruby Web Application Deployment
|
2
|
+
# Copyright (C) 2008, Neil Wilson, Brightbox Systems
|
3
|
+
#
|
4
|
+
# This file is part of the Brightbox deployment system
|
5
|
+
#
|
6
|
+
# Brightbox gem is free software: you can redistribute it and/or modify it
|
7
|
+
# under the terms of the GNU Affero General Public License as published
|
8
|
+
# by the Free Software Foundation, either version 3 of the License,
|
9
|
+
# or (at your option) any later version.
|
10
|
+
#
|
11
|
+
# This program is distributed in the hope that it will be useful,
|
12
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14
|
+
# Affero General Public License for more details.
|
15
|
+
#
|
16
|
+
# You should have received a copy of the GNU Affero General
|
17
|
+
# Public License along with this program. If not, see
|
18
|
+
# <http://www.gnu.org/licenses/>.
|
19
|
+
#
|
20
|
+
|
21
|
+
def deploy_maintenance_page(system_directory)
|
22
|
+
maintenance_site = File.join(File.dirname(__FILE__),"maintenance-site.tar.gz")
|
23
|
+
system ("tar --directory #{system_directory} --extract --gzip --file #{maintenance_site}")
|
24
|
+
end
|
@@ -20,7 +20,9 @@
|
|
20
20
|
# Hook tasks into the standard deployment system
|
21
21
|
|
22
22
|
after "deploy:setup",
|
23
|
+
"deploy:shared:global:setup",
|
23
24
|
"deploy:shared:local:setup",
|
25
|
+
"configure:maintenance",
|
24
26
|
"configure:logrotation",
|
25
27
|
"configure:monit",
|
26
28
|
"configure:mongrel",
|
@@ -31,15 +33,13 @@ after "deploy:cold",
|
|
31
33
|
"deploy:monit:reload"
|
32
34
|
|
33
35
|
after "deploy:finalize_update",
|
36
|
+
"deploy:shared:global:symlink",
|
34
37
|
"deploy:shared:local:symlink",
|
35
|
-
"
|
38
|
+
"deploy:rake_tasks"
|
36
39
|
|
37
40
|
after "deploy:update",
|
38
41
|
"deploy:cleanup"
|
39
42
|
|
40
|
-
before "deploy:migrate",
|
41
|
-
"db:check:config",
|
42
|
-
"db:create"
|
43
43
|
|
44
44
|
after "deploy:start",
|
45
45
|
"deploy:web:reload_if_new"
|
@@ -19,34 +19,34 @@
|
|
19
19
|
#
|
20
20
|
|
21
21
|
def monit_setup
|
22
|
-
"
|
22
|
+
"railsapp-monit"
|
23
23
|
end
|
24
24
|
depend :remote, :command, monit_setup
|
25
25
|
|
26
26
|
def apache_setup
|
27
|
-
"
|
27
|
+
"railsapp-apache"
|
28
28
|
end
|
29
29
|
depend :remote, :command, apache_setup
|
30
30
|
|
31
31
|
def nginx_setup
|
32
|
-
"
|
32
|
+
"railsapp-nginx"
|
33
33
|
end
|
34
34
|
depend :remote, :command, nginx_setup
|
35
35
|
|
36
36
|
def mongrel_setup
|
37
|
-
"
|
37
|
+
"railsapp-mongrel"
|
38
38
|
end
|
39
39
|
depend :remote, :command, mongrel_setup
|
40
40
|
|
41
41
|
def logrotate_setup
|
42
|
-
"
|
42
|
+
"railsapp-logrotate"
|
43
43
|
end
|
44
44
|
depend :remote, :command, logrotate_setup
|
45
45
|
|
46
|
-
def
|
47
|
-
"
|
46
|
+
def maintenance_setup
|
47
|
+
"railsapp-maintenance"
|
48
48
|
end
|
49
|
-
depend :remote, :command,
|
49
|
+
depend :remote, :command, maintenance_setup
|
50
50
|
|
51
51
|
namespace :configure do
|
52
52
|
|
@@ -66,15 +66,24 @@ namespace :configure do
|
|
66
66
|
|
67
67
|
}
|
68
68
|
task webserver, :roles => :web, :except => {:no_release => true} do
|
69
|
+
app_hosts = case mongrel_host
|
70
|
+
when :local
|
71
|
+
"localhost"
|
72
|
+
when :remote
|
73
|
+
roles[:app].servers.join(",")
|
74
|
+
else
|
75
|
+
mongrel_host
|
76
|
+
end
|
69
77
|
sudo on_one_line( <<-END
|
70
78
|
#{send(webserver.to_s + "_setup")}
|
71
79
|
-n #{application}
|
72
80
|
-d #{domain}
|
73
81
|
#{'-a '+domain_aliases if domain_aliases}
|
74
82
|
-w #{File.join(current_path, 'public')}
|
75
|
-
-h #{
|
83
|
+
-h #{app_hosts}
|
76
84
|
-p #{mongrel_port}
|
77
85
|
-s #{mongrel_servers}
|
86
|
+
#{'-m '+max_age if max_age}
|
78
87
|
#{'-c '+ssl_certificate if ssl_certificate}
|
79
88
|
#{'-k '+ssl_key if ssl_key}
|
80
89
|
END
|
@@ -87,22 +96,31 @@ end
|
|
87
96
|
on the specified ports of the application server(s).
|
88
97
|
|
89
98
|
:application Name of the application
|
90
|
-
:mongrel_host
|
99
|
+
:mongrel_host Address for mongrels to listen to (default localhost)
|
91
100
|
:mongrel_port Start port of the mongrel cluster (default 8000)
|
92
101
|
:mongrel_servers Number of servers on app host (default 2)
|
93
102
|
:mongrel_pid_file The name of the file containing the mongrel PID
|
94
103
|
|
95
104
|
}
|
96
105
|
task :mongrel, :roles => :app, :except => {:no_release => true} do
|
106
|
+
listen_address = case mongrel_host
|
107
|
+
when :local
|
108
|
+
"localhost"
|
109
|
+
when :remote
|
110
|
+
"0.0.0.0"
|
111
|
+
else
|
112
|
+
mongrel_host
|
113
|
+
end
|
97
114
|
sudo on_one_line( <<-END
|
98
115
|
#{mongrel_setup}
|
99
116
|
-n #{application}
|
100
117
|
-r #{current_path}
|
101
118
|
-p #{mongrel_port}
|
102
119
|
-s #{mongrel_servers}
|
103
|
-
-h #{
|
120
|
+
-h #{listen_address}
|
104
121
|
-C #{mongrel_config_file}
|
105
122
|
-P #{mongrel_pid_file}
|
123
|
+
-e #{rails_env}
|
106
124
|
END
|
107
125
|
)
|
108
126
|
end
|
@@ -117,17 +135,26 @@ end
|
|
117
135
|
:mongrel_servers Number of servers on app host (default 2)
|
118
136
|
|
119
137
|
}
|
120
|
-
task :monit, :except => {:no_release => true} do
|
138
|
+
task :monit, :roles => :app, :except => {:no_release => true} do
|
139
|
+
listen_address = case mongrel_host
|
140
|
+
when :local, :remote
|
141
|
+
"localhost"
|
142
|
+
else
|
143
|
+
mongrel_host
|
144
|
+
end
|
121
145
|
sudo on_one_line( <<-END
|
122
146
|
#{monit_setup}
|
123
147
|
-n #{application}
|
124
148
|
-u #{user}
|
125
149
|
-r #{current_path}
|
126
|
-
-h #{
|
150
|
+
-h #{listen_address}
|
127
151
|
-p #{mongrel_port}
|
128
152
|
-s #{mongrel_servers}
|
129
153
|
-C #{mongrel_config_file}
|
130
154
|
-P #{mongrel_pid_file}
|
155
|
+
-U #{mongrel_check_url}
|
156
|
+
-m #{mongrel_max_memory}
|
157
|
+
-c #{mongrel_max_cpu}
|
131
158
|
END
|
132
159
|
)
|
133
160
|
end
|
@@ -152,6 +179,13 @@ end
|
|
152
179
|
)
|
153
180
|
end
|
154
181
|
|
182
|
+
desc %Q{
|
183
|
+
[internal]Create the default maintenance website on the appropriate web servers in the shared area.
|
184
|
+
}
|
185
|
+
task :maintenance, :roles => :web, :except => {:no_release => true} do
|
186
|
+
run "#{maintenance_setup} #{shared_path}/system"
|
187
|
+
end
|
188
|
+
|
155
189
|
desc %Q{
|
156
190
|
[internal]Run the check command if this application hasn't been
|
157
191
|
deployed yet
|
@@ -167,12 +201,5 @@ end
|
|
167
201
|
end
|
168
202
|
end
|
169
203
|
|
170
|
-
desc %Q{
|
171
|
-
[internal]Check the current database.yml file and update the
|
172
|
-
details from the .my.cnf file on the server if it exists.
|
173
|
-
}
|
174
|
-
task :mysql, :roles => :db, :only => {:primary => true} do
|
175
|
-
try_sudo "#{mysql_setup} -n #{application} #{latest_release}/config/database.yml"
|
176
|
-
end
|
177
204
|
|
178
205
|
end
|
@@ -66,10 +66,15 @@ namespace :deploy do
|
|
66
66
|
namespace :web do
|
67
67
|
|
68
68
|
desc %Q{
|
69
|
-
Reload the
|
69
|
+
Reload the webserver
|
70
70
|
}
|
71
71
|
task :reload, :roles => :web, :except => {:no_release => true } do
|
72
|
-
|
72
|
+
%w(apache2 nginx).each do |webserver|
|
73
|
+
initscript = "/etc/init.d/#{webserver}"
|
74
|
+
sudo %Q{
|
75
|
+
sh -c '[ -f #{initscript} ] && #{initscript} reload || true'
|
76
|
+
}
|
77
|
+
end
|
73
78
|
end
|
74
79
|
|
75
80
|
desc %Q{
|
@@ -80,6 +85,30 @@ namespace :deploy do
|
|
80
85
|
reload if releases.length == 1
|
81
86
|
end
|
82
87
|
|
88
|
+
def maintenance_page
|
89
|
+
"#{current_path}/public/system/maintenance.html"
|
90
|
+
end
|
91
|
+
|
92
|
+
desc %Q{
|
93
|
+
Return a 503 Service Temporarily Unavailable error code and display \
|
94
|
+
the 'system maintenance' page.
|
95
|
+
}
|
96
|
+
task :disable, :roles => :web, :except => { :no_release => true } do
|
97
|
+
on_rollback {
|
98
|
+
run "rm #{maintenance_page}"
|
99
|
+
}
|
100
|
+
run "ln -s #{File.dirname(maintenance_page)}/index.html #{maintenance_page}"
|
101
|
+
end
|
102
|
+
|
103
|
+
desc %Q{
|
104
|
+
Makes the application web-accessible again. Removes the link \
|
105
|
+
to the maintenance area.
|
106
|
+
}
|
107
|
+
task :enable, :roles => :web, :except => { :no_release => true } do
|
108
|
+
run "rm #{maintenance_page}"
|
109
|
+
end
|
110
|
+
|
111
|
+
|
83
112
|
end
|
84
113
|
|
85
114
|
namespace :monit do
|
@@ -101,4 +130,30 @@ namespace :deploy do
|
|
101
130
|
cold
|
102
131
|
end
|
103
132
|
|
133
|
+
namespace :rake_tasks do
|
134
|
+
|
135
|
+
desc %Q{
|
136
|
+
Execute Rake tasks that need to be run once per system
|
137
|
+
}
|
138
|
+
task :singleton, :roles => :db, :only => {:primary => true} do
|
139
|
+
run rake_task("db:check:config")
|
140
|
+
run rake_task("db:create")
|
141
|
+
end
|
142
|
+
|
143
|
+
desc %Q{
|
144
|
+
Execute Rake tasks that need to be run on all deployments
|
145
|
+
}
|
146
|
+
task :global, :except => {:no_release => true} do
|
147
|
+
gems.install
|
148
|
+
end
|
149
|
+
|
150
|
+
desc %Q{
|
151
|
+
Execute Rake tasks
|
152
|
+
}
|
153
|
+
task :default do
|
154
|
+
singleton
|
155
|
+
global
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
104
159
|
end
|
@@ -20,11 +20,32 @@
|
|
20
20
|
|
21
21
|
namespace :gems do
|
22
22
|
|
23
|
+
def gem_dependencies?
|
24
|
+
(fetch(:dependencies,{})[:remote]||{})[:gem]
|
25
|
+
end
|
26
|
+
|
27
|
+
def install_gems
|
28
|
+
deps = gem_dependencies?
|
29
|
+
deps.each do |gemspec|
|
30
|
+
gem = gemspec[0]
|
31
|
+
version = gemspec[1]
|
32
|
+
puts "Checking for #{gem} at #{version}"
|
33
|
+
sudo %Q{sh -c "
|
34
|
+
gem spec #{gem} --version '#{version}' 2>/dev/null|egrep -q '^name:' ||
|
35
|
+
sudo gem install -y --no-ri --no-rdoc --version '#{version}' #{gem}"
|
36
|
+
}
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
23
40
|
desc %Q{
|
24
41
|
[internal]Run the gems install task in the application.
|
25
42
|
}
|
26
|
-
task :install, :
|
27
|
-
|
43
|
+
task :install, :except => {:no_release => true} do
|
44
|
+
if gem_dependencies?
|
45
|
+
install_gems
|
46
|
+
else
|
47
|
+
sudo rake_task("gems:install")
|
48
|
+
end
|
28
49
|
end
|
29
50
|
|
30
51
|
end
|
@@ -17,16 +17,44 @@
|
|
17
17
|
# Public License along with this program. If not, see
|
18
18
|
# <http://www.gnu.org/licenses/>.
|
19
19
|
#
|
20
|
-
# Manage the
|
20
|
+
# Manage the shared areas
|
21
21
|
|
22
22
|
namespace :deploy do
|
23
23
|
namespace :shared do
|
24
|
+
|
25
|
+
def fetch_shared_dirs(shared_files, shared_dirs, shared_path)
|
26
|
+
dirs = shared_files.to_a.collect do |file|
|
27
|
+
File.join(shared_path, File.dirname(file))
|
28
|
+
end
|
29
|
+
dirs += shared_dirs.to_a.collect do |dir|
|
30
|
+
File.join(shared_path, dir)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def setup_shared_dirs(shared_files, shared_dirs, shared_path)
|
35
|
+
dirs = fetch_shared_dirs(shared_files, shared_dirs, shared_path)
|
36
|
+
dir_list = dirs.join(' ')
|
37
|
+
run "#{try_sudo} mkdir -p #{dir_list} && #{try_sudo} chmod g+w #{dir_list}" unless dirs.empty?
|
38
|
+
end
|
39
|
+
|
40
|
+
def create_shared_links(shared_files, shared_dirs, shared_path)
|
41
|
+
resources = shared_dirs.to_a+shared_files.to_a
|
42
|
+
run %Q{
|
43
|
+
cd #{latest_release} &&
|
44
|
+
rm -rf #{resources.join(' ')}
|
45
|
+
}
|
46
|
+
links = resources.collect do |resource|
|
47
|
+
"ln -sf #{File.join(shared_path,resource)} #{File.join(latest_release, resource)}"
|
48
|
+
end.join(" && ")
|
49
|
+
run links unless links.empty?
|
50
|
+
end
|
51
|
+
|
24
52
|
namespace :local do
|
25
53
|
|
26
54
|
desc %Q(
|
27
55
|
[internal] Creates shared directories. This is called by the setup
|
28
|
-
routine to create the directory structure within the shared area
|
29
|
-
references two arrays.
|
56
|
+
routine to create the directory structure within the shared area
|
57
|
+
referenced by :shared_path. It references two arrays.
|
30
58
|
|
31
59
|
:local_shared_files - the list of files that should be shared
|
32
60
|
between releases.
|
@@ -34,13 +62,7 @@ namespace :deploy do
|
|
34
62
|
shared between releases.
|
35
63
|
)
|
36
64
|
task :setup, :except => {:no_release => true} do
|
37
|
-
|
38
|
-
File.join(shared_path, File.dirname(file))
|
39
|
-
end
|
40
|
-
dirs += local_shared_dirs.collect do |dir|
|
41
|
-
File.join(shared_path, dir)
|
42
|
-
end
|
43
|
-
try_sudo "umask 02 && mkdir -p #{dirs.join(' ')}" unless dirs.empty?
|
65
|
+
setup_shared_dirs(local_shared_files, local_shared_dirs, shared_path)
|
44
66
|
end
|
45
67
|
|
46
68
|
desc %Q{
|
@@ -49,16 +71,36 @@ namespace :deploy do
|
|
49
71
|
:local_shared_files
|
50
72
|
}
|
51
73
|
task :symlink, :except => {:no_release => true} do
|
52
|
-
|
53
|
-
run %Q{
|
54
|
-
cd #{latest_release} &&
|
55
|
-
rm -rf #{resources.join(' ')}
|
56
|
-
}
|
57
|
-
links = resources.collect do |resource|
|
58
|
-
"ln -sf #{File.join(shared_path,resource)} #{File.join(latest_release, resource)}"
|
59
|
-
end.join(" && ")
|
60
|
-
run links unless links.empty?
|
74
|
+
create_shared_links(local_shared_files, local_shared_dirs, shared_path)
|
61
75
|
end
|
76
|
+
end
|
77
|
+
|
78
|
+
namespace :global do
|
79
|
+
|
80
|
+
desc %Q(
|
81
|
+
[internal] Creates shared directories in the global area referenced
|
82
|
+
by :global_shared_path. This is called by the setup routine to
|
83
|
+
create the directory structure within the shared area. It references
|
84
|
+
two arrays.
|
85
|
+
|
86
|
+
:global_shared_files - the list of files that should be shared
|
87
|
+
between all releases on all servers.
|
88
|
+
:global_shared_dirs - the list of directories that should be
|
89
|
+
shared between all releases on all servers.
|
90
|
+
)
|
91
|
+
task :setup, :except => {:no_release => true} do
|
92
|
+
setup_shared_dirs(global_shared_files, global_shared_dirs, global_shared_path)
|
93
|
+
end
|
94
|
+
|
95
|
+
desc %Q{
|
96
|
+
[internal] Sets up the symlinks between the latest release and all
|
97
|
+
the shared items described in :global_shared_dirs and
|
98
|
+
:global_shared_files
|
99
|
+
}
|
100
|
+
task :symlink, :except => {:no_release => true} do
|
101
|
+
create_shared_links(global_shared_files, global_shared_dirs, global_shared_path)
|
102
|
+
end
|
103
|
+
|
62
104
|
|
63
105
|
end
|
64
106
|
end
|
@@ -22,23 +22,35 @@ _cset :mongrel_pid_file, "tmp/pids/mongrel.pid" #Stores Process ID for Mongrels
|
|
22
22
|
_cset :log_max_size, "100M" #Size at which to rotate log
|
23
23
|
_cset :log_keep, "10" #Keep this many compressed logs
|
24
24
|
_cset(:log_dir) {File.join(current_path, 'log')}
|
25
|
-
_cset :mongrel_host,
|
25
|
+
_cset :mongrel_host, :local
|
26
26
|
_cset :mongrel_port, 9200
|
27
27
|
_cset :mongrel_servers, 2
|
28
28
|
_cset(:mongrel_config_file) {File.join(deploy_to, "#{application}_mongrel_config.yml")}
|
29
|
+
case mongrel_host
|
30
|
+
when :local, :remote
|
31
|
+
_cset :mongrel_check_url, "http://localhost"
|
32
|
+
else
|
33
|
+
_cset :mongrel_check_url, "http://#{mongrel_host}"
|
34
|
+
end
|
35
|
+
_cset :mongrel_max_memory, 110
|
36
|
+
_cset :mongrel_max_cpu, 80
|
29
37
|
_cset(:domain) { abort "You need to set the :domain variable, e.g set :domain 'www.example.com'" }
|
30
38
|
_cset :domain_aliases, nil
|
39
|
+
_cset :max_age, nil
|
31
40
|
_cset :user, "rails"
|
32
41
|
_cset :runner, user
|
33
42
|
_cset :use_sudo, false
|
34
43
|
_cset :ssl_certificate, nil
|
35
44
|
_cset :ssl_key, nil
|
45
|
+
_cset :rails_env, "production"
|
36
46
|
ssh_options[:forward_agent] = true
|
37
47
|
|
38
48
|
# Default system dependencies
|
39
|
-
depend :remote, :gem, "rails", ">=2"
|
40
49
|
depend :remote, :command, "mongrel_rails"
|
41
50
|
|
42
51
|
# Default shared areas
|
43
52
|
_cset :local_shared_dirs, []
|
44
53
|
_cset :local_shared_files, []
|
54
|
+
_cset :global_shared_dirs, []
|
55
|
+
_cset :global_shared_files, []
|
56
|
+
_cset(:global_shared_path) { shared_path }
|
data/lib/brightbox/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brightbox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Leach
|
@@ -10,17 +10,18 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2008-
|
13
|
+
date: 2008-10-08 00:00:00 +01:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: capistrano
|
18
|
+
type: :runtime
|
18
19
|
version_requirement:
|
19
20
|
version_requirements: !ruby/object:Gem::Requirement
|
20
21
|
requirements:
|
21
22
|
- - ">="
|
22
23
|
- !ruby/object:Gem::Version
|
23
|
-
version: "2.
|
24
|
+
version: "2.5"
|
24
25
|
version:
|
25
26
|
description:
|
26
27
|
email: support@brightbox.co.uk
|
@@ -38,12 +39,13 @@ files:
|
|
38
39
|
- lib/brightbox/recipes/variables.rb
|
39
40
|
- lib/brightbox/recipes/gems.rb
|
40
41
|
- lib/brightbox/recipes/helpers.rb
|
42
|
+
- lib/brightbox/recipes/shared_assets.rb
|
41
43
|
- lib/brightbox/recipes/callbacks.rb
|
42
44
|
- lib/brightbox/recipes/database.rb
|
43
45
|
- lib/brightbox/recipes/deploy.rb
|
44
|
-
- lib/brightbox/recipes/shared_local.rb
|
45
46
|
- lib/brightbox/version.rb
|
46
47
|
- lib/brightbox/recipes.rb
|
48
|
+
- lib/brightbox/maintenance.rb
|
47
49
|
- bin/brightbox
|
48
50
|
has_rdoc: false
|
49
51
|
homepage: http://wiki.brightbox.co.uk/docs:thebrightboxgem
|
@@ -67,7 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
67
69
|
requirements: []
|
68
70
|
|
69
71
|
rubyforge_project: brightbox
|
70
|
-
rubygems_version: 1.
|
72
|
+
rubygems_version: 1.2.0
|
71
73
|
signing_key:
|
72
74
|
specification_version: 2
|
73
75
|
summary: Brightbox rails deployment scripts for Capistrano
|