engineyard-serverside 2.3.9 → 2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/bin/engineyard-serverside-execute-hook +31 -0
- data/lib/engineyard-serverside/about.rb +3 -0
- data/lib/engineyard-serverside/cli.rb +3 -1
- data/lib/engineyard-serverside/configuration.rb +5 -0
- data/lib/engineyard-serverside/deploy.rb +25 -7
- data/lib/engineyard-serverside/maintenance.rb +14 -1
- data/lib/engineyard-serverside/paths.rb +4 -0
- data/lib/engineyard-serverside/server.rb +3 -2
- data/lib/engineyard-serverside/version.rb +1 -1
- data/spec/archive_deploy_spec.rb +4 -10
- data/spec/basic_deploy_spec.rb +3 -3
- data/spec/bundler_deploy_spec.rb +32 -32
- data/spec/configuration_spec.rb +42 -42
- data/spec/custom_deploy_spec.rb +9 -9
- data/spec/deploy_hook_spec.rb +103 -89
- data/spec/deprecation_spec.rb +3 -3
- data/spec/ey_yml_customized_deploy_spec.rb +21 -21
- data/spec/fixtures/repos/executable_hooks/README +1 -0
- data/spec/fixtures/repos/executable_hooks/deploy/before_restart +72 -0
- data/spec/fixtures/repos/public_system/Gemfile +4 -0
- data/spec/fixtures/repos/public_system/Gemfile.lock +12 -0
- data/spec/fixtures/repos/public_system/README +5 -0
- data/spec/fixtures/repos/public_system/ey.yml +3 -0
- data/spec/fixtures/repos/public_system/public/system/cant_touch_this.txt +3 -0
- data/spec/lockfile_parser_spec.rb +26 -26
- data/spec/multi_dependency_manager_spec.rb +3 -3
- data/spec/nodejs_deploy_spec.rb +2 -2
- data/spec/php_deploy_spec.rb +7 -7
- data/spec/rails31_deploy_spec.rb +56 -56
- data/spec/restart_spec.rb +3 -3
- data/spec/rollback_spec.rb +19 -19
- data/spec/server_spec.rb +16 -16
- data/spec/services_deploy_spec.rb +40 -40
- data/spec/shell_spec.rb +1 -1
- data/spec/source/archive_spec.rb +1 -1
- data/spec/source/git_spec.rb +1 -1
- data/spec/spec_helper.rb +0 -1
- data/spec/sqlite3_deploy_spec.rb +6 -6
- data/spec/symlink_spec.rb +15 -0
- metadata +139 -154
- data/lib/engineyard-serverside/source_strategy.rb +0 -77
data/spec/custom_deploy_spec.rb
CHANGED
@@ -58,7 +58,7 @@ describe "the EY::Serverside::Deploy API" do
|
|
58
58
|
# that are using eydeploy.rb and relying on this documentation.
|
59
59
|
#
|
60
60
|
############################################################################
|
61
|
-
td.call_order.
|
61
|
+
expect(td.call_order).to eq(%w(
|
62
62
|
push_code
|
63
63
|
copy_repository_cache
|
64
64
|
create_revision_file
|
@@ -72,7 +72,7 @@ describe "the EY::Serverside::Deploy API" do
|
|
72
72
|
restart
|
73
73
|
disable_maintenance_page
|
74
74
|
cleanup_old_releases
|
75
|
-
gc_repository_cache)
|
75
|
+
gc_repository_cache))
|
76
76
|
end
|
77
77
|
|
78
78
|
describe "task overrides" do
|
@@ -95,7 +95,7 @@ describe "the EY::Serverside::Deploy API" do
|
|
95
95
|
it "doesn't load eydeploy_rb file" do
|
96
96
|
write_eydeploy 'eydeploy.rb'
|
97
97
|
@deploy.require_custom_tasks
|
98
|
-
@deploy.
|
98
|
+
expect(@deploy).not_to respond_to(:got_new_methods)
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
@@ -108,13 +108,13 @@ describe "the EY::Serverside::Deploy API" do
|
|
108
108
|
it "requires 'eydeploy.rb' and adds any defined methods to the deploy" do
|
109
109
|
write_eydeploy 'eydeploy.rb'
|
110
110
|
@deploy.require_custom_tasks
|
111
|
-
@deploy.got_new_methods.
|
111
|
+
expect(@deploy.got_new_methods).to eq('from the file on disk')
|
112
112
|
end
|
113
113
|
|
114
114
|
it "falls back to 'config/eydeploy.rb'" do
|
115
115
|
write_eydeploy 'config/eydeploy.rb'
|
116
116
|
@deploy.require_custom_tasks
|
117
|
-
@deploy.got_new_methods.
|
117
|
+
expect(@deploy.got_new_methods).to eq('from the file on disk')
|
118
118
|
end
|
119
119
|
|
120
120
|
it "lets you super up from any defined methods" do
|
@@ -126,15 +126,15 @@ describe "the EY::Serverside::Deploy API" do
|
|
126
126
|
|
127
127
|
deploy = TestDeploySuper.realnew(test_servers, @config, test_shell)
|
128
128
|
deploy.require_custom_tasks
|
129
|
-
deploy.value.
|
129
|
+
expect(deploy.value).to eq("base + derived")
|
130
130
|
end
|
131
131
|
|
132
132
|
it "records exceptions raised from the instance eval in the log" do
|
133
133
|
write_eydeploy 'eydeploy.rb', "raise 'Imma blow up'"
|
134
|
-
|
134
|
+
expect { @deploy.require_custom_tasks }.to raise_error
|
135
135
|
log = @log_path.read
|
136
|
-
log.
|
137
|
-
log.
|
136
|
+
expect(log).to match(/Exception while loading .*eydeploy\.rb/)
|
137
|
+
expect(log).to include('Imma blow up')
|
138
138
|
end
|
139
139
|
end
|
140
140
|
end
|
data/spec/deploy_hook_spec.rb
CHANGED
@@ -7,18 +7,18 @@ describe "deploy hooks" do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
it "runs all the hooks" do
|
10
|
-
deploy_dir.join('current', 'before_deploy.ran' ).
|
11
|
-
deploy_dir.join('current', 'before_bundle.ran' ).
|
12
|
-
deploy_dir.join('current', 'after_bundle.ran' ).
|
13
|
-
deploy_dir.join('current', 'before_migrate.ran').
|
14
|
-
deploy_dir.join('current', 'after_migrate.ran' ).
|
15
|
-
deploy_dir.join('current', 'before_compile_assets.ran').
|
16
|
-
deploy_dir.join('current', 'after_compile_assets.ran' ).
|
17
|
-
deploy_dir.join('current', 'before_symlink.ran').
|
18
|
-
deploy_dir.join('current', 'after_symlink.ran' ).
|
19
|
-
deploy_dir.join('current', 'before_restart.ran').
|
20
|
-
deploy_dir.join('current', 'after_restart.ran' ).
|
21
|
-
deploy_dir.join('current', 'after_deploy.ran' ).
|
10
|
+
expect(deploy_dir.join('current', 'before_deploy.ran' )).to exist
|
11
|
+
expect(deploy_dir.join('current', 'before_bundle.ran' )).to exist
|
12
|
+
expect(deploy_dir.join('current', 'after_bundle.ran' )).to exist
|
13
|
+
expect(deploy_dir.join('current', 'before_migrate.ran')).to exist
|
14
|
+
expect(deploy_dir.join('current', 'after_migrate.ran' )).to exist
|
15
|
+
expect(deploy_dir.join('current', 'before_compile_assets.ran')).to exist
|
16
|
+
expect(deploy_dir.join('current', 'after_compile_assets.ran' )).to exist
|
17
|
+
expect(deploy_dir.join('current', 'before_symlink.ran')).to exist
|
18
|
+
expect(deploy_dir.join('current', 'after_symlink.ran' )).to exist
|
19
|
+
expect(deploy_dir.join('current', 'before_restart.ran')).to exist
|
20
|
+
expect(deploy_dir.join('current', 'after_restart.ran' )).to exist
|
21
|
+
expect(deploy_dir.join('current', 'after_deploy.ran' )).to exist
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -32,14 +32,24 @@ describe "deploy hooks" do
|
|
32
32
|
|
33
33
|
it "prints the failure to the log even when non-verbose" do
|
34
34
|
out = read_output
|
35
|
-
out.
|
36
|
-
out.
|
37
|
-
out.
|
35
|
+
expect(out).to match(%r|FATAL: Exception raised in deploy hook .*/before_migrate.rb.|)
|
36
|
+
expect(out).to match(%r|RuntimeError:.*Hook failing in \(eval\)|)
|
37
|
+
expect(out).to match(%r|Please fix this error before retrying.|)
|
38
38
|
end
|
39
39
|
|
40
40
|
it "retains the failed release" do
|
41
41
|
release_name = @config.paths.active_release.basename
|
42
|
-
deploy_dir.join('releases_failed', release_name).
|
42
|
+
expect(deploy_dir.join('releases_failed', release_name)).to be_directory
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
context "with an executable for a deploy hook" do
|
47
|
+
before(:all) do
|
48
|
+
deploy_test_application('executable_hooks')
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'runs the hook' do
|
52
|
+
deploy_dir.join('current', 'before_restart.ran').should exist
|
43
53
|
end
|
44
54
|
end
|
45
55
|
|
@@ -56,7 +66,7 @@ describe "deploy hooks" do
|
|
56
66
|
|
57
67
|
context "#run" do
|
58
68
|
it "is available" do
|
59
|
-
deploy_hook.eval_hook('respond_to?(:run)').
|
69
|
+
expect(deploy_hook.eval_hook('respond_to?(:run)')).to be_true
|
60
70
|
end
|
61
71
|
|
62
72
|
it "runs commands like the shell does" do
|
@@ -65,28 +75,28 @@ describe "deploy hooks" do
|
|
65
75
|
|
66
76
|
deploy_hook.eval_hook('run("echo $COUNT > /tmp/deploy_hook_spec.the_count")')
|
67
77
|
|
68
|
-
IO.read("/tmp/deploy_hook_spec.the_count").strip.
|
78
|
+
expect(IO.read("/tmp/deploy_hook_spec.the_count").strip).to eq("Chocula")
|
69
79
|
end
|
70
80
|
|
71
81
|
it "returns true/false to indicate the command's success" do
|
72
|
-
deploy_hook.eval_hook('run("true")').
|
73
|
-
deploy_hook.eval_hook('run("false")').
|
82
|
+
expect(deploy_hook.eval_hook('run("true")')).to be_true
|
83
|
+
expect(deploy_hook.eval_hook('run("false")')).to be_false
|
74
84
|
end
|
75
85
|
|
76
86
|
it "raises when the bang method alternative is used" do
|
77
|
-
|
87
|
+
expect {
|
78
88
|
deploy_hook.eval_hook('run!("false")')
|
79
|
-
}.
|
89
|
+
}.to raise_error(RuntimeError)
|
80
90
|
out = read_output
|
81
|
-
out.
|
82
|
-
out.
|
83
|
-
out.
|
91
|
+
expect(out).to match(%r|FATAL: Exception raised in deploy hook /data/app_name/releases/\d+/deploy/fake_test_hook.rb.|)
|
92
|
+
expect(out).to match(%r|RuntimeError: .*run!.*Command failed. false|)
|
93
|
+
expect(out).to match(%r|Please fix this error before retrying.|)
|
84
94
|
end
|
85
95
|
end
|
86
96
|
|
87
97
|
context "#sudo" do
|
88
98
|
it "is available" do
|
89
|
-
deploy_hook.eval_hook('respond_to?(:sudo)').
|
99
|
+
expect(deploy_hook.eval_hook('respond_to?(:sudo)')).to be_true
|
90
100
|
end
|
91
101
|
|
92
102
|
it "runs things with sudo" do
|
@@ -99,34 +109,34 @@ describe "deploy hooks" do
|
|
99
109
|
it "raises when the bang method alternative is used" do
|
100
110
|
hook = deploy_hook
|
101
111
|
mock_sudo do
|
102
|
-
|
112
|
+
expect {
|
103
113
|
hook.eval_hook('sudo!("false")')
|
104
|
-
}.
|
114
|
+
}.to raise_error(RuntimeError)
|
105
115
|
end
|
106
116
|
out = read_output
|
107
|
-
out.
|
108
|
-
out.
|
109
|
-
out.
|
117
|
+
expect(out).to match(%r|FATAL: Exception raised in deploy hook /data/app_name/releases/\d+/deploy/fake_test_hook.rb.|)
|
118
|
+
expect(out).to match(%r|RuntimeError: .*sudo!.*Command failed. false|)
|
119
|
+
expect(out).to match(%r|Please fix this error before retrying.|)
|
110
120
|
end
|
111
121
|
end
|
112
122
|
|
113
123
|
context "capistrano-ish methods" do
|
114
124
|
it "has them" do
|
115
|
-
deploy_hook.eval_hook('respond_to?(:latest_release) ').
|
116
|
-
deploy_hook.eval_hook('respond_to?(:previous_release) ').
|
117
|
-
deploy_hook.eval_hook('respond_to?(:all_releases) ').
|
118
|
-
deploy_hook.eval_hook('respond_to?(:current_path) ').
|
119
|
-
deploy_hook.eval_hook('respond_to?(:shared_path) ').
|
120
|
-
deploy_hook.eval_hook('respond_to?(:release_dir) ').
|
121
|
-
deploy_hook.eval_hook('respond_to?(:failed_release_dir)').
|
122
|
-
deploy_hook.eval_hook('respond_to?(:release_path) ').
|
125
|
+
expect(deploy_hook.eval_hook('respond_to?(:latest_release) ')).to be_true
|
126
|
+
expect(deploy_hook.eval_hook('respond_to?(:previous_release) ')).to be_true
|
127
|
+
expect(deploy_hook.eval_hook('respond_to?(:all_releases) ')).to be_true
|
128
|
+
expect(deploy_hook.eval_hook('respond_to?(:current_path) ')).to be_true
|
129
|
+
expect(deploy_hook.eval_hook('respond_to?(:shared_path) ')).to be_true
|
130
|
+
expect(deploy_hook.eval_hook('respond_to?(:release_dir) ')).to be_true
|
131
|
+
expect(deploy_hook.eval_hook('respond_to?(:failed_release_dir)')).to be_true
|
132
|
+
expect(deploy_hook.eval_hook('respond_to?(:release_path) ')).to be_true
|
123
133
|
end
|
124
134
|
|
125
135
|
it "shows a deprecation warning that asks you to use config to access these variables" do
|
126
|
-
deploy_hook.eval_hook('shared_path.nil?').
|
136
|
+
expect(deploy_hook.eval_hook('shared_path.nil?')).to be_false
|
127
137
|
out = read_output
|
128
|
-
out.
|
129
|
-
out.
|
138
|
+
expect(out).to include("Use of `shared_path` (via method_missing) is deprecated in favor of `config.shared_path` for improved error messages and compatibility.")
|
139
|
+
expect(out).to match(%r|in /data/app_name/releases/\d+/deploy/fake_test_hook.rb|)
|
130
140
|
end
|
131
141
|
end
|
132
142
|
|
@@ -136,15 +146,15 @@ describe "deploy hooks" do
|
|
136
146
|
end
|
137
147
|
|
138
148
|
it "has account_name" do
|
139
|
-
@hook.eval_hook('account_name').
|
149
|
+
expect(@hook.eval_hook('account_name')).to eq('acc')
|
140
150
|
end
|
141
151
|
|
142
152
|
it "has environment_name" do
|
143
|
-
@hook.eval_hook('environment_name').
|
153
|
+
expect(@hook.eval_hook('environment_name')).to eq('env')
|
144
154
|
end
|
145
155
|
|
146
156
|
it "has app_name" do
|
147
|
-
@hook.eval_hook('app_name').
|
157
|
+
expect(@hook.eval_hook('app_name')).to eq('app')
|
148
158
|
end
|
149
159
|
end
|
150
160
|
|
@@ -162,50 +172,50 @@ describe "deploy hooks" do
|
|
162
172
|
end
|
163
173
|
|
164
174
|
it "is deprecated through the @node ivar" do
|
165
|
-
deploy_hook.eval_hook('@node.nil?').
|
175
|
+
expect(deploy_hook.eval_hook('@node.nil?')).to be_false
|
166
176
|
out = read_output
|
167
|
-
out.
|
168
|
-
out.
|
169
|
-
out.
|
177
|
+
expect(out).to match(%r|Use of `@node` in deploy hooks is deprecated.|)
|
178
|
+
expect(out).to match(%r|Please use `config.node`, which provides access to the same object.|)
|
179
|
+
expect(out).to match(%r|/data/app_name/releases/\d+/deploy/fake_test_hook.rb|)
|
170
180
|
end
|
171
181
|
|
172
182
|
it "is available" do
|
173
|
-
deploy_hook.eval_hook('config.node.nil?').
|
183
|
+
expect(deploy_hook.eval_hook('config.node.nil?')).to be_false
|
174
184
|
end
|
175
185
|
|
176
186
|
it "has indifferent access" do
|
177
|
-
deploy_hook.eval_hook('config.node[:instance_role] ').
|
178
|
-
deploy_hook.eval_hook('config.node["instance_role"]').
|
187
|
+
expect(deploy_hook.eval_hook('config.node[:instance_role] ')).to eq('solo')
|
188
|
+
expect(deploy_hook.eval_hook('config.node["instance_role"]')).to eq('solo')
|
179
189
|
end
|
180
190
|
|
181
191
|
it "has deep indifferent access" do
|
182
|
-
deploy_hook.eval_hook('config.node["applications"]["myapp"]["type"]').
|
183
|
-
deploy_hook.eval_hook('config.node[:applications]["myapp"][:type] ').
|
184
|
-
deploy_hook.eval_hook('config.node[:applications][:myapp][:type] ').
|
192
|
+
expect(deploy_hook.eval_hook('config.node["applications"]["myapp"]["type"]')).to eq('rails')
|
193
|
+
expect(deploy_hook.eval_hook('config.node[:applications]["myapp"][:type] ')).to eq('rails')
|
194
|
+
expect(deploy_hook.eval_hook('config.node[:applications][:myapp][:type] ')).to eq('rails')
|
185
195
|
end
|
186
196
|
end
|
187
197
|
|
188
198
|
context "config" do
|
189
199
|
it "is available" do
|
190
|
-
deploy_hook.eval_hook('config.nil?').
|
200
|
+
expect(deploy_hook.eval_hook('config.nil?')).to be_false
|
191
201
|
end
|
192
202
|
|
193
203
|
it "is deprecated through the @configuration ivar" do
|
194
|
-
deploy_hook.eval_hook('@configuration.nil?').
|
204
|
+
expect(deploy_hook.eval_hook('@configuration.nil?')).to be_false
|
195
205
|
out = read_output
|
196
|
-
out.
|
197
|
-
out.
|
198
|
-
out.
|
206
|
+
expect(out).to match(%r|Use of `@configuration` in deploy hooks is deprecated.|)
|
207
|
+
expect(out).to match(%r|Please use `config`, which provides access to the same object.|)
|
208
|
+
expect(out).to match(%r|/data/app_name/releases/\d+/deploy/fake_test_hook.rb|)
|
199
209
|
end
|
200
210
|
|
201
211
|
it "has the configuration in it" do
|
202
|
-
deploy_hook('bert' => 'ernie').eval_hook('config.bert').
|
212
|
+
expect(deploy_hook('bert' => 'ernie').eval_hook('config.bert')).to eq('ernie')
|
203
213
|
end
|
204
214
|
|
205
215
|
it "can be accessed with method calls, with [:symbols], or ['strings']" do
|
206
|
-
deploy_hook('bert' => 'ernie').eval_hook('config.bert ').
|
207
|
-
deploy_hook('bert' => 'ernie').eval_hook('config[:bert] ').
|
208
|
-
deploy_hook('bert' => 'ernie').eval_hook('config["bert"]').
|
216
|
+
expect(deploy_hook('bert' => 'ernie').eval_hook('config.bert ')).to eq('ernie')
|
217
|
+
expect(deploy_hook('bert' => 'ernie').eval_hook('config[:bert] ')).to eq('ernie')
|
218
|
+
expect(deploy_hook('bert' => 'ernie').eval_hook('config["bert"]')).to eq('ernie')
|
209
219
|
end
|
210
220
|
|
211
221
|
[:repository_cache,
|
@@ -217,17 +227,17 @@ describe "deploy hooks" do
|
|
217
227
|
:revision,
|
218
228
|
:environment].each do |attribute|
|
219
229
|
it "has the #{attribute.inspect} attribute for compatibility with chef-deploy" do
|
220
|
-
deploy_hook.eval_hook("config.has_key?(#{attribute.inspect})").
|
230
|
+
expect(deploy_hook.eval_hook("config.has_key?(#{attribute.inspect})")).to be_true
|
221
231
|
end
|
222
232
|
end
|
223
233
|
end
|
224
234
|
|
225
235
|
context "environment variables" do
|
226
236
|
it "sets the framework env variables" do
|
227
|
-
deploy_hook('framework_env' => 'production').eval_hook("ENV['RAILS_ENV']").
|
228
|
-
deploy_hook('framework_env' => 'production').eval_hook("ENV['RACK_ENV'] ").
|
229
|
-
deploy_hook('framework_env' => 'production').eval_hook("ENV['MERB_ENV'] ").
|
230
|
-
deploy_hook('framework_env' => 'production').eval_hook("ENV['NODE_ENV'] ").
|
237
|
+
expect(deploy_hook('framework_env' => 'production').eval_hook("ENV['RAILS_ENV']")).to eq('production')
|
238
|
+
expect(deploy_hook('framework_env' => 'production').eval_hook("ENV['RACK_ENV'] ")).to eq('production')
|
239
|
+
expect(deploy_hook('framework_env' => 'production').eval_hook("ENV['MERB_ENV'] ")).to eq('production')
|
240
|
+
expect(deploy_hook('framework_env' => 'production').eval_hook("ENV['NODE_ENV'] ")).to eq('production')
|
231
241
|
end
|
232
242
|
end
|
233
243
|
|
@@ -257,74 +267,78 @@ describe "deploy hooks" do
|
|
257
267
|
end
|
258
268
|
|
259
269
|
it "#on_app_master runs on app masters and solos" do
|
260
|
-
where_code_runs_with("on_app_master").
|
270
|
+
expect(where_code_runs_with("on_app_master")).to eq(%w(solo app_master))
|
261
271
|
end
|
262
272
|
|
263
273
|
it "#on_app_servers runs on app masters, app slaves, and solos" do
|
264
|
-
where_code_runs_with("on_app_servers").
|
274
|
+
expect(where_code_runs_with("on_app_servers")).to eq(%w(solo app_master app multi_role,app))
|
265
275
|
end
|
266
276
|
|
267
277
|
it "#on_app_servers_and_utilities does what it says on the tin" do
|
268
|
-
where_code_runs_with("on_app_servers_and_utilities").
|
278
|
+
expect(where_code_runs_with("on_app_servers_and_utilities")).to eq(
|
269
279
|
%w(solo app_master app multi_role,app multi,util util_alpha util_beta util_gamma)
|
280
|
+
)
|
270
281
|
end
|
271
282
|
|
272
283
|
it "#on_utilities() runs on all utility instances" do
|
273
|
-
where_code_runs_with("on_utilities").
|
284
|
+
expect(where_code_runs_with("on_utilities")).to eq(
|
274
285
|
%w(multi,util util_alpha util_beta util_gamma)
|
286
|
+
)
|
275
287
|
end
|
276
288
|
|
277
289
|
it "#on_utilities('sometype') runs on only utilities of type 'sometype'" do
|
278
|
-
where_code_runs_with("on_utilities('alpha')").
|
290
|
+
expect(where_code_runs_with("on_utilities('alpha')")).to eq(%w(util_alpha))
|
279
291
|
end
|
280
292
|
|
281
293
|
it "#on_utilities('type1', 'type2') runs on utilities of both types" do
|
282
|
-
where_code_runs_with("on_utilities('alpha', 'beta')").
|
294
|
+
expect(where_code_runs_with("on_utilities('alpha', 'beta')")).to eq(
|
283
295
|
%w(util_alpha util_beta)
|
296
|
+
)
|
284
297
|
end
|
285
298
|
|
286
299
|
it "#on_utilities can be invoked with (['a', 'b']) or ('a', 'b')" do
|
287
|
-
where_code_runs_with("on_utilities(%w[alpha beta])").
|
300
|
+
expect(where_code_runs_with("on_utilities(%w[alpha beta])")).to eq(
|
288
301
|
where_code_runs_with("on_utilities('alpha', 'beta')")
|
302
|
+
)
|
289
303
|
end
|
290
304
|
end
|
291
305
|
|
292
306
|
context "#syntax_error" do
|
293
307
|
it "returns nil for hook files containing valid Ruby syntax" do
|
294
308
|
hook_path = File.expand_path('../fixtures/valid_hook.rb', __FILE__)
|
295
|
-
deploy_hook.syntax_error(hook_path).
|
309
|
+
expect(deploy_hook.syntax_error(hook_path)).to be_nil
|
296
310
|
end
|
297
311
|
|
298
312
|
it "returns a brief problem description for hook files containing valid Ruby syntax" do
|
299
313
|
hook_path = File.expand_path('../fixtures/invalid_hook.rb', __FILE__)
|
300
314
|
error = Regexp.escape("spec/fixtures/invalid_hook.rb:1: syntax error, unexpected '^'")
|
301
|
-
deploy_hook.syntax_error(hook_path).
|
315
|
+
expect(deploy_hook.syntax_error(hook_path)).to match(/#{error}/)
|
302
316
|
end
|
303
317
|
end
|
304
318
|
|
305
319
|
context "errors in hooks" do
|
306
320
|
it "shows the error in a helpful way" do
|
307
|
-
|
321
|
+
expect {
|
308
322
|
deploy_hook.eval_hook('methedo_no_existo')
|
309
|
-
}.
|
323
|
+
}.to raise_error(NameError)
|
310
324
|
out = read_output
|
311
|
-
out.
|
312
|
-
out.
|
313
|
-
out.
|
325
|
+
expect(out).to match(%r|FATAL: Exception raised in deploy hook /data/app_name/releases/\d+/deploy/fake_test_hook.rb.|)
|
326
|
+
expect(out).to match(%r|NameError: undefined local variable or method `methedo_no_existo' for|)
|
327
|
+
expect(out).to match(%r|Please fix this error before retrying.|)
|
314
328
|
end
|
315
329
|
end
|
316
330
|
|
317
331
|
context "is compatible with older deploy hook scripts" do
|
318
332
|
it "#current_role returns the first role" do
|
319
|
-
deploy_hook('current_roles' => %w(a b)).eval_hook('current_role').
|
333
|
+
expect(deploy_hook('current_roles' => %w(a b)).eval_hook('current_role')).to eq('a')
|
320
334
|
end
|
321
335
|
|
322
336
|
it "has info, warning, debug, logged_system, and access to shell" do
|
323
|
-
deploy_hook.eval_hook('respond_to?(:info) ').
|
324
|
-
deploy_hook.eval_hook('respond_to?(:warning) ').
|
325
|
-
deploy_hook.eval_hook('respond_to?(:debug) ').
|
326
|
-
deploy_hook.eval_hook('respond_to?(:logged_system)').
|
327
|
-
deploy_hook.eval_hook('respond_to?(:shell) ').
|
337
|
+
expect(deploy_hook.eval_hook('respond_to?(:info) ')).to be_true
|
338
|
+
expect(deploy_hook.eval_hook('respond_to?(:warning) ')).to be_true
|
339
|
+
expect(deploy_hook.eval_hook('respond_to?(:debug) ')).to be_true
|
340
|
+
expect(deploy_hook.eval_hook('respond_to?(:logged_system)')).to be_true
|
341
|
+
expect(deploy_hook.eval_hook('respond_to?(:shell) ')).to be_true
|
328
342
|
end
|
329
343
|
end
|
330
344
|
end
|
data/spec/deprecation_spec.rb
CHANGED
@@ -13,11 +13,11 @@ describe EY::Serverside do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it "deprecates EY::Serverside::LoggedOutput for EY::Serverside::Shell::Helpers" do
|
16
|
-
EY::Serverside::LoggedOutput.
|
17
|
-
@warnings.string.
|
16
|
+
expect(EY::Serverside::LoggedOutput).to eq(EY::Serverside::Shell::Helpers)
|
17
|
+
expect(@warnings.string).to include("EY::Serverside::LoggedOutput")
|
18
18
|
end
|
19
19
|
|
20
20
|
it "doesn't interfere with unrelated constants" do
|
21
|
-
|
21
|
+
expect{ EY::Serverside::WTFNotDefined }.to raise_error(NameError, /uninitialized constant.*WTFNotDefined/)
|
22
22
|
end
|
23
23
|
end
|
@@ -7,11 +7,11 @@ describe "Deploying an app with ey.yml" do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
it "does not migrate even though ey.yml says migrate: true" do
|
10
|
-
read_output.
|
10
|
+
expect(read_output).not_to match(/Migrating/)
|
11
11
|
end
|
12
12
|
|
13
13
|
it "does not enable the maintenance page at all" do
|
14
|
-
deploy_dir.join('current','maintenance_disabled').
|
14
|
+
expect(deploy_dir.join('current','maintenance_disabled')).to exist
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
@@ -23,45 +23,45 @@ describe "Deploying an app with ey.yml" do
|
|
23
23
|
|
24
24
|
it "excludes copy_excludes from releases" do
|
25
25
|
cmd = @deployer.commands.grep(/rsync -aq/).first
|
26
|
-
cmd.
|
27
|
-
deploy_dir.join('current', '.git').
|
28
|
-
deploy_dir.join('current', 'README').
|
26
|
+
expect(cmd).to include('rsync -aq --exclude=".git" --exclude="README"')
|
27
|
+
expect(deploy_dir.join('current', '.git')).not_to exist
|
28
|
+
expect(deploy_dir.join('current', 'README')).not_to exist
|
29
29
|
end
|
30
30
|
|
31
31
|
it "loads ey.yml at lower priority than command line options" do
|
32
|
-
deploy_dir.join('current', 'REVISION').read.
|
32
|
+
expect(deploy_dir.join('current', 'REVISION').read).to eq("somebranch\n")
|
33
33
|
end
|
34
34
|
|
35
35
|
it "loads bundle_without from the config, which overrides the default (and 'defaults:' in ey.yml)" do
|
36
36
|
cmd = @deployer.commands.grep(/bundle _\S*_ install/).first
|
37
|
-
cmd.
|
37
|
+
expect(cmd).to include('--without only test')
|
38
38
|
end
|
39
39
|
|
40
40
|
it "does not enable the maintenance page during migrations" do
|
41
|
-
deploy_dir.join('current','maintenance_disabled').
|
42
|
-
deploy_dir.join('current','maintenance_enabled').
|
41
|
+
expect(deploy_dir.join('current','maintenance_disabled')).to exist
|
42
|
+
expect(deploy_dir.join('current','maintenance_enabled')).not_to exist
|
43
43
|
end
|
44
44
|
|
45
45
|
it "does not remove an existing maintenance page" do
|
46
46
|
maintenance = EY::Serverside::Maintenance.new(test_servers, @config, test_shell)
|
47
47
|
deploy_dir.join('current','maintenance_disabled').delete
|
48
48
|
maintenance.manually_enable
|
49
|
-
deploy_dir.join('shared','system','maintenance.html').
|
49
|
+
expect(deploy_dir.join('shared','system','maintenance.html')).to exist
|
50
50
|
redeploy_test_application
|
51
|
-
read_output.
|
52
|
-
deploy_dir.join('shared','system','maintenance.html').
|
53
|
-
deploy_dir.join('current','maintenance_disabled').
|
54
|
-
deploy_dir.join('current','maintenance_enabled').
|
51
|
+
expect(read_output).to match(/Maintenance page is still up./)
|
52
|
+
expect(deploy_dir.join('shared','system','maintenance.html')).to exist
|
53
|
+
expect(deploy_dir.join('current','maintenance_disabled')).not_to exist
|
54
|
+
expect(deploy_dir.join('current','maintenance_enabled')).to exist
|
55
55
|
maintenance.manually_disable
|
56
|
-
deploy_dir.join('shared','system','maintenance.html').
|
56
|
+
expect(deploy_dir.join('shared','system','maintenance.html')).not_to exist
|
57
57
|
end
|
58
58
|
|
59
59
|
it "makes custom variables available to hooks" do
|
60
|
-
deploy_dir.join('current', 'custom_hook').read.
|
60
|
+
expect(deploy_dir.join('current', 'custom_hook').read).to include("custom_from_ey_yml")
|
61
61
|
end
|
62
62
|
|
63
63
|
it "doesn't display the database adapter warning with ignore_database_adapter_warning: true" do
|
64
|
-
read_output.
|
64
|
+
expect(read_output).not_to match(/WARNING/)
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
@@ -74,12 +74,12 @@ describe "Deploying an app with ey.yml" do
|
|
74
74
|
end
|
75
75
|
|
76
76
|
it "always installs maintenance pages" do
|
77
|
-
deploy_dir.join('current','maintenance_enabled').
|
78
|
-
deploy_dir.join('current','maintenance_disabled').
|
77
|
+
expect(deploy_dir.join('current','maintenance_enabled')).to exist
|
78
|
+
expect(deploy_dir.join('current','maintenance_disabled')).not_to exist
|
79
79
|
end
|
80
80
|
|
81
81
|
it "displays the database adapter warning without ignore_database_adapter_warning" do
|
82
|
-
read_output.
|
82
|
+
expect(read_output).to match(/WARNING: Gemfile.lock does not contain a recognized database adapter./)
|
83
83
|
end
|
84
84
|
end
|
85
85
|
|
@@ -93,7 +93,7 @@ describe "Deploying an app with ey.yml" do
|
|
93
93
|
end
|
94
94
|
|
95
95
|
it "doesn't display the database adapter warning" do
|
96
|
-
read_output.
|
96
|
+
expect(read_output).not_to match(/WARNING: Gemfile.lock does not contain a recognized database adapter./)
|
97
97
|
end
|
98
98
|
end
|
99
99
|
end
|