engineyard-serverside 1.4.1 → 1.4.3.nodestack
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/engineyard-serverside/configuration.rb +1 -1
- data/lib/engineyard-serverside/deploy.rb +31 -6
- data/lib/engineyard-serverside/lockfile_parser.rb +29 -7
- data/lib/engineyard-serverside/logged_output.rb +5 -0
- data/lib/engineyard-serverside/version.rb +1 -1
- data/spec/fixtures/gitrepo/bar +0 -0
- data/spec/lockfile_parser_spec.rb +38 -4
- data/spec/real_deploy_spec.rb +44 -0
- metadata +15 -12
@@ -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} APP_ENV=#{environment} MERB_ENV=#{environment}"
|
123
123
|
end
|
124
124
|
|
125
125
|
def current_path
|
@@ -142,7 +142,36 @@ module EY
|
|
142
142
|
|
143
143
|
sudo "#{$0} _#{EY::Serverside::VERSION}_ install_bundler #{bundler_installer.version}"
|
144
144
|
|
145
|
+
bundled_gems_path = File.join(c.shared_path, "bundled_gems")
|
146
|
+
ruby_version_file = File.join(bundled_gems_path, "RUBY_VERSION")
|
147
|
+
system_version_file = File.join(bundled_gems_path, "SYSTEM_VERSION")
|
148
|
+
ruby_version = `ruby -v`
|
149
|
+
system_version = `uname -m`
|
150
|
+
|
151
|
+
if File.directory?(bundled_gems_path)
|
152
|
+
rebundle = false
|
153
|
+
|
154
|
+
rebundle = true if File.exist?(ruby_version_file) && File.read(ruby_version_file) != ruby_version
|
155
|
+
rebundle = true if File.exist?(system_version_file) && File.read(system_version_file) != system_version
|
156
|
+
|
157
|
+
if rebundle
|
158
|
+
info "~> Ruby version change detected, cleaning bundled gems"
|
159
|
+
run "rm -Rf #{bundled_gems_path}"
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
145
163
|
run "cd #{c.release_path} && bundle _#{bundler_installer.version}_ install #{bundler_installer.options}"
|
164
|
+
|
165
|
+
run "mkdir -p #{bundled_gems_path} && ruby -v > #{ruby_version_file} && uname -m > #{system_version_file}"
|
166
|
+
end
|
167
|
+
if File.exist?("#{c.release_path}/package.json")
|
168
|
+
unless `which npm` =~ /npm/
|
169
|
+
error "~> package.json detected, BUT npm not installed"
|
170
|
+
else
|
171
|
+
info "~> package.json detected, installing npm packages"
|
172
|
+
|
173
|
+
run "cd #{c.release_path} && npm install"
|
174
|
+
end
|
146
175
|
end
|
147
176
|
end
|
148
177
|
|
@@ -308,9 +337,9 @@ module EY
|
|
308
337
|
parser = LockfileParser.new(File.read(lockfile))
|
309
338
|
case parser.lockfile_version
|
310
339
|
when :bundler09
|
311
|
-
bundler_09_installer(parser.bundler_version
|
340
|
+
bundler_09_installer(parser.bundler_version)
|
312
341
|
when :bundler10
|
313
|
-
bundler_10_installer(parser.bundler_version
|
342
|
+
bundler_10_installer(parser.bundler_version)
|
314
343
|
else
|
315
344
|
raise "Unknown lockfile version #{parser.lockfile_version}"
|
316
345
|
end
|
@@ -325,10 +354,6 @@ module EY
|
|
325
354
|
BundleInstaller.new(version,
|
326
355
|
"--deployment --path #{c.shared_path}/bundled_gems --binstubs #{c.binstubs_path} --without development test")
|
327
356
|
end
|
328
|
-
|
329
|
-
def default_09_bundler() "0.9.26" end
|
330
|
-
def default_10_bundler() "1.0.10" end
|
331
|
-
|
332
357
|
end # DeployBase
|
333
358
|
|
334
359
|
class Deploy < DeployBase
|
@@ -9,8 +9,6 @@ module EY
|
|
9
9
|
@lockfile_version, @bundler_version = Parse106.new(lockfile_contents).parse
|
10
10
|
end
|
11
11
|
|
12
|
-
private
|
13
|
-
|
14
12
|
class BaseParser
|
15
13
|
def initialize(contents)
|
16
14
|
@contents = contents
|
@@ -21,6 +19,8 @@ module EY
|
|
21
19
|
end
|
22
20
|
|
23
21
|
class Parse09 < BaseParser
|
22
|
+
DEFAULT = "0.9.26"
|
23
|
+
|
24
24
|
def parse
|
25
25
|
from_yaml = safe_yaml_load(@contents)
|
26
26
|
unless from_yaml.is_a?(Hash)
|
@@ -33,7 +33,7 @@ module EY
|
|
33
33
|
spec.values.first["version"]
|
34
34
|
end
|
35
35
|
end.compact.first
|
36
|
-
[:bundler09, bundler_version]
|
36
|
+
[:bundler09, bundler_version || DEFAULT]
|
37
37
|
end
|
38
38
|
def safe_yaml_load(loadable)
|
39
39
|
YAML.load(loadable) #won't always raise... soemtimes parses the contents as 1 big string
|
@@ -43,6 +43,8 @@ module EY
|
|
43
43
|
end
|
44
44
|
|
45
45
|
class Parse10 < Parse09
|
46
|
+
DEFAULT = "1.0.10"
|
47
|
+
|
46
48
|
def parse
|
47
49
|
unless @contents.index(/^DEPENDENCIES/)
|
48
50
|
return super
|
@@ -64,9 +66,29 @@ module EY
|
|
64
66
|
exit(1)
|
65
67
|
end
|
66
68
|
|
67
|
-
result = dep_section
|
68
|
-
bundler_version = result ? result.
|
69
|
-
|
69
|
+
result = scan_bundler(dep_section)
|
70
|
+
bundler_version = result ? result.last : nil
|
71
|
+
version_qualifier = result ? result.first : nil
|
72
|
+
[:bundler10, fetch_version(bundler_version, version_qualifier)]
|
73
|
+
end
|
74
|
+
|
75
|
+
def fetch_version(bundler_version, version_qualifier)
|
76
|
+
return bundler_version || DEFAULT unless version_qualifier
|
77
|
+
|
78
|
+
case version_qualifier
|
79
|
+
when '='
|
80
|
+
bundler_version
|
81
|
+
when '>='
|
82
|
+
Gem::Version.new(bundler_version) > Gem::Version.new(DEFAULT) ? bundler_version : DEFAULT
|
83
|
+
when '~>'
|
84
|
+
bundler_gem_version = Gem::Version.new(bundler_version)
|
85
|
+
recommendation = bundler_gem_version.spermy_recommendation.gsub(/~>\s*(.+)$/, '\1.')
|
86
|
+
DEFAULT.start_with?(recommendation) && Gem::Version.new(DEFAULT) > bundler_gem_version ? DEFAULT : bundler_version
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def scan_bundler(dep_section)
|
91
|
+
dep_section.scan(/^\s*bundler\s*\((>?=|~>)\s*([^,\)]+)/).first
|
70
92
|
end
|
71
93
|
end
|
72
94
|
|
@@ -93,7 +115,7 @@ module EY
|
|
93
115
|
end
|
94
116
|
|
95
117
|
result = meta_section.scan(/^\s*version:\s*(.*)$/).first
|
96
|
-
bundler_version = result ? result.first :
|
118
|
+
bundler_version = result ? result.first : DEFAULT
|
97
119
|
[:bundler10, bundler_version]
|
98
120
|
end
|
99
121
|
end
|
File without changes
|
@@ -1,14 +1,16 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/spec_helper'
|
2
2
|
|
3
3
|
describe "the bundler version retrieved from the lockfile" do
|
4
|
+
def get_full_path(file)
|
5
|
+
File.expand_path("../support/lockfiles/#{file}", __FILE__)
|
6
|
+
end
|
4
7
|
def get_version(file)
|
5
|
-
full_path = File.expand_path("../support/lockfiles/#{file}", __FILE__)
|
6
8
|
@config = EY::Serverside::Deploy::Configuration.new('deploy_to' => 'dontcare')
|
7
|
-
EY::Serverside::DeployBase.new(@config).get_bundler_installer(
|
9
|
+
EY::Serverside::DeployBase.new(@config).get_bundler_installer(get_full_path(file)).version
|
8
10
|
end
|
9
11
|
|
10
12
|
it "returns the default version for an 0.9 lockfile without a bundler dependency" do
|
11
|
-
get_version('0.9-no-bundler').should == EY::Serverside::
|
13
|
+
get_version('0.9-no-bundler').should == EY::Serverside::LockfileParser::Parse09::DEFAULT
|
12
14
|
end
|
13
15
|
|
14
16
|
it "gets the version from an 0.9 lockfile with a bundler dependency" do
|
@@ -16,7 +18,7 @@ describe "the bundler version retrieved from the lockfile" do
|
|
16
18
|
end
|
17
19
|
|
18
20
|
it "returns the default version for a 1.0 lockfile without a bundler dependency" do
|
19
|
-
get_version('1.0-no-bundler').should == EY::Serverside::
|
21
|
+
get_version('1.0-no-bundler').should == EY::Serverside::LockfileParser::Parse10::DEFAULT
|
20
22
|
end
|
21
23
|
|
22
24
|
it "gets the version from a 1.0.0.rc.1 lockfile w/dependency on 1.0.0.rc.1" do
|
@@ -47,4 +49,36 @@ describe "the bundler version retrieved from the lockfile" do
|
|
47
49
|
lambda { get_version('evil-yaml') }.should raise_error(RuntimeError, /Unknown lockfile format/)
|
48
50
|
end
|
49
51
|
|
52
|
+
context "fetching the right version number" do
|
53
|
+
subject { EY::Serverside::LockfileParser::Parse10.new(get_full_path('1.0.6-no-bundler')) }
|
54
|
+
|
55
|
+
it "uses the default version when there is no bundler version" do
|
56
|
+
subject.fetch_version(nil, nil).should == EY::Serverside::LockfileParser::Parse10::DEFAULT
|
57
|
+
end
|
58
|
+
|
59
|
+
it "uses the given version when the qualifier is `='" do
|
60
|
+
subject.fetch_version('1.0.1', '=').should == '1.0.1'
|
61
|
+
end
|
62
|
+
|
63
|
+
it "uses the default version when we get a pessimistic qualifier and is lower than the default version" do
|
64
|
+
subject.fetch_version('1.0.1', '~>').should == '1.0.10'
|
65
|
+
end
|
66
|
+
|
67
|
+
it "uses the given version when we get a pessimistic qualifier that doesn't match the default version" do
|
68
|
+
subject.fetch_version('1.1.0', '~>').should == '1.1.0'
|
69
|
+
end
|
70
|
+
|
71
|
+
it "uses the given version when it's geater of equal than the default version" do
|
72
|
+
subject.fetch_version('1.1.0', '>=').should == '1.1.0'
|
73
|
+
end
|
74
|
+
|
75
|
+
it "uses the default version when the given version is lower" do
|
76
|
+
subject.fetch_version('1.0.1', '>=').should == EY::Serverside::LockfileParser::Parse10::DEFAULT
|
77
|
+
end
|
78
|
+
|
79
|
+
it "selects only the first version expression" do
|
80
|
+
scan = subject.scan_bundler 'bundler (>=1.0.1, <2.0.0)'
|
81
|
+
scan.last.should == '1.0.1'
|
82
|
+
end
|
83
|
+
end
|
50
84
|
end
|
data/spec/real_deploy_spec.rb
CHANGED
@@ -46,6 +46,21 @@ DEPENDENCIES
|
|
46
46
|
rake
|
47
47
|
EOF
|
48
48
|
end
|
49
|
+
|
50
|
+
File.open('package.json', 'w') do |f|
|
51
|
+
f.write <<-EOF
|
52
|
+
{
|
53
|
+
"name": "application-name"
|
54
|
+
, "version": "0.0.1"
|
55
|
+
, "private": true
|
56
|
+
, "dependencies": {
|
57
|
+
"express": "2.3.12"
|
58
|
+
, "jade": ">= 0.0.1"
|
59
|
+
}
|
60
|
+
}
|
61
|
+
EOF
|
62
|
+
end
|
63
|
+
|
49
64
|
end
|
50
65
|
end
|
51
66
|
|
@@ -149,6 +164,12 @@ describe "deploying an application" do
|
|
149
164
|
'framework_env' => 'staging'
|
150
165
|
})
|
151
166
|
|
167
|
+
# pretend there is a shared bundled_gems directory
|
168
|
+
FileUtils.mkdir_p(File.join(@deploy_dir, 'shared', 'bundled_gems'))
|
169
|
+
%w(RUBY_VERSION SYSTEM_VERSION).each do |name|
|
170
|
+
File.open(File.join(@deploy_dir, 'shared', 'bundled_gems', name), "w") { |f| f.write("old\n") }
|
171
|
+
end
|
172
|
+
|
152
173
|
@binpath = $0 = File.expand_path(File.join(File.dirname(__FILE__), '..', 'bin', 'engineyard-serverside'))
|
153
174
|
@deployer = FullTestDeploy.new(config)
|
154
175
|
@deployer.deploy
|
@@ -174,6 +195,29 @@ describe "deploying an application" do
|
|
174
195
|
bundle_install_cmd.should include('--deployment')
|
175
196
|
end
|
176
197
|
|
198
|
+
it "creates a ruby version file" do
|
199
|
+
File.exist?(File.join(@deploy_dir, 'shared', 'bundled_gems', 'RUBY_VERSION')).should be_true
|
200
|
+
end
|
201
|
+
|
202
|
+
it "creates a system version file" do
|
203
|
+
File.exist?(File.join(@deploy_dir, 'shared', 'bundled_gems', 'SYSTEM_VERSION')).should be_true
|
204
|
+
end
|
205
|
+
|
206
|
+
it "removes bundled_gems directory if the ruby version changed" do
|
207
|
+
clear_bundle_cmd = @deployer.commands.grep(/rm -Rf \S+\/bundled_gems/).first
|
208
|
+
clear_bundle_cmd.should_not be_nil
|
209
|
+
end
|
210
|
+
|
211
|
+
it "removes bundled_gems directory if the system version changed" do
|
212
|
+
clear_bundle_cmd = @deployer.commands.grep(/rm -Rf \S+\/bundled_gems/).first
|
213
|
+
clear_bundle_cmd.should_not be_nil
|
214
|
+
end
|
215
|
+
|
216
|
+
it "runs 'npm install'" do
|
217
|
+
bundle_install_cmd = @deployer.commands.grep(/npm install/).first
|
218
|
+
bundle_install_cmd.should_not be_nil
|
219
|
+
end
|
220
|
+
|
177
221
|
it "creates binstubs somewhere out of the way" do
|
178
222
|
File.exist?(File.join(@deploy_dir, 'current', 'ey_bundler_binstubs', 'rake')).should be_true
|
179
223
|
end
|
metadata
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: engineyard-serverside
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
5
|
-
prerelease:
|
4
|
+
hash: -1757219187
|
5
|
+
prerelease: 6
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 4
|
9
|
-
-
|
10
|
-
|
9
|
+
- 3
|
10
|
+
- nodestack
|
11
|
+
version: 1.4.3.nodestack
|
11
12
|
platform: ruby
|
12
13
|
authors:
|
13
14
|
- EY Cloud Team
|
@@ -15,8 +16,7 @@ autorequire:
|
|
15
16
|
bindir: bin
|
16
17
|
cert_chain: []
|
17
18
|
|
18
|
-
date: 2011-
|
19
|
-
default_executable: engineyard-serverside
|
19
|
+
date: 2011-08-31 00:00:00 Z
|
20
20
|
dependencies: []
|
21
21
|
|
22
22
|
description:
|
@@ -237,6 +237,7 @@ files:
|
|
237
237
|
- spec/custom_deploy_spec.rb
|
238
238
|
- spec/deploy_hook_spec.rb
|
239
239
|
- spec/deprecation_spec.rb
|
240
|
+
- spec/fixtures/gitrepo/bar
|
240
241
|
- spec/fixtures/gitrepo/foo
|
241
242
|
- spec/fixtures/gitrepo.tar.gz
|
242
243
|
- spec/fixtures/invalid_hook.rb
|
@@ -256,7 +257,6 @@ files:
|
|
256
257
|
- spec/support/lockfiles/1.0.6-with-bundler
|
257
258
|
- spec/support/lockfiles/evil-yaml
|
258
259
|
- spec/support/lockfiles/not-a-lockfile
|
259
|
-
has_rdoc: true
|
260
260
|
homepage: http://github.com/engineyard/engineyard-serverside
|
261
261
|
licenses: []
|
262
262
|
|
@@ -277,16 +277,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
277
277
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
278
278
|
none: false
|
279
279
|
requirements:
|
280
|
-
- - "
|
280
|
+
- - ">"
|
281
281
|
- !ruby/object:Gem::Version
|
282
|
-
hash:
|
282
|
+
hash: 25
|
283
283
|
segments:
|
284
|
-
-
|
285
|
-
|
284
|
+
- 1
|
285
|
+
- 3
|
286
|
+
- 1
|
287
|
+
version: 1.3.1
|
286
288
|
requirements: []
|
287
289
|
|
288
290
|
rubyforge_project:
|
289
|
-
rubygems_version: 1.
|
291
|
+
rubygems_version: 1.8.6
|
290
292
|
signing_key:
|
291
293
|
specification_version: 3
|
292
294
|
summary: A gem that deploys ruby applications on EY Cloud instances
|
@@ -294,6 +296,7 @@ test_files:
|
|
294
296
|
- spec/custom_deploy_spec.rb
|
295
297
|
- spec/deploy_hook_spec.rb
|
296
298
|
- spec/deprecation_spec.rb
|
299
|
+
- spec/fixtures/gitrepo/bar
|
297
300
|
- spec/fixtures/gitrepo/foo
|
298
301
|
- spec/fixtures/gitrepo.tar.gz
|
299
302
|
- spec/fixtures/invalid_hook.rb
|