engineyard 0.7.1 → 0.8.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.
- data/lib/engineyard/cli.rb +7 -4
- data/lib/engineyard/error.rb +1 -1
- data/lib/engineyard/model/environment.rb +5 -2
- data/lib/engineyard/model/instance.rb +4 -2
- data/lib/engineyard/version.rb +1 -1
- data/spec/engineyard/model/environment_spec.rb +7 -0
- data/spec/ey/deploy_spec.rb +3 -3
- data/spec/support/fake_awsm.ru +14 -0
- data/spec/support/shared_behavior.rb +27 -19
- metadata +4 -4
data/lib/engineyard/cli.rb
CHANGED
@@ -23,14 +23,16 @@ module EY
|
|
23
23
|
This command must be run with the current directory containing the app to be
|
24
24
|
deployed. If ey.yml specifies a default branch then the ref parameter can be
|
25
25
|
omitted. Furthermore, if a default branch is specified but a different command
|
26
|
-
is supplied the deploy will fail unless --
|
26
|
+
is supplied the deploy will fail unless --ignore-default-branch is used.
|
27
27
|
|
28
28
|
Migrations are run by default with 'rake db:migrate'. A different command can be
|
29
29
|
specified via --migrate "ruby do_migrations.rb". Migrations can also be skipped
|
30
30
|
entirely by using --no-migrate.
|
31
31
|
DESC
|
32
|
-
method_option :
|
32
|
+
method_option :ignore_default_branch, :type => :boolean,
|
33
33
|
:desc => "Force a deploy of the specified branch even if a default is set"
|
34
|
+
method_option :ignore_bad_master, :type => :boolean,
|
35
|
+
:desc => "Force a deploy even if the master is in a bad state"
|
34
36
|
method_option :migrate, :type => :string, :aliases => %w(-m),
|
35
37
|
:default => 'rake db:migrate',
|
36
38
|
:desc => "Run migrations via [MIGRATE], defaults to 'rake db:migrate'; use --no-migrate to avoid running migrations"
|
@@ -45,11 +47,12 @@ module EY
|
|
45
47
|
def deploy
|
46
48
|
app = fetch_app(options[:app])
|
47
49
|
environment = fetch_environment(options[:environment], app)
|
50
|
+
environment.ignore_bad_master = options[:ignore_bad_master]
|
48
51
|
deploy_ref = if options[:app]
|
49
|
-
environment.resolve_branch(options[:ref], options[:
|
52
|
+
environment.resolve_branch(options[:ref], options[:ignore_default_branch]) ||
|
50
53
|
raise(EY::Error, "When specifying the application, you must also specify the ref to deploy\nUsage: ey deploy --app <app name> --ref <branch|tag|ref>")
|
51
54
|
else
|
52
|
-
environment.resolve_branch(options[:ref], options[:
|
55
|
+
environment.resolve_branch(options[:ref], options[:ignore_default_branch]) ||
|
53
56
|
repo.current_branch ||
|
54
57
|
raise(DeployArgumentError)
|
55
58
|
end
|
data/lib/engineyard/error.rb
CHANGED
@@ -68,7 +68,7 @@ module EY
|
|
68
68
|
class BranchMismatch < EY::Error
|
69
69
|
def initialize(default_branch, branch)
|
70
70
|
super %|Your deploy branch is set to "#{default_branch}".\n| +
|
71
|
-
%|If you want to deploy branch "#{branch}", use --
|
71
|
+
%|If you want to deploy branch "#{branch}", use --ignore-default_branch.|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
@@ -1,6 +1,9 @@
|
|
1
1
|
module EY
|
2
2
|
module Model
|
3
|
-
class Environment < ApiStruct.new(:id, :name, :instances, :instances_count, :apps, :app_master, :username, :stack_name, :api)
|
3
|
+
class Environment < ApiStruct.new(:id, :name, :framework_env, :instances, :instances_count, :apps, :app_master, :username, :stack_name, :api)
|
4
|
+
|
5
|
+
attr_accessor :ignore_bad_master
|
6
|
+
|
4
7
|
def self.from_hash(hash)
|
5
8
|
super.tap do |env|
|
6
9
|
env.username = hash['ssh_username']
|
@@ -22,7 +25,7 @@ module EY
|
|
22
25
|
master = app_master
|
23
26
|
if master.nil?
|
24
27
|
raise NoAppMaster.new(name)
|
25
|
-
elsif master.status != "running"
|
28
|
+
elsif !ignore_bad_master && master.status != "running"
|
26
29
|
raise BadAppMasterStatus.new(master.status)
|
27
30
|
end
|
28
31
|
master
|
@@ -3,7 +3,7 @@ require 'escape'
|
|
3
3
|
module EY
|
4
4
|
module Model
|
5
5
|
class Instance < ApiStruct.new(:id, :role, :name, :status, :amazon_id, :public_hostname, :environment)
|
6
|
-
EYSD_VERSION = ENV["EY_DEPLOY_VERSION"] || "0.
|
6
|
+
EYSD_VERSION = ENV["EY_DEPLOY_VERSION"] || "0.8.0"
|
7
7
|
EXIT_STATUS = Hash.new { |h,k| raise EY::Error, "ey-deploy version checker exited with unknown status code #{k}" }
|
8
8
|
EXIT_STATUS.merge!({
|
9
9
|
255 => :ssh_failed,
|
@@ -117,9 +117,11 @@ module EY
|
|
117
117
|
command << instance_tuple.join(',')
|
118
118
|
end
|
119
119
|
|
120
|
+
framework_arg = ['--framework-env', environment.framework_env]
|
121
|
+
|
120
122
|
verbose_arg = verbose ? ['--verbose'] : []
|
121
123
|
|
122
|
-
cmd = Escape.shell_command(start + deploy_args + instance_args + verbose_arg)
|
124
|
+
cmd = Escape.shell_command(start + deploy_args + framework_arg + instance_args + verbose_arg)
|
123
125
|
puts cmd if verbose
|
124
126
|
ssh cmd
|
125
127
|
end
|
data/lib/engineyard/version.rb
CHANGED
@@ -115,6 +115,13 @@ describe "EY::Model::Environment#app_master!" do
|
|
115
115
|
}.should raise_error(EY::BadAppMasterStatus)
|
116
116
|
end
|
117
117
|
|
118
|
+
it "returns the app master if told to ignore the app master being in a non-running state" do
|
119
|
+
env = make_env_with_master("status" => "error")
|
120
|
+
env.ignore_bad_master = true
|
121
|
+
env.app_master!.should_not be_nil
|
122
|
+
env.app_master!.id.should == 44206
|
123
|
+
end
|
124
|
+
|
118
125
|
it "raises an error if the app master is absent" do
|
119
126
|
env = make_env_with_master(nil)
|
120
127
|
lambda {
|
data/spec/ey/deploy_spec.rb
CHANGED
@@ -175,13 +175,13 @@ describe "ey deploy" do
|
|
175
175
|
@ssh_commands.last.should =~ /--branch master/
|
176
176
|
end
|
177
177
|
|
178
|
-
it "complains about a non-default branch without --
|
178
|
+
it "complains about a non-default branch without --ignore-default_branch" do
|
179
179
|
ey "deploy -r current-branch", :expect_failure => true
|
180
180
|
@err.should =~ /deploy branch is set to "master"/
|
181
181
|
end
|
182
182
|
|
183
|
-
it "deploys a non-default branch with --
|
184
|
-
ey "deploy -r current-branch --
|
183
|
+
it "deploys a non-default branch with --ignore-default-branch" do
|
184
|
+
ey "deploy -r current-branch --ignore-default-branch"
|
185
185
|
@ssh_commands.last.should =~ /--branch current-branch/
|
186
186
|
end
|
187
187
|
end
|
data/spec/support/fake_awsm.ru
CHANGED
@@ -155,6 +155,7 @@ private
|
|
155
155
|
"instances_count" => 1,
|
156
156
|
"stack_name" => "nginx_mongrel",
|
157
157
|
"id" => 200,
|
158
|
+
"framework_env" => "production",
|
158
159
|
"app_master" => {
|
159
160
|
"status" => "running",
|
160
161
|
"id" => 27220,
|
@@ -208,6 +209,7 @@ private
|
|
208
209
|
"instances_count" => 1,
|
209
210
|
"stack_name" => "nginx_mongrel",
|
210
211
|
"id" => 200,
|
212
|
+
"framework_env" => "production",
|
211
213
|
"app_master" => _instances.first}],
|
212
214
|
"repository_uri" => git_remote}]
|
213
215
|
end
|
@@ -223,6 +225,7 @@ private
|
|
223
225
|
"instances_count" => 1,
|
224
226
|
"stack_name" => "nginx_mongrel",
|
225
227
|
"id" => 200,
|
228
|
+
"framework_env" => "production",
|
226
229
|
"app_master" => _instances[0]}]
|
227
230
|
end
|
228
231
|
|
@@ -273,6 +276,7 @@ private
|
|
273
276
|
"instances_count" => 1,
|
274
277
|
"stack_name" => "nginx_mongrel",
|
275
278
|
"id" => 200,
|
279
|
+
"framework_env" => "production",
|
276
280
|
"app_master" => {
|
277
281
|
"status" => "running",
|
278
282
|
"id" => 27220,
|
@@ -308,6 +312,7 @@ private
|
|
308
312
|
"instances_count" => 1,
|
309
313
|
"stack_name" => "nginx_mongrel",
|
310
314
|
"id" => 200,
|
315
|
+
"framework_env" => "production",
|
311
316
|
"app_master" => {
|
312
317
|
"status" => "running",
|
313
318
|
"id" => 27220,
|
@@ -379,6 +384,7 @@ private
|
|
379
384
|
"app_master" => keycollector_master,
|
380
385
|
"instances" => [keycollector_master],
|
381
386
|
"id" => 4359,
|
387
|
+
"framework_env" => "production",
|
382
388
|
"stack_name" => "nginx_mongrel"}],
|
383
389
|
}, {
|
384
390
|
"name" => "rails232app",
|
@@ -394,6 +400,7 @@ private
|
|
394
400
|
"name" => "giblets",
|
395
401
|
"app_master" => railsapp_master,
|
396
402
|
"instances" => [railsapp_master],
|
403
|
+
"framework_env" => "production",
|
397
404
|
"id" => 200,
|
398
405
|
"stack_name" => "nginx_unicorn"}],
|
399
406
|
}]
|
@@ -414,6 +421,7 @@ private
|
|
414
421
|
"id" => 6125}],
|
415
422
|
}, {
|
416
423
|
"id" => 4359,
|
424
|
+
"framework_env" => "production",
|
417
425
|
"name" => "keycollector_production",
|
418
426
|
"ssh_username" => "deploy",
|
419
427
|
"stack_name" => "nginx_mongrel",
|
@@ -448,6 +456,7 @@ private
|
|
448
456
|
"apps" => apps,
|
449
457
|
"instances_count" => 1,
|
450
458
|
"stack_name" => "nginx_mongrel",
|
459
|
+
"framework_env" => "production",
|
451
460
|
"id" => 200,
|
452
461
|
"app_master" => {
|
453
462
|
"status" => "running",
|
@@ -469,6 +478,7 @@ private
|
|
469
478
|
"instances_count" => 1,
|
470
479
|
"stack_name" => "nginx_passenger",
|
471
480
|
"id" => 8371,
|
481
|
+
"framework_env" => "production",
|
472
482
|
"app_master" => {
|
473
483
|
"public_hostname" => '127.3.2.1',
|
474
484
|
"status" => "running",
|
@@ -488,6 +498,7 @@ private
|
|
488
498
|
"instances_count" => 1,
|
489
499
|
"stack_name" => "nginx_passenger",
|
490
500
|
"id" => 8371,
|
501
|
+
"framework_env" => "production",
|
491
502
|
"app_master" => {
|
492
503
|
"public_hostname" => '127.44.55.66',
|
493
504
|
"status" => "running",
|
@@ -514,6 +525,7 @@ private
|
|
514
525
|
"instances_count" => 1,
|
515
526
|
"stack_name" => "nginx_mongrel",
|
516
527
|
"id" => 200,
|
528
|
+
"framework_env" => "production",
|
517
529
|
"app_master" => {
|
518
530
|
"public_hostname" => "ec2-174-129-198-124.compute-1.amazonaws.com",
|
519
531
|
"status" => "running",
|
@@ -536,6 +548,7 @@ private
|
|
536
548
|
"instances_count" => 1,
|
537
549
|
"stack_name" => "nginx_passenger",
|
538
550
|
"id" => 8371,
|
551
|
+
"framework_env" => "production",
|
539
552
|
"app_master" => {
|
540
553
|
"public_hostname" => '127.3.2.1',
|
541
554
|
"status" => "running",
|
@@ -559,6 +572,7 @@ private
|
|
559
572
|
"instances_count" => 1,
|
560
573
|
"stack_name" => "nginx_passenger",
|
561
574
|
"id" => 8371,
|
575
|
+
"framework_env" => "production",
|
562
576
|
"app_master" => {
|
563
577
|
"public_hostname" => '127.44.55.66',
|
564
578
|
"status" => "running",
|
@@ -113,32 +113,40 @@ end
|
|
113
113
|
shared_examples_for "it invokes eysd" do
|
114
114
|
include Spec::Helpers::SharedIntegrationTestUtils
|
115
115
|
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
116
|
+
context "with arguments" do
|
117
|
+
before(:all) do
|
118
|
+
api_scenario "one app, one environment"
|
119
|
+
run_ey({:env => 'giblets', :verbose => true})
|
120
|
+
end
|
121
121
|
|
122
|
-
|
123
|
-
|
124
|
-
|
122
|
+
it "passes --verbose to eysd" do
|
123
|
+
@ssh_commands.should have_command_like(/eysd.*deploy.*--verbose/)
|
124
|
+
end
|
125
125
|
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
126
|
+
it "passes along instance information to eysd" do
|
127
|
+
instance_args = [
|
128
|
+
Regexp.quote("ec2-174-129-198-124.compute-1.amazonaws.com,app_master"),
|
129
|
+
Regexp.quote("ec2-174-129-142-53.compute-1.amazonaws.com,db_master"),
|
130
|
+
Regexp.quote("ec2-72-44-46-66.compute-1.amazonaws.com,app"),
|
131
|
+
Regexp.quote("ec2-184-73-116-228.compute-1.amazonaws.com,util,fluffy"),
|
132
|
+
]
|
133
|
+
|
134
|
+
# they should all be mentioned
|
135
|
+
instance_args.each do |i|
|
136
|
+
@ssh_commands.last.should =~ /#{i}/
|
137
|
+
end
|
132
138
|
|
133
|
-
|
134
|
-
|
135
|
-
|
139
|
+
# after the option '--instances'
|
140
|
+
@ssh_commands.last.should match(/--instances (#{instance_args.join('|')})/)
|
141
|
+
end
|
142
|
+
|
143
|
+
it "passes the framework environment" do
|
144
|
+
@ssh_commands.last.should match(/--framework-env production/)
|
136
145
|
end
|
137
146
|
|
138
|
-
# after the option '--instances'
|
139
|
-
@ssh_commands.last.should match(/--instances (#{instance_args.join('|')})/)
|
140
147
|
end
|
141
148
|
|
149
|
+
|
142
150
|
context "eysd installation" do
|
143
151
|
before(:all) do
|
144
152
|
api_scenario "one app, one environment"
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 8
|
8
|
+
- 0
|
9
|
+
version: 0.8.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- EY Cloud Team
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-06-
|
17
|
+
date: 2010-06-30 00:00:00 -07:00
|
18
18
|
default_executable: ey
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|