engineyard-serverside 1.4.13 → 1.4.14
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/lib/engineyard-serverside/configuration.rb +1 -1
- data/lib/engineyard-serverside/deploy.rb +43 -19
- data/lib/engineyard-serverside/rails_asset_support.rb +96 -0
- data/lib/engineyard-serverside/version.rb +1 -1
- data/spec/basic_deploy_spec.rb +2 -0
- data/spec/bundler_deploy_spec.rb +11 -5
- data/spec/custom_deploy_spec.rb +2 -0
- data/spec/nodejs_deploy_spec.rb +36 -0
- data/spec/rails31_deploy_spec.rb +99 -0
- data/spec/spec_helper.rb +12 -2
- data/spec/support/integration.rb +47 -12
- metadata +9 -4
@@ -119,7 +119,7 @@ module EY
|
|
119
119
|
end
|
120
120
|
|
121
121
|
def framework_envs
|
122
|
-
"RAILS_ENV=#{environment} RACK_ENV=#{environment} MERB_ENV=#{environment}"
|
122
|
+
"RAILS_ENV=#{environment} RACK_ENV=#{environment} NODE_ENV=#{environment} MERB_ENV=#{environment}"
|
123
123
|
end
|
124
124
|
|
125
125
|
def current_path
|
@@ -2,11 +2,13 @@
|
|
2
2
|
require 'base64'
|
3
3
|
require 'fileutils'
|
4
4
|
require 'json'
|
5
|
+
require 'engineyard-serverside/rails_asset_support'
|
5
6
|
|
6
7
|
module EY
|
7
8
|
module Serverside
|
8
9
|
class DeployBase < Task
|
9
10
|
include LoggedOutput
|
11
|
+
include ::EY::Serverside::RailsAssetSupport
|
10
12
|
|
11
13
|
# default task
|
12
14
|
def deploy
|
@@ -29,7 +31,10 @@ module EY
|
|
29
31
|
symlink_configs
|
30
32
|
conditionally_enable_maintenance_page
|
31
33
|
run_with_callbacks(:migrate)
|
34
|
+
run_with_callbacks(:compile_assets) # defined in RailsAssetSupport
|
32
35
|
callback(:before_symlink)
|
36
|
+
# We don't use run_with_callbacks for symlink because we need
|
37
|
+
# to clean up manually if it fails.
|
33
38
|
symlink
|
34
39
|
end
|
35
40
|
|
@@ -127,6 +132,10 @@ module EY
|
|
127
132
|
"/engineyard/bin/app_#{c.app} deploy"
|
128
133
|
end
|
129
134
|
|
135
|
+
def clean_environment
|
136
|
+
"env -i PATH=$PATH HOME=$HOME GEM_PATH=$GEM_PATH GEM_HOME=$GEM_HOME"
|
137
|
+
end
|
138
|
+
|
130
139
|
# task
|
131
140
|
def bundle
|
132
141
|
if File.exist?("#{c.release_path}/Gemfile")
|
@@ -140,7 +149,7 @@ module EY
|
|
140
149
|
get_default_bundler_installer
|
141
150
|
end
|
142
151
|
|
143
|
-
sudo "#{serverside_bin} install_bundler #{bundler_installer.version}"
|
152
|
+
sudo "#{clean_environment} #{serverside_bin} install_bundler #{bundler_installer.version}"
|
144
153
|
|
145
154
|
bundled_gems_path = File.join(c.shared_path, "bundled_gems")
|
146
155
|
ruby_version_file = File.join(bundled_gems_path, "RUBY_VERSION")
|
@@ -160,10 +169,19 @@ module EY
|
|
160
169
|
end
|
161
170
|
end
|
162
171
|
|
163
|
-
run "cd #{c.release_path} && bundle _#{bundler_installer.version}_ install #{bundler_installer.options}"
|
172
|
+
run "cd #{c.release_path} && #{clean_environment} ruby -S bundle _#{bundler_installer.version}_ install #{bundler_installer.options}"
|
164
173
|
|
165
174
|
run "mkdir -p #{bundled_gems_path} && ruby -v > #{ruby_version_file} && uname -m > #{system_version_file}"
|
166
175
|
end
|
176
|
+
|
177
|
+
if File.exist?("#{c.release_path}/package.json")
|
178
|
+
unless run("which npm")
|
179
|
+
abort "*** [Error] package.json detected, but npm was not installed"
|
180
|
+
else
|
181
|
+
info "~> package.json detected, installing npm packages"
|
182
|
+
run "cd #{c.release_path} && npm install"
|
183
|
+
end
|
184
|
+
end
|
167
185
|
end
|
168
186
|
|
169
187
|
# task
|
@@ -219,24 +237,31 @@ module EY
|
|
219
237
|
end
|
220
238
|
|
221
239
|
def symlink_configs(release_to_link=c.release_path)
|
222
|
-
info "~>
|
223
|
-
|
224
|
-
"
|
225
|
-
|
226
|
-
"ln -nfs #{c.shared_path}/log #{release_to_link}/log",
|
227
|
-
"mkdir -p #{release_to_link}/public",
|
228
|
-
"mkdir -p #{release_to_link}/config",
|
229
|
-
"ln -nfs #{c.shared_path}/system #{release_to_link}/public/system",
|
230
|
-
"ln -nfs #{c.shared_path}/pids #{release_to_link}/tmp/pids",
|
231
|
-
"find #{c.shared_path}/config -type f -exec ln -s {} #{release_to_link}/config \\;",
|
232
|
-
"ln -nfs #{c.shared_path}/config/database.yml #{release_to_link}/config/database.yml",
|
233
|
-
"ln -nfs #{c.shared_path}/config/mongrel_cluster.yml #{release_to_link}/config/mongrel_cluster.yml",
|
234
|
-
].each do |cmd|
|
235
|
-
run cmd
|
240
|
+
info "~> Preparing shared resources for release"
|
241
|
+
symlink_tasks(release_to_link).each do |what, cmd|
|
242
|
+
info "~> #{what}"
|
243
|
+
run(cmd)
|
236
244
|
end
|
245
|
+
owner = [c.user, c.group].join(':')
|
246
|
+
info "~> Setting ownership to #{owner}"
|
247
|
+
sudo "chown -R #{owner} #{release_to_link}"
|
248
|
+
end
|
237
249
|
|
238
|
-
|
239
|
-
|
250
|
+
def symlink_tasks(release_to_link)
|
251
|
+
[
|
252
|
+
["Set group write permissions", "chmod -R g+w #{release_to_link}"],
|
253
|
+
["Remove revision-tracked shared directories from deployment", "rm -rf #{release_to_link}/log #{release_to_link}/public/system #{release_to_link}/tmp/pids"],
|
254
|
+
["Create tmp directory", "mkdir -p #{release_to_link}/tmp"],
|
255
|
+
["Symlink shared log directory", "ln -nfs #{c.shared_path}/log #{release_to_link}/log"],
|
256
|
+
["Create public directory if needed", "mkdir -p #{release_to_link}/public"],
|
257
|
+
["Create config directory if needed", "mkdir -p #{release_to_link}/config"],
|
258
|
+
["Create system directory if needed", "ln -nfs #{c.shared_path}/system #{release_to_link}/public/system"],
|
259
|
+
["Symlink shared pids directory", "ln -nfs #{c.shared_path}/pids #{release_to_link}/tmp/pids"],
|
260
|
+
["Symlink other shared config files", "find #{c.shared_path}/config -type f -not -name 'database.yml' -exec ln -s {} #{release_to_link}/config \\;"],
|
261
|
+
["Symlink mongrel_cluster.yml", "ln -nfs #{c.shared_path}/config/mongrel_cluster.yml #{release_to_link}/config/mongrel_cluster.yml"],
|
262
|
+
["Symlink database.yml", "ln -nfs #{c.shared_path}/config/database.yml #{release_to_link}/config/database.yml"],
|
263
|
+
["Symlink newrelic.yml if needed", "if [ -f \"#{c.shared_path}/config/newrelic.yml\" ]; then ln -nfs #{c.shared_path}/config/newrelic.yml #{release_to_link}/config/newrelic.yml; fi"],
|
264
|
+
]
|
240
265
|
end
|
241
266
|
|
242
267
|
# task
|
@@ -364,6 +389,5 @@ module EY
|
|
364
389
|
super
|
365
390
|
end
|
366
391
|
end
|
367
|
-
|
368
392
|
end
|
369
393
|
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
module EY
|
2
|
+
module Serverside
|
3
|
+
module RailsAssetSupport
|
4
|
+
def compile_assets
|
5
|
+
asset_dir = "#{c.release_path}/app/assets"
|
6
|
+
return unless app_needs_assets?
|
7
|
+
rails_version = bundled_rails_version
|
8
|
+
roles :app_master, :app, :solo do
|
9
|
+
keep_existing_assets
|
10
|
+
cmd = "cd #{c.release_path} && PATH=#{c.binstubs_path}:$PATH #{c.framework_envs} rake assets:precompile"
|
11
|
+
if rails_version
|
12
|
+
info "~> Precompiling assets for rails v#{version}"
|
13
|
+
else
|
14
|
+
info "~> [WARN] Precompiling assets even though Rails was not bundled."
|
15
|
+
end
|
16
|
+
run(cmd)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def app_needs_assets?
|
21
|
+
app_rb_path = File.join(c.release_path, 'config', 'application.rb')
|
22
|
+
return unless File.readable?(app_rb_path) # Not a Rails app in the first place.
|
23
|
+
return unless File.directory?(File.join(c.release_path, 'app', 'assets'))
|
24
|
+
if app_builds_own_assets?
|
25
|
+
info "~> public/assets already exists, skipping pre-compilation."
|
26
|
+
return
|
27
|
+
end
|
28
|
+
if app_disables_assets?(app_rb_path)
|
29
|
+
info "~> application.rb has disabled asset compilation. Skipping."
|
30
|
+
return
|
31
|
+
end
|
32
|
+
unless app_has_asset_task?
|
33
|
+
info "~> No 'assets:precompile' Rake task found. Skipping."
|
34
|
+
return
|
35
|
+
end
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
def app_disables_assets?(path)
|
40
|
+
disabled = nil
|
41
|
+
File.open(path) do |fd|
|
42
|
+
pattern = /^[^#].*config\.assets\.enabled\s+=\s+(false|nil)/
|
43
|
+
contents = fd.read
|
44
|
+
disabled = contents.match(pattern)
|
45
|
+
end
|
46
|
+
disabled
|
47
|
+
end
|
48
|
+
|
49
|
+
# Runs 'rake -T' to see if there is an assets:precompile task.
|
50
|
+
def app_has_asset_task?
|
51
|
+
# We just run this locally on the app master; everybody else should
|
52
|
+
# have the same code anyway.
|
53
|
+
task_check = "PATH=#{c.binstubs_path}:$PATH #{c.framework_envs} rake -T assets:precompile |grep 'assets:precompile'"
|
54
|
+
cmd = "cd #{c.release_path} && #{task_check}"
|
55
|
+
logged_system "cd #{c.release_path} && #{task_check}"
|
56
|
+
$? == 0
|
57
|
+
end
|
58
|
+
|
59
|
+
def app_builds_own_assets?
|
60
|
+
File.directory?(File.join(c.release_path, 'public', 'assets'))
|
61
|
+
end
|
62
|
+
|
63
|
+
# To support operations like Unicorn's hot reload, it is useful to have
|
64
|
+
# the prior release's assets as well. Otherwise, while a deploy is running,
|
65
|
+
# clients may request stale assets that you just deleted.
|
66
|
+
# Making use of this requires a properly-configured front-end HTTP server.
|
67
|
+
def keep_existing_assets
|
68
|
+
current = File.join(c.shared_path, 'assets')
|
69
|
+
last_asset_path = File.join(c.shared_path, 'last_assets')
|
70
|
+
# If there are current shared assets, move them under a 'last_assets' directory.
|
71
|
+
run <<-COMMAND
|
72
|
+
if [ -d #{current} ]; then
|
73
|
+
rm -rf #{last_asset_path} && mkdir #{last_asset_path} && mv #{current} #{last_asset_path} && mkdir -p #{current};
|
74
|
+
else
|
75
|
+
mkdir -p #{current} #{last_asset_path};
|
76
|
+
fi;
|
77
|
+
ln -nfs #{current} #{last_asset_path} #{c.release_path}/public
|
78
|
+
COMMAND
|
79
|
+
end
|
80
|
+
|
81
|
+
def bundled_rails_version(lockfile_path = nil)
|
82
|
+
lockfile_path ||= File.join(c.release_path, 'Gemfile.lock')
|
83
|
+
lockfile = File.open(lockfile_path) {|f| f.read}
|
84
|
+
lockfile.each_line do |line|
|
85
|
+
# scan for gemname (version) toplevel deps.
|
86
|
+
# Likely doesn't handle ancient Bundler versions, but
|
87
|
+
# we only call this when something looks like it is Rails 3.
|
88
|
+
next unless line =~ /^\s{4}([-\w_.0-9]+)\s*\((.*)\)/
|
89
|
+
return $2 if $1 == 'rails'
|
90
|
+
end
|
91
|
+
nil
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
data/spec/basic_deploy_spec.rb
CHANGED
@@ -39,6 +39,8 @@ describe "Deploying an application without Bundler" do
|
|
39
39
|
File.exist?(File.join(@deploy_dir, 'current', 'after_bundle.ran' )).should be_true
|
40
40
|
File.exist?(File.join(@deploy_dir, 'current', 'before_migrate.ran')).should be_true
|
41
41
|
File.exist?(File.join(@deploy_dir, 'current', 'after_migrate.ran' )).should be_true
|
42
|
+
File.exist?(File.join(@deploy_dir, 'current', 'before_compile_assets.ran')).should be_true
|
43
|
+
File.exist?(File.join(@deploy_dir, 'current', 'after_compile_assets.ran' )).should be_true
|
42
44
|
File.exist?(File.join(@deploy_dir, 'current', 'before_symlink.ran')).should be_true
|
43
45
|
File.exist?(File.join(@deploy_dir, 'current', 'after_symlink.ran' )).should be_true
|
44
46
|
File.exist?(File.join(@deploy_dir, 'current', 'before_restart.ran')).should be_true
|
data/spec/bundler_deploy_spec.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "Deploying an application that uses Bundler" do
|
4
|
+
before(:each) do
|
5
|
+
@bundler_version = ::EY::Serverside::LockfileParser.default_version
|
6
|
+
@version_pattern = Regexp.quote(@bundler_version)
|
7
|
+
end
|
8
|
+
|
4
9
|
def deploy_test_application
|
5
10
|
@deploy_dir = File.join(Dir.tmpdir, "serverside-deploy-#{Time.now.to_i}-#{$$}")
|
6
11
|
|
@@ -40,11 +45,11 @@ describe "Deploying an application that uses Bundler" do
|
|
40
45
|
it "runs the right bundler command" do
|
41
46
|
install_bundler_command_ran = @deployer.commands.detect{ |command| command.index("install_bundler") }
|
42
47
|
install_bundler_command_ran.should_not be_nil
|
43
|
-
install_bundler_command_ran.should
|
48
|
+
install_bundler_command_ran.should include("#{@binpath} install_bundler #{@bundler_version}")
|
44
49
|
end
|
45
50
|
|
46
51
|
it "runs 'bundle install' with --deployment" do
|
47
|
-
bundle_install_cmd = @deployer.commands.grep(/bundle _
|
52
|
+
bundle_install_cmd = @deployer.commands.grep(/bundle _#{@version_pattern}_ install/).first
|
48
53
|
bundle_install_cmd.should_not be_nil
|
49
54
|
bundle_install_cmd.should include('--deployment')
|
50
55
|
end
|
@@ -83,14 +88,15 @@ describe "Deploying an application that uses Bundler" do
|
|
83
88
|
deploy_test_application
|
84
89
|
end
|
85
90
|
|
86
|
-
it "
|
91
|
+
it "installs the proper Bundler version" do
|
92
|
+
@bundler_version.should == "1.0.10" # Something should break when the default changes.
|
87
93
|
install_bundler_command_ran = @deployer.commands.detect{ |command| command.index("install_bundler") }
|
88
94
|
install_bundler_command_ran.should_not be_nil
|
89
|
-
install_bundler_command_ran.should
|
95
|
+
install_bundler_command_ran.should include("#{@binpath} install_bundler #{@bundler_version}")
|
90
96
|
end
|
91
97
|
|
92
98
|
it "runs 'bundle install' without --deployment" do
|
93
|
-
bundle_install_cmd = @deployer.commands.grep(/bundle _
|
99
|
+
bundle_install_cmd = @deployer.commands.grep(/bundle _#{@version_pattern}_ install/).first
|
94
100
|
bundle_install_cmd.should_not be_nil
|
95
101
|
bundle_install_cmd.should_not include('--deployment')
|
96
102
|
end
|
data/spec/custom_deploy_spec.rb
CHANGED
@@ -24,6 +24,7 @@ describe "the EY::Serverside::Deploy API" do
|
|
24
24
|
def bundle() @call_order << 'bundle' end
|
25
25
|
def symlink_configs() @call_order << 'symlink_configs' end
|
26
26
|
def migrate() @call_order << 'migrate' end
|
27
|
+
def compile_assets() @call_order << 'compile_assets' end
|
27
28
|
def symlink() @call_order << 'symlink' end
|
28
29
|
def restart() @call_order << 'restart' end
|
29
30
|
def cleanup_old_releases() @call_order << 'cleanup_old_releases' end
|
@@ -41,6 +42,7 @@ describe "the EY::Serverside::Deploy API" do
|
|
41
42
|
symlink_configs
|
42
43
|
conditionally_enable_maintenance_page
|
43
44
|
migrate
|
45
|
+
compile_assets
|
44
46
|
symlink
|
45
47
|
restart
|
46
48
|
disable_maintenance_page
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Deploying an application that uses Node.js and NPM" do
|
4
|
+
def deploy_test_application
|
5
|
+
@deploy_dir = File.join(Dir.tmpdir, "serverside-deploy-#{Time.now.to_i}-#{$$}")
|
6
|
+
|
7
|
+
# set up EY::Serverside::Server like we're on a solo
|
8
|
+
EY::Serverside::Server.reset
|
9
|
+
EY::Serverside::Server.add(:hostname => 'localhost', :roles => %w[solo])
|
10
|
+
|
11
|
+
# run a deploy
|
12
|
+
config = EY::Serverside::Deploy::Configuration.new({
|
13
|
+
"strategy" => "NodeIntegrationSpec",
|
14
|
+
"deploy_to" => @deploy_dir,
|
15
|
+
"group" => `id -gn`.strip,
|
16
|
+
"stack" => 'nginx_nodejs',
|
17
|
+
'app' => 'nodeapp',
|
18
|
+
'framework_env' => 'staging'
|
19
|
+
})
|
20
|
+
|
21
|
+
@binpath = File.expand_path(File.join(File.dirname(__FILE__), '..', 'bin', 'engineyard-serverside'))
|
22
|
+
@deployer = FullTestDeploy.new(config)
|
23
|
+
@deployer.deploy
|
24
|
+
end
|
25
|
+
|
26
|
+
before(:all) do
|
27
|
+
deploy_test_application
|
28
|
+
end
|
29
|
+
|
30
|
+
it "runs 'npm install'" do
|
31
|
+
install_cmd = @deployer.commands.grep(/npm install/).first
|
32
|
+
install_cmd.should_not be_nil
|
33
|
+
end
|
34
|
+
end if $NPM_INSTALLED
|
35
|
+
|
36
|
+
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "Deploying a Rails 3.1 application" do
|
4
|
+
def deploy_test_application(assets_enabled = true, &block)
|
5
|
+
$DISABLE_GEMFILE = false
|
6
|
+
$DISABLE_LOCKFILE = false
|
7
|
+
@deploy_dir = File.join(Dir.tmpdir, "serverside-deploy-#{Time.now.to_i}-#{$$}")
|
8
|
+
|
9
|
+
# set up EY::Serverside::Server like we're on a solo
|
10
|
+
EY::Serverside::Server.reset
|
11
|
+
EY::Serverside::Server.add(:hostname => 'localhost', :roles => %w[solo])
|
12
|
+
|
13
|
+
# run a deploy
|
14
|
+
@config = EY::Serverside::Deploy::Configuration.new({
|
15
|
+
"strategy" => "IntegrationSpec",
|
16
|
+
"deploy_to" => @deploy_dir,
|
17
|
+
"group" => `id -gn`.strip,
|
18
|
+
"stack" => 'nginx_passenger',
|
19
|
+
"migrate" => "ruby -e 'puts ENV[\"PATH\"]' > #{@deploy_dir}/path-when-migrating",
|
20
|
+
'app' => 'rails31',
|
21
|
+
'framework_env' => 'staging'
|
22
|
+
})
|
23
|
+
|
24
|
+
# pretend there is a shared bundled_gems directory
|
25
|
+
FileUtils.mkdir_p(File.join(@deploy_dir, 'shared', 'bundled_gems'))
|
26
|
+
%w(RUBY_VERSION SYSTEM_VERSION).each do |name|
|
27
|
+
File.open(File.join(@deploy_dir, 'shared', 'bundled_gems', name), "w") { |f| f.write("old\n") }
|
28
|
+
end
|
29
|
+
|
30
|
+
# Set up the application directory to have the requested asset options.
|
31
|
+
prepare_rails31_app(assets_enabled)
|
32
|
+
|
33
|
+
@binpath = File.expand_path(File.join(File.dirname(__FILE__), '..', 'bin', 'engineyard-serverside'))
|
34
|
+
@deployer = FullTestDeploy.new(@config)
|
35
|
+
@deployer.deploy(&block)
|
36
|
+
end
|
37
|
+
|
38
|
+
def prepare_rails31_app(assets_enabled)
|
39
|
+
FileUtils.mkdir_p(File.join(@config.release_path, 'config'))
|
40
|
+
app_rb = File.join(@config.release_path, 'config', 'application.rb')
|
41
|
+
app_rb_contents = <<-EOF
|
42
|
+
module Rails31
|
43
|
+
class Application < Rails::Application
|
44
|
+
config.assets.enabled = #{assets_enabled ? 'true' : 'false'}
|
45
|
+
end
|
46
|
+
end
|
47
|
+
EOF
|
48
|
+
File.open(app_rb, 'w') {|f| f.write(app_rb_contents)}
|
49
|
+
rakefile = File.join(@config.release_path, 'Rakefile')
|
50
|
+
rakefile_contents = <<-EOF
|
51
|
+
desc 'Precompile yar assetz'
|
52
|
+
task 'assets:precompile' do
|
53
|
+
sh 'touch precompiled'
|
54
|
+
end
|
55
|
+
EOF
|
56
|
+
File.open(rakefile, 'w') {|f| f.write(rakefile_contents)}
|
57
|
+
FileUtils.mkdir_p(File.join(@config.release_path, 'app', 'assets'))
|
58
|
+
end
|
59
|
+
|
60
|
+
context "with default production settings" do
|
61
|
+
before(:all) do
|
62
|
+
deploy_test_application
|
63
|
+
end
|
64
|
+
|
65
|
+
it "precompiles assets" do
|
66
|
+
File.exist?(File.join(@deploy_dir, 'current', 'precompiled')).should be_true
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "with asset support disabled in its config" do
|
71
|
+
before(:all) do
|
72
|
+
deploy_test_application(with_assets = false)
|
73
|
+
end
|
74
|
+
|
75
|
+
it "does not precompile assets" do
|
76
|
+
File.exist?(File.join(@deploy_dir, 'current', 'precompiled')).should be_false
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context "with existing precompilation in a deploy hook" do
|
81
|
+
before(:all) do
|
82
|
+
deploy_test_application do
|
83
|
+
deploy_dir = File.join(@config.shared_path, 'cached-copy', 'deploy')
|
84
|
+
FileUtils.mkdir_p(deploy_dir)
|
85
|
+
hook = File.join(deploy_dir, 'before_migrate.rb')
|
86
|
+
hook_contents = %Q[run 'touch custom_compiled && mkdir public/assets']
|
87
|
+
File.open(hook, 'w') {|f| f.puts(hook_contents) }
|
88
|
+
File.chmod(0755, hook)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
it "does not replace the public/assets directory" do
|
93
|
+
File.exist?(File.join(@deploy_dir, 'current', 'custom_compiled')).should be_true
|
94
|
+
File.exist?(File.join(@deploy_dir, 'current', 'precompiled')).should be_false
|
95
|
+
File.directory?(File.join(@deploy_dir, 'current', 'public', 'assets')).should be_true
|
96
|
+
File.symlink?(File.join(@deploy_dir, 'current', 'public', 'assets')).should be_false
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -23,8 +23,12 @@ module EY
|
|
23
23
|
def logged_system(cmd)
|
24
24
|
output = `#{cmd} 2>&1`
|
25
25
|
successful = ($? == 0)
|
26
|
-
if ENV['VERBOSE']
|
27
|
-
|
26
|
+
if ENV['VERBOSE']
|
27
|
+
if successful
|
28
|
+
$stdout.puts "#{cmd}\n#{output.strip}".chomp
|
29
|
+
else
|
30
|
+
$stderr.puts "\nCommand `#{cmd}` exited with status #{$?.exitstatus}: '#{output.strip}'"
|
31
|
+
end
|
28
32
|
end
|
29
33
|
successful
|
30
34
|
end
|
@@ -43,6 +47,12 @@ FileUtils.rm_rf GITREPO_DIR if File.exists? GITREPO_DIR
|
|
43
47
|
Kernel.system "tar xzf #{GITREPO_DIR}.tar.gz -C #{FIXTURES_DIR}"
|
44
48
|
|
45
49
|
Spec::Runner.configure do |config|
|
50
|
+
`which npm 2>&1`
|
51
|
+
$NPM_INSTALLED = ($? == 0)
|
52
|
+
unless $NPM_INSTALLED
|
53
|
+
$stderr.puts "npm not found; skipping Node.js specs."
|
54
|
+
end
|
55
|
+
|
46
56
|
config.before(:all) do
|
47
57
|
$DISABLE_GEMFILE = false
|
48
58
|
$DISABLE_LOCKFILE = false
|
data/spec/support/integration.rb
CHANGED
@@ -51,10 +51,13 @@ class FullTestDeploy < EY::Serverside::Deploy
|
|
51
51
|
def bundle
|
52
52
|
my_env = ENV.to_hash
|
53
53
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
54
|
+
if defined?(Bundler)
|
55
|
+
Bundler.with_clean_env do
|
56
|
+
result = super
|
57
|
+
end
|
58
|
+
else
|
59
|
+
result = super
|
60
|
+
end
|
58
61
|
|
59
62
|
ENV.replace(my_env)
|
60
63
|
result
|
@@ -65,6 +68,11 @@ class FullTestDeploy < EY::Serverside::Deploy
|
|
65
68
|
installer.options << ' --quiet' # stfu already!
|
66
69
|
installer
|
67
70
|
end
|
71
|
+
|
72
|
+
def deploy
|
73
|
+
yield if block_given?
|
74
|
+
super
|
75
|
+
end
|
68
76
|
end
|
69
77
|
|
70
78
|
module EY::Serverside::Strategies::IntegrationSpec
|
@@ -75,10 +83,12 @@ module EY::Serverside::Strategies::IntegrationSpec
|
|
75
83
|
|
76
84
|
deploy_hook_dir = File.join(cached_copy, 'deploy')
|
77
85
|
FileUtils.mkdir_p(deploy_hook_dir)
|
78
|
-
%w[bundle migrate symlink restart].each do |action|
|
86
|
+
%w[bundle compile_assets migrate symlink restart].each do |action|
|
79
87
|
%w[before after].each do |prefix|
|
80
88
|
hook = "#{prefix}_#{action}"
|
81
|
-
File.
|
89
|
+
hook_path = File.join(deploy_hook_dir, "#{hook}.rb")
|
90
|
+
next if File.exist?(hook_path)
|
91
|
+
File.open(hook_path, 'w') do |f|
|
82
92
|
f.write(%Q{run 'touch "#{c.release_path}/#{hook}.ran"'})
|
83
93
|
end
|
84
94
|
end
|
@@ -99,13 +109,12 @@ module EY::Serverside::Strategies::IntegrationSpec
|
|
99
109
|
|
100
110
|
def gemfile_contents
|
101
111
|
<<-EOF
|
102
|
-
source
|
103
|
-
|
104
|
-
gem "bundler", "~> 1.0.0.rc.6"
|
105
|
-
gem "rake"
|
112
|
+
source 'http://rubygems.org'
|
113
|
+
gem 'rake', '= 0.8.7'
|
106
114
|
EOF
|
107
115
|
end
|
108
116
|
|
117
|
+
# Generated using Bundler v1.0.10
|
109
118
|
def lockfile_contents
|
110
119
|
<<-EOF
|
111
120
|
GEM
|
@@ -117,8 +126,7 @@ PLATFORMS
|
|
117
126
|
ruby
|
118
127
|
|
119
128
|
DEPENDENCIES
|
120
|
-
|
121
|
-
rake
|
129
|
+
rake (= 0.8.7)
|
122
130
|
EOF
|
123
131
|
end
|
124
132
|
|
@@ -137,3 +145,30 @@ EOF
|
|
137
145
|
end
|
138
146
|
end
|
139
147
|
|
148
|
+
module EY::Serverside::Strategies::NodeIntegrationSpec
|
149
|
+
module Helpers
|
150
|
+
include EY::Serverside::Strategies::IntegrationSpec::Helpers
|
151
|
+
|
152
|
+
def generate_gemfile_in(dir)
|
153
|
+
generate_package_json_in(dir)
|
154
|
+
super(dir)
|
155
|
+
end
|
156
|
+
|
157
|
+
def generate_package_json_in(dir)
|
158
|
+
npm_file = File.join(dir, 'package.json')
|
159
|
+
File.open(npm_file, 'w') {|f| f.write(npm_content)}
|
160
|
+
end
|
161
|
+
|
162
|
+
def npm_content
|
163
|
+
<<-EOF
|
164
|
+
{
|
165
|
+
"name": "node-example",
|
166
|
+
"version": "0.0.1",
|
167
|
+
"dependencies": {
|
168
|
+
"express": "2.2.0"
|
169
|
+
}
|
170
|
+
}
|
171
|
+
EOF
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: engineyard-serverside
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
version: 1.4.
|
9
|
+
- 14
|
10
|
+
version: 1.4.14
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- EY Cloud Team
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-09-
|
18
|
+
date: 2011-09-27 00:00:00 -04:00
|
19
19
|
default_executable: engineyard-serverside
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -67,6 +67,7 @@ files:
|
|
67
67
|
- lib/engineyard-serverside/deprecation.rb
|
68
68
|
- lib/engineyard-serverside/lockfile_parser.rb
|
69
69
|
- lib/engineyard-serverside/logged_output.rb
|
70
|
+
- lib/engineyard-serverside/rails_asset_support.rb
|
70
71
|
- lib/engineyard-serverside/server.rb
|
71
72
|
- lib/engineyard-serverside/strategies/git.rb
|
72
73
|
- lib/engineyard-serverside/task.rb
|
@@ -274,6 +275,8 @@ files:
|
|
274
275
|
- spec/fixtures/valid_hook.rb
|
275
276
|
- spec/git_strategy_spec.rb
|
276
277
|
- spec/lockfile_parser_spec.rb
|
278
|
+
- spec/nodejs_deploy_spec.rb
|
279
|
+
- spec/rails31_deploy_spec.rb
|
277
280
|
- spec/restart_spec.rb
|
278
281
|
- spec/server_spec.rb
|
279
282
|
- spec/spec_helper.rb
|
@@ -333,6 +336,8 @@ test_files:
|
|
333
336
|
- spec/fixtures/valid_hook.rb
|
334
337
|
- spec/git_strategy_spec.rb
|
335
338
|
- spec/lockfile_parser_spec.rb
|
339
|
+
- spec/nodejs_deploy_spec.rb
|
340
|
+
- spec/rails31_deploy_spec.rb
|
336
341
|
- spec/restart_spec.rb
|
337
342
|
- spec/server_spec.rb
|
338
343
|
- spec/spec_helper.rb
|