engineyard-serverside 2.3.9 → 2.4.0
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.
- 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
|