engineyard 2.0.9 → 2.0.10
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 +24 -26
- data/lib/engineyard/cli/api.rb +1 -1
- data/lib/engineyard/cli/recipes.rb +4 -4
- data/lib/engineyard/cli/ui.rb +19 -7
- data/lib/engineyard/deploy_config/migrate.rb +7 -7
- data/lib/engineyard/serverside_runner.rb +1 -1
- data/lib/engineyard/thor.rb +3 -7
- data/lib/engineyard/version.rb +2 -2
- data/spec/engineyard/cli/api_spec.rb +3 -1
- data/spec/engineyard/deploy_config_spec.rb +31 -10
- data/spec/ey/deploy_spec.rb +3 -16
- data/spec/ey/rebuild_spec.rb +1 -1
- data/spec/ey/recipes/upload_spec.rb +0 -27
- data/spec/ey/rollback_spec.rb +1 -1
- data/spec/ey/ssh_spec.rb +8 -0
- data/spec/ey/status_spec.rb +16 -1
- data/spec/spec_helper.rb +1 -8
- data/spec/support/git_repos.rb +78 -0
- data/spec/support/helpers.rb +7 -18
- data/spec/support/shared_behavior.rb +0 -14
- metadata +22 -22
data/lib/engineyard/cli.rb
CHANGED
@@ -16,19 +16,20 @@ module EY
|
|
16
16
|
|
17
17
|
include Thor::Actions
|
18
18
|
|
19
|
-
def self.start(
|
19
|
+
def self.start(given_args=ARGV, config={})
|
20
|
+
Thor::Base.shell = EY::CLI::UI
|
20
21
|
ui = EY::CLI::UI.new
|
21
|
-
super
|
22
|
+
super(given_args, {:shell => ui}.merge(config))
|
22
23
|
rescue EY::Error, EY::CloudClient::Error => e
|
23
24
|
ui.print_exception(e)
|
24
|
-
|
25
|
+
exit 1
|
25
26
|
rescue Interrupt => e
|
26
27
|
puts
|
27
28
|
ui.print_exception(e)
|
28
29
|
ui.say("Quitting...")
|
29
30
|
raise
|
30
|
-
rescue SystemExit
|
31
|
-
# don't print a message for
|
31
|
+
rescue SystemExit, Errno::EPIPE
|
32
|
+
# don't print a message for safe exits
|
32
33
|
raise
|
33
34
|
rescue Exception => e
|
34
35
|
ui.print_exception(e)
|
@@ -37,6 +38,7 @@ module EY
|
|
37
38
|
|
38
39
|
class_option :api_token, :type => :string, :desc => "Use API-TOKEN to authenticate this command"
|
39
40
|
class_option :serverside_version, :type => :string, :desc => "Please use with care! Override deploy system version (same as ENV variable ENGINEYARD_SERVERSIDE_VERSION)"
|
41
|
+
class_option :quiet, :aliases => %w[-q], :type => :boolean, :desc => "Quieter CLI output."
|
40
42
|
|
41
43
|
desc "deploy [--environment ENVIRONMENT] [--ref GIT-REF]",
|
42
44
|
"Deploy specified branch, tag, or sha to specified environment."
|
@@ -91,10 +93,10 @@ module EY
|
|
91
93
|
|
92
94
|
runner = serverside_runner(app_env, deploy_config.verbose, deployment.serverside_version, options[:ignore_bad_master])
|
93
95
|
|
94
|
-
out = EY::CLI::UI::Tee.new(ui.out, deployment.
|
95
|
-
err = EY::CLI::UI::Tee.new(ui.err, deployment.
|
96
|
+
out = EY::CLI::UI::Tee.new(ui.out, deployment.output)
|
97
|
+
err = EY::CLI::UI::Tee.new(ui.err, deployment.output)
|
96
98
|
|
97
|
-
ui.info "Beginning deploy..."
|
99
|
+
ui.info "Beginning deploy...", :green
|
98
100
|
begin
|
99
101
|
deployment.start
|
100
102
|
ui.show_deployment(deployment)
|
@@ -120,14 +122,14 @@ module EY
|
|
120
122
|
ui.print_exception(e)
|
121
123
|
raise
|
122
124
|
ensure
|
125
|
+
ui.info "Saving log... ", :green
|
123
126
|
deployment.finished
|
124
127
|
|
125
128
|
if deployment.successful?
|
126
|
-
ui.info "Successful deployment recorded on Engine Yard Cloud"
|
127
|
-
ui.info "
|
128
|
-
ui.info "Now you can run `ey launch' to open the application in a browser."
|
129
|
+
ui.info "Successful deployment recorded on Engine Yard Cloud.", :green
|
130
|
+
ui.info "Run `ey launch` to open the application in a browser."
|
129
131
|
else
|
130
|
-
ui.info "Failed deployment recorded on Engine Yard Cloud"
|
132
|
+
ui.info "Failed deployment recorded on Engine Yard Cloud", :green
|
131
133
|
raise EY::Error, "Deploy failed"
|
132
134
|
end
|
133
135
|
end
|
@@ -151,11 +153,7 @@ module EY
|
|
151
153
|
app_env = fetch_app_environment(options[:app], options[:environment], options[:account])
|
152
154
|
deployment = app_env.last_deployment
|
153
155
|
if deployment
|
154
|
-
ui.
|
155
|
-
ui.say "#"
|
156
|
-
ui.show_deployment(deployment)
|
157
|
-
ui.say "#"
|
158
|
-
ui.deployment_result(deployment)
|
156
|
+
ui.deployment_status(deployment)
|
159
157
|
else
|
160
158
|
raise EY::Error, "Application #{app_env.app.name} has not been deployed on #{app_env.environment.name}."
|
161
159
|
end
|
@@ -184,7 +182,7 @@ module EY
|
|
184
182
|
if options[:all] && options[:simple]
|
185
183
|
ui.print_simple_envs api.environments
|
186
184
|
elsif options[:all]
|
187
|
-
ui.print_envs
|
185
|
+
ui.print_envs api.apps
|
188
186
|
else
|
189
187
|
remotes = nil
|
190
188
|
if options[:app] == ''
|
@@ -241,7 +239,7 @@ module EY
|
|
241
239
|
:desc => "Name of the account in which the environment can be found"
|
242
240
|
def rebuild
|
243
241
|
environment = fetch_environment(options[:environment], options[:account])
|
244
|
-
ui.
|
242
|
+
ui.info "Updating instances on #{environment.hierarchy_name}"
|
245
243
|
environment.rebuild
|
246
244
|
end
|
247
245
|
map "update" => :rebuild
|
@@ -270,7 +268,7 @@ module EY
|
|
270
268
|
env_config = config.environment_config(app_env.environment_name)
|
271
269
|
deploy_config = EY::DeployConfig.new(options, env_config, repo, ui)
|
272
270
|
|
273
|
-
ui.info
|
271
|
+
ui.info "Rolling back #{app_env.hierarchy_name}"
|
274
272
|
|
275
273
|
runner = serverside_runner(app_env, deploy_config.verbose)
|
276
274
|
runner.rollback do |args|
|
@@ -370,15 +368,15 @@ module EY
|
|
370
368
|
def logs
|
371
369
|
environment = fetch_environment(options[:environment], options[:account])
|
372
370
|
environment.logs.each do |log|
|
373
|
-
ui.
|
371
|
+
ui.say "Instance: #{log.instance_name}"
|
374
372
|
|
375
373
|
if log.main
|
376
|
-
ui.
|
374
|
+
ui.say "Main logs for #{environment.name}:", :green
|
377
375
|
ui.say log.main
|
378
376
|
end
|
379
377
|
|
380
378
|
if log.custom
|
381
|
-
ui.
|
379
|
+
ui.say "Custom logs for #{environment.name}:", :green
|
382
380
|
ui.say log.custom
|
383
381
|
end
|
384
382
|
end
|
@@ -483,10 +481,10 @@ module EY
|
|
483
481
|
def logout
|
484
482
|
eyrc = EYRC.load
|
485
483
|
if eyrc.delete_api_token
|
486
|
-
ui.
|
487
|
-
ui.
|
484
|
+
ui.info "API token removed: #{eyrc.path}"
|
485
|
+
ui.info "Run any other command to login again."
|
488
486
|
else
|
489
|
-
ui.
|
487
|
+
ui.info "Already logged out. Run any other command to login again."
|
490
488
|
end
|
491
489
|
end
|
492
490
|
|
data/lib/engineyard/cli/api.rb
CHANGED
@@ -76,7 +76,7 @@ module EY
|
|
76
76
|
@source = "credentials"
|
77
77
|
@specified = false
|
78
78
|
|
79
|
-
@ui.info
|
79
|
+
@ui.info "We need to fetch your API token; please log in."
|
80
80
|
begin
|
81
81
|
email = @ui.ask("Email: ")
|
82
82
|
passwd = @ui.ask("Password: ", true)
|
@@ -60,17 +60,17 @@ module EY
|
|
60
60
|
no_tasks do
|
61
61
|
def apply_recipes(environment)
|
62
62
|
environment.run_custom_recipes
|
63
|
-
ui.
|
63
|
+
ui.info "Uploaded recipes started for #{environment.name}"
|
64
64
|
end
|
65
65
|
|
66
66
|
def upload_recipes(environment, filename)
|
67
67
|
if filename && filename != ''
|
68
68
|
environment.upload_recipes_at_path(filename)
|
69
|
-
ui.
|
69
|
+
ui.info "Recipes file #{filename} uploaded successfully for #{environment.name}"
|
70
70
|
else
|
71
71
|
path = cookbooks_dir_archive_path
|
72
72
|
environment.upload_recipes_at_path(path)
|
73
|
-
ui.
|
73
|
+
ui.info "Recipes in cookbooks/ uploaded successfully for #{environment.name}"
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
@@ -114,7 +114,7 @@ module EY
|
|
114
114
|
cmd = "tar xzf '#{recipes.path}' cookbooks"
|
115
115
|
|
116
116
|
if system(cmd)
|
117
|
-
ui.
|
117
|
+
ui.info "Recipes downloaded successfully for #{environment.name}"
|
118
118
|
else
|
119
119
|
raise EY::Error, "Could not unarchive recipes.\nCommand `#{cmd}` exited with an error."
|
120
120
|
end
|
data/lib/engineyard/cli/ui.rb
CHANGED
@@ -36,7 +36,7 @@ module EY
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def self.interactive?
|
39
|
-
@mock || ($
|
39
|
+
@mock || ($stdout && $stdout.tty?)
|
40
40
|
end
|
41
41
|
|
42
42
|
def self.ask(question, password = false, default = nil)
|
@@ -77,7 +77,7 @@ module EY
|
|
77
77
|
if interactive?
|
78
78
|
block.call
|
79
79
|
else
|
80
|
-
Timeout.timeout(
|
80
|
+
Timeout.timeout(2, &block)
|
81
81
|
end
|
82
82
|
end
|
83
83
|
end
|
@@ -93,8 +93,9 @@ module EY
|
|
93
93
|
say_with_status(name, message, :yellow)
|
94
94
|
end
|
95
95
|
|
96
|
-
def info(
|
97
|
-
|
96
|
+
def info(message, color = nil)
|
97
|
+
return if quiet?
|
98
|
+
say_with_status(message, nil, color)
|
98
99
|
end
|
99
100
|
|
100
101
|
def debug(name, message = nil)
|
@@ -156,7 +157,18 @@ module EY
|
|
156
157
|
end
|
157
158
|
end
|
158
159
|
|
160
|
+
def deployment_status(deployment)
|
161
|
+
unless quiet?
|
162
|
+
say "# Status of last deployment of #{deployment.app_environment.hierarchy_name}:"
|
163
|
+
say "#"
|
164
|
+
show_deployment(deployment)
|
165
|
+
say "#"
|
166
|
+
end
|
167
|
+
deployment_result(deployment)
|
168
|
+
end
|
169
|
+
|
159
170
|
def show_deployment(dep)
|
171
|
+
return if quiet?
|
160
172
|
output = []
|
161
173
|
output << ["Account", dep.app.account.name]
|
162
174
|
output << ["Application", dep.app.name]
|
@@ -177,11 +189,11 @@ module EY
|
|
177
189
|
|
178
190
|
def deployment_result(dep)
|
179
191
|
if dep.successful?
|
180
|
-
|
192
|
+
say 'Deployment was successful.', :green
|
181
193
|
elsif dep.finished_at.nil?
|
182
|
-
|
194
|
+
say 'Deployment is not finished.', :yellow
|
183
195
|
else
|
184
|
-
|
196
|
+
say 'Deployment failed.', :red
|
185
197
|
end
|
186
198
|
end
|
187
199
|
|
@@ -78,11 +78,12 @@ module EY
|
|
78
78
|
if @perfom.nil? && @command = command_from_config
|
79
79
|
@perform = true
|
80
80
|
env_config.migrate = @perform
|
81
|
-
ui.
|
81
|
+
ui.info "********************************************************************************"
|
82
82
|
ui.info "#{env_config.path} config for #{env_config.name} has been updated to"
|
83
83
|
ui.info "migrate by default to maintain previous expected default behavior."
|
84
|
-
ui.
|
85
|
-
ui.
|
84
|
+
ui.info ""
|
85
|
+
ui.info "Please git commit #{env_config.path} with these new changes.", :yellow
|
86
|
+
ui.info ""
|
86
87
|
true
|
87
88
|
else
|
88
89
|
false
|
@@ -90,15 +91,14 @@ module EY
|
|
90
91
|
end
|
91
92
|
|
92
93
|
def perform_from_interaction
|
93
|
-
ui.warn "Please choose a default migration behavior for this environment."
|
94
94
|
@perform = ui.agree("Run migrations by default on #{env_config.name}? ", true)
|
95
95
|
env_config.migrate = @perform
|
96
96
|
if @perform
|
97
97
|
command_from_interaction
|
98
98
|
end
|
99
|
-
ui.
|
100
|
-
ui.
|
101
|
-
ui.info "Please git commit #{env_config.path} with these new changes."
|
99
|
+
ui.info "#{env_config.path}: migrate settings saved for #{env_config.name}."
|
100
|
+
ui.info "You can override this default with --migrate or --no-migrate."
|
101
|
+
ui.info "Please git commit #{env_config.path} with these new changes.", :yellow
|
102
102
|
true
|
103
103
|
rescue Timeout::Error
|
104
104
|
@perform = nil
|
data/lib/engineyard/thor.rb
CHANGED
@@ -12,13 +12,9 @@ module EY
|
|
12
12
|
@config ||= EY::Config.new
|
13
13
|
end
|
14
14
|
|
15
|
+
# engineyard gem uses ui everywhere, thore supplies shell
|
15
16
|
def ui
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
def load_ui
|
20
|
-
Thor::Base.shell = EY::CLI::UI
|
21
|
-
EY::CLI::UI.new
|
17
|
+
shell
|
22
18
|
end
|
23
19
|
|
24
20
|
def in_repo?
|
@@ -45,7 +41,7 @@ module EY
|
|
45
41
|
|
46
42
|
def use_default_environment
|
47
43
|
if env = config.default_environment
|
48
|
-
ui.
|
44
|
+
ui.info "Using default environment #{config.default_environment.inspect} from ey.yml."
|
49
45
|
env
|
50
46
|
end
|
51
47
|
end
|
data/lib/engineyard/version.rb
CHANGED
@@ -29,7 +29,9 @@ describe EY::CLI::API do
|
|
29
29
|
EY::CLI::UI::Prompter.add_answer "my@email.example.com"
|
30
30
|
EY::CLI::UI::Prompter.add_answer "secret"
|
31
31
|
|
32
|
-
|
32
|
+
capture_stdout do
|
33
|
+
@api = EY::CLI::API.new('http://fake.local', EY::CLI::UI.new)
|
34
|
+
end
|
33
35
|
end
|
34
36
|
|
35
37
|
it "asks you for your credentials" do
|
@@ -26,8 +26,13 @@ describe EY::DeployConfig::Migrate do
|
|
26
26
|
@parent.should_receive(:set_environment_option).with('envname', 'migrate', true)
|
27
27
|
@parent.should_receive(:set_environment_option).with('envname', 'migration_command', 'rake db:migrate')
|
28
28
|
dc = deploy_config({})
|
29
|
-
|
30
|
-
|
29
|
+
out = capture_stdout do
|
30
|
+
dc.migrate.should be_true
|
31
|
+
dc.migrate_command.should == 'rake db:migrate'
|
32
|
+
end
|
33
|
+
out.should =~ /path: migrate settings saved for envname/
|
34
|
+
out.should =~ /You can override this default with --migrate or --no-migrate/
|
35
|
+
out.should =~ /Please git commit path with these new changes./
|
31
36
|
end
|
32
37
|
|
33
38
|
it "prompts migration_command if first answer is yes" do
|
@@ -36,16 +41,20 @@ describe EY::DeployConfig::Migrate do
|
|
36
41
|
@parent.should_receive(:set_environment_option).with('envname', 'migrate', true)
|
37
42
|
@parent.should_receive(:set_environment_option).with('envname', 'migration_command', 'ruby script/migrate')
|
38
43
|
dc = deploy_config({})
|
39
|
-
|
40
|
-
|
44
|
+
capture_stdout do
|
45
|
+
dc.migrate.should be_true
|
46
|
+
dc.migrate_command.should == 'ruby script/migrate'
|
47
|
+
end
|
41
48
|
end
|
42
49
|
|
43
50
|
it "doesn't prompt migration_command if first answer is no" do
|
44
51
|
EY::CLI::UI::Prompter.add_answer "no" # default
|
45
52
|
@parent.should_receive(:set_environment_option).with('envname', 'migrate', false)
|
46
53
|
dc = deploy_config({})
|
47
|
-
|
48
|
-
|
54
|
+
capture_stdout do
|
55
|
+
dc.migrate.should be_false
|
56
|
+
dc.migrate_command.should be_nil
|
57
|
+
end
|
49
58
|
end
|
50
59
|
end
|
51
60
|
|
@@ -120,7 +129,10 @@ describe EY::DeployConfig::Migrate do
|
|
120
129
|
before { env_config('branch' => 'default') }
|
121
130
|
|
122
131
|
it "uses the configured default if ref is not passed" do
|
123
|
-
|
132
|
+
out = capture_stdout do
|
133
|
+
deploy_config({}).ref.should == 'default'
|
134
|
+
end
|
135
|
+
out.should =~ /Using default branch "default" from ey.yml/
|
124
136
|
end
|
125
137
|
|
126
138
|
it "raises if a default is set and --ref is passed on the cli (and they don't match)" do
|
@@ -132,18 +144,27 @@ describe EY::DeployConfig::Migrate do
|
|
132
144
|
end
|
133
145
|
|
134
146
|
it "returns the ref if force_ref is set" do
|
135
|
-
|
147
|
+
out = capture_stdout do
|
148
|
+
deploy_config({'ref' => 'master', 'force_ref' => true}).ref.should == 'master'
|
149
|
+
end
|
150
|
+
out.should =~ /Default ref overridden with "master"/
|
136
151
|
end
|
137
152
|
|
138
153
|
it "returns the ref if force_ref is a branch" do
|
139
|
-
|
154
|
+
out = capture_stdout do
|
155
|
+
deploy_config({'force_ref' => 'master'}).ref.should == 'master'
|
156
|
+
end
|
157
|
+
out.should =~ /Default ref overridden with "master"/
|
140
158
|
end
|
141
159
|
end
|
142
160
|
|
143
161
|
context "no options, no default" do
|
144
162
|
it "uses the repo's current branch" do
|
145
163
|
@repo.should_receive(:current_branch).and_return('current')
|
146
|
-
|
164
|
+
out = capture_stdout do
|
165
|
+
deploy_config({}).ref.should == 'current'
|
166
|
+
end
|
167
|
+
out.should =~ /Using current HEAD branch "current"/
|
147
168
|
end
|
148
169
|
end
|
149
170
|
end
|
data/spec/ey/deploy_spec.rb
CHANGED
@@ -69,9 +69,9 @@ describe "ey deploy" do
|
|
69
69
|
ENV['NO_SSH'] = 'true'
|
70
70
|
end
|
71
71
|
|
72
|
-
it "tells you that you need to add an appropriate ssh key" do
|
72
|
+
it "tells you that you need to add an appropriate ssh key (even with --quiet)" do
|
73
73
|
login_scenario "one app, one environment"
|
74
|
-
fast_failing_ey %w[deploy --no-migrate]
|
74
|
+
fast_failing_ey %w[deploy --no-migrate --quiet]
|
75
75
|
@err.should include("Authentication Failed")
|
76
76
|
end
|
77
77
|
end
|
@@ -249,19 +249,6 @@ describe "ey deploy" do
|
|
249
249
|
end
|
250
250
|
|
251
251
|
context "choosing something to deploy" do
|
252
|
-
define_git_repo('deploy test') do
|
253
|
-
# we'll have one commit on master
|
254
|
-
system("echo 'source :gemcutter' > Gemfile")
|
255
|
-
system("git add Gemfile")
|
256
|
-
system("git commit -m 'initial commit' >/dev/null 2>&1")
|
257
|
-
|
258
|
-
# and a tag
|
259
|
-
system("git tag -a -m 'version one' v1")
|
260
|
-
|
261
|
-
# and we need a non-master branch
|
262
|
-
system("git checkout -b current-branch >/dev/null 2>&1")
|
263
|
-
end
|
264
|
-
|
265
252
|
use_git_repo('deploy test')
|
266
253
|
|
267
254
|
before(:all) do
|
@@ -363,7 +350,7 @@ describe "ey deploy" do
|
|
363
350
|
if @ssh_commands.last =~ /--config (.*?)(?: -|$)/
|
364
351
|
# the echo strips off the layer of shell escaping, leaving us
|
365
352
|
# with pristine JSON
|
366
|
-
|
353
|
+
MultiJson.load `echo #{$1}`
|
367
354
|
end
|
368
355
|
end
|
369
356
|
|
data/spec/ey/rebuild_spec.rb
CHANGED
@@ -11,7 +11,7 @@ describe "ey rebuild" do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def verify_ran(scenario)
|
14
|
-
@out.should =~ /
|
14
|
+
@out.should =~ /Updating instances on \w+\/#{scenario[:environment]}/
|
15
15
|
end
|
16
16
|
|
17
17
|
include_examples "it takes an environment name and an account name"
|
@@ -3,10 +3,6 @@ require 'spec_helper'
|
|
3
3
|
describe "ey recipes upload" do
|
4
4
|
given "integration"
|
5
5
|
|
6
|
-
define_git_repo('+cookbooks') do |git_dir|
|
7
|
-
git_dir.join("cookbooks").mkdir
|
8
|
-
git_dir.join("cookbooks/file").open("w") {|f| f << "boo" }
|
9
|
-
end
|
10
6
|
use_git_repo('+cookbooks')
|
11
7
|
|
12
8
|
def command_to_run(opts)
|
@@ -26,9 +22,6 @@ end
|
|
26
22
|
describe "ey recipes upload -f recipes.tgz" do
|
27
23
|
given "integration"
|
28
24
|
|
29
|
-
define_git_repo('+recipes') do |git_dir|
|
30
|
-
link_recipes_tgz(git_dir)
|
31
|
-
end
|
32
25
|
use_git_repo('+recipes')
|
33
26
|
|
34
27
|
def command_to_run(opts)
|
@@ -73,15 +66,6 @@ describe "ey recipes upload from a separate cookbooks directory" do
|
|
73
66
|
given "integration"
|
74
67
|
|
75
68
|
context "without any git remotes" do
|
76
|
-
define_git_repo "only cookbooks, no remotes" do |git_dir|
|
77
|
-
`git --git-dir "#{git_dir}/.git" remote`.split("\n").each do |remote|
|
78
|
-
`git --git-dir "#{git_dir}/.git" remote rm #{remote}`
|
79
|
-
end
|
80
|
-
|
81
|
-
git_dir.join("cookbooks").mkdir
|
82
|
-
File.open(git_dir.join("cookbooks/file"), "w"){|f| f << "stuff" }
|
83
|
-
end
|
84
|
-
|
85
69
|
use_git_repo "only cookbooks, no remotes"
|
86
70
|
|
87
71
|
it "takes the environment specified by -e" do
|
@@ -102,17 +86,6 @@ describe "ey recipes upload from a separate cookbooks directory" do
|
|
102
86
|
end
|
103
87
|
|
104
88
|
context "with a git remote unrelated to any application" do
|
105
|
-
define_git_repo "only cookbooks, unrelated remotes" do |git_dir|
|
106
|
-
`git --git-dir "#{git_dir}/.git" remote`.split("\n").each do |remote|
|
107
|
-
`git --git-dir "#{git_dir}/.git" remote rm #{remote}`
|
108
|
-
end
|
109
|
-
|
110
|
-
`git remote add origin polly@pirate.example.com:wanna/cracker.git`
|
111
|
-
|
112
|
-
git_dir.join("cookbooks").mkdir
|
113
|
-
File.open(git_dir.join("cookbooks/file"), "w"){|f| f << "rawk" }
|
114
|
-
end
|
115
|
-
|
116
89
|
use_git_repo "only cookbooks, unrelated remotes"
|
117
90
|
|
118
91
|
it "takes the environment specified by -e" do
|
data/spec/ey/rollback_spec.rb
CHANGED
data/spec/ey/ssh_spec.rb
CHANGED
@@ -26,6 +26,7 @@ shared_examples_for "running ey ssh for select role" do
|
|
26
26
|
def command_to_run(opts)
|
27
27
|
cmd = ["ssh", opts[:ssh_command]].compact + (@ssh_flag || [])
|
28
28
|
cmd << "--environment" << opts[:environment] if opts[:environment]
|
29
|
+
cmd << "--quiet" if opts[:quiet]
|
29
30
|
cmd
|
30
31
|
end
|
31
32
|
|
@@ -42,6 +43,13 @@ shared_examples_for "running ey ssh for select role" do
|
|
42
43
|
end.count.should == @hosts.count
|
43
44
|
end
|
44
45
|
|
46
|
+
it "is quiet" do
|
47
|
+
login_scenario "one app, one environment"
|
48
|
+
ey command_to_run(:ssh_command => "ls", :environment => 'giblets', :quiet => true)
|
49
|
+
@out.should =~ /ssh.*ls/
|
50
|
+
@out.should_not =~ /Loading application data/
|
51
|
+
end
|
52
|
+
|
45
53
|
it "raises an error when there are no matching hosts" do
|
46
54
|
login_scenario "one app, one environment, no instances"
|
47
55
|
ey command_to_run({:ssh_command => "ls", :environment => 'giblets', :verbose => true}), :expect_failure => true
|
data/spec/ey/status_spec.rb
CHANGED
@@ -25,6 +25,21 @@ describe "ey environments" do
|
|
25
25
|
@out.should =~ /Deployed by:\s+One App Many Envs/
|
26
26
|
@out.should =~ /Started at:/
|
27
27
|
@out.should =~ /Finished at:/
|
28
|
-
@out.should =~ /
|
28
|
+
@out.should =~ /Deployment was successful/
|
29
|
+
end
|
30
|
+
|
31
|
+
it "quiets almost all of the output with --quiet" do
|
32
|
+
fast_ey %w[deploy -e giblets --ref HEAD --no-migrate]
|
33
|
+
fast_ey %w[status -e giblets -q]
|
34
|
+
@out.should_not =~ /Application:\s+rails232app/
|
35
|
+
@out.should_not =~ /Environment:\s+giblets/
|
36
|
+
@out.should_not =~ /Ref:\s+HEAD/
|
37
|
+
@out.should_not =~ /Resolved Ref:\s+resolved-HEAD/
|
38
|
+
@out.should_not =~ /Commit:\s+[a-f0-9]{40}/
|
39
|
+
@out.should_not =~ /Migrate:\s+false/
|
40
|
+
@out.should_not =~ /Deployed by:\s+One App Many Envs/
|
41
|
+
@out.should_not =~ /Started at:/
|
42
|
+
@out.should_not =~ /Finished at:/
|
43
|
+
@out.should =~ /Deployment was successful/
|
29
44
|
end
|
30
45
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -17,7 +17,7 @@ require 'net/ssh'
|
|
17
17
|
require 'fakeweb'
|
18
18
|
require 'fakeweb_matcher'
|
19
19
|
|
20
|
-
require '
|
20
|
+
require 'multi_json'
|
21
21
|
|
22
22
|
# Engineyard gem
|
23
23
|
$LOAD_PATH.unshift(File.join(EY_ROOT, "lib"))
|
@@ -47,7 +47,6 @@ RSpec.configure do |config|
|
|
47
47
|
|
48
48
|
config.extend SpecHelpers::GitRepoHelpers
|
49
49
|
config.extend SpecHelpers::Given
|
50
|
-
config.extend SpecHelpers::Fixtures
|
51
50
|
|
52
51
|
def clean_tmpdir
|
53
52
|
TMPDIR.rmtree if TMPDIR.exist?
|
@@ -78,12 +77,6 @@ RSpec.configure do |config|
|
|
78
77
|
|
79
78
|
end
|
80
79
|
|
81
|
-
EY.define_git_repo("default") do |git_dir|
|
82
|
-
system("echo 'source :gemcutter' > Gemfile")
|
83
|
-
system("git add Gemfile")
|
84
|
-
system("git commit -m 'initial commit' >/dev/null 2>&1")
|
85
|
-
end
|
86
|
-
|
87
80
|
shared_examples_for "integration" do
|
88
81
|
use_git_repo('default')
|
89
82
|
|
data/spec/support/git_repos.rb
CHANGED
@@ -24,6 +24,24 @@ module EY
|
|
24
24
|
git_repo_dir_cache[name] = git_dir
|
25
25
|
end
|
26
26
|
|
27
|
+
def chdir_to_repo(repo_name)
|
28
|
+
@_original_wd ||= []
|
29
|
+
@_original_wd << Dir.getwd
|
30
|
+
Dir.chdir(git_repo_dir(repo_name))
|
31
|
+
end
|
32
|
+
|
33
|
+
def chdir_return
|
34
|
+
Dir.chdir(@_original_wd.pop) if @_original_wd && @_original_wd.any?
|
35
|
+
end
|
36
|
+
|
37
|
+
def fixture_recipes_tgz
|
38
|
+
File.expand_path('../fixture_recipes.tgz', __FILE__)
|
39
|
+
end
|
40
|
+
|
41
|
+
def link_recipes_tgz(git_dir)
|
42
|
+
system("ln -s #{fixture_recipes_tgz} #{git_dir.join('recipes.tgz')}")
|
43
|
+
end
|
44
|
+
|
27
45
|
protected
|
28
46
|
|
29
47
|
def git_repo_setup
|
@@ -34,4 +52,64 @@ module EY
|
|
34
52
|
@git_repo_dir_cache ||= {}
|
35
53
|
end
|
36
54
|
end
|
55
|
+
|
56
|
+
define_git_repo("default") do |git_dir|
|
57
|
+
system("echo 'source :gemcutter' > Gemfile")
|
58
|
+
system("git add Gemfile")
|
59
|
+
system("git commit -m 'initial commit' >/dev/null 2>&1")
|
60
|
+
end
|
61
|
+
|
62
|
+
define_git_repo('deploy test') do
|
63
|
+
# we'll have one commit on master
|
64
|
+
system("echo 'source :gemcutter' > Gemfile")
|
65
|
+
system("git add Gemfile")
|
66
|
+
system("git commit -m 'initial commit' >/dev/null 2>&1")
|
67
|
+
|
68
|
+
# and a tag
|
69
|
+
system("git tag -a -m 'version one' v1")
|
70
|
+
|
71
|
+
# and we need a non-master branch
|
72
|
+
system("git checkout -b current-branch >/dev/null 2>&1")
|
73
|
+
end
|
74
|
+
|
75
|
+
define_git_repo('+cookbooks') do |git_dir|
|
76
|
+
git_dir.join("cookbooks").mkdir
|
77
|
+
git_dir.join("cookbooks/file").open("w") {|f| f << "boo" }
|
78
|
+
end
|
79
|
+
|
80
|
+
define_git_repo('+recipes') do |git_dir|
|
81
|
+
link_recipes_tgz(git_dir)
|
82
|
+
end
|
83
|
+
|
84
|
+
define_git_repo "only cookbooks, no remotes" do |git_dir|
|
85
|
+
`git --git-dir "#{git_dir}/.git" remote`.split("\n").each do |remote|
|
86
|
+
`git --git-dir "#{git_dir}/.git" remote rm #{remote}`
|
87
|
+
end
|
88
|
+
|
89
|
+
git_dir.join("cookbooks").mkdir
|
90
|
+
File.open(git_dir.join("cookbooks/file"), "w"){|f| f << "stuff" }
|
91
|
+
end
|
92
|
+
|
93
|
+
define_git_repo "only cookbooks, unrelated remotes" do |git_dir|
|
94
|
+
`git --git-dir "#{git_dir}/.git" remote`.split("\n").each do |remote|
|
95
|
+
`git --git-dir "#{git_dir}/.git" remote rm #{remote}`
|
96
|
+
end
|
97
|
+
|
98
|
+
`git remote add origin polly@pirate.example.com:wanna/cracker.git`
|
99
|
+
|
100
|
+
git_dir.join("cookbooks").mkdir
|
101
|
+
File.open(git_dir.join("cookbooks/file"), "w"){|f| f << "rawk" }
|
102
|
+
end
|
103
|
+
|
104
|
+
define_git_repo('dup test') do
|
105
|
+
system("git remote add dup git://github.com/engineyard/dup.git")
|
106
|
+
end
|
107
|
+
|
108
|
+
define_git_repo("not actually a git repo") do |git_dir|
|
109
|
+
# in case we screw up and are not in a freshly-generated test
|
110
|
+
# git repository, don't blow away the thing we're developing
|
111
|
+
system("rm -rf .git") if `git remote -v`.include?("path/to/repo.git")
|
112
|
+
git_dir.join("cookbooks").mkdir
|
113
|
+
link_recipes_tgz(git_dir)
|
114
|
+
end
|
37
115
|
end
|
data/spec/support/helpers.rb
CHANGED
@@ -12,16 +12,6 @@ module SpecHelpers
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
module Fixtures
|
16
|
-
def fixture_recipes_tgz
|
17
|
-
File.expand_path('../fixture_recipes.tgz', __FILE__)
|
18
|
-
end
|
19
|
-
|
20
|
-
def link_recipes_tgz(git_dir)
|
21
|
-
system("ln -s #{fixture_recipes_tgz} #{git_dir.join('recipes.tgz')}")
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
15
|
module IntegrationHelpers
|
26
16
|
def run_ey(command_options, ey_options={})
|
27
17
|
|
@@ -55,13 +45,11 @@ module SpecHelpers
|
|
55
45
|
|
56
46
|
def use_git_repo(repo_name)
|
57
47
|
before(:all) do
|
58
|
-
|
59
|
-
@_original_wd << Dir.getwd
|
60
|
-
Dir.chdir(EY.git_repo_dir(repo_name))
|
48
|
+
EY.chdir_to_repo(repo_name)
|
61
49
|
end
|
62
50
|
|
63
51
|
after(:all) do
|
64
|
-
|
52
|
+
EY.chdir_return
|
65
53
|
end
|
66
54
|
end
|
67
55
|
end
|
@@ -93,11 +81,11 @@ module SpecHelpers
|
|
93
81
|
ensure_eyrc
|
94
82
|
|
95
83
|
begin
|
84
|
+
debug = options[:debug] ? 'true' : nil
|
96
85
|
err, out = StringIO.new, StringIO.new
|
97
|
-
debug = options[:debug] == false ? nil : 'true'
|
98
86
|
capture_stderr_into(err) do
|
99
87
|
capture_stdout_into(out) do
|
100
|
-
with_env('DEBUG' => debug) do
|
88
|
+
with_env('DEBUG' => debug, 'PRINT_CMD' => 'true') do
|
101
89
|
EY::CLI.start(args)
|
102
90
|
end
|
103
91
|
end
|
@@ -145,7 +133,8 @@ module SpecHelpers
|
|
145
133
|
path_prepends = options[:prepend_to_path]
|
146
134
|
|
147
135
|
ey_env = {
|
148
|
-
'DEBUG' => '
|
136
|
+
'DEBUG' => ENV['DEBUG'],
|
137
|
+
'PRINT_CMD' => 'true',
|
149
138
|
'EYRC' => ENV['EYRC'],
|
150
139
|
'CLOUD_URL' => ENV['CLOUD_URL'],
|
151
140
|
}
|
@@ -282,7 +271,7 @@ module SpecHelpers
|
|
282
271
|
if ENV.has_key?(k)
|
283
272
|
old_env_vars[k] = ENV[k]
|
284
273
|
end
|
285
|
-
ENV[k] = v
|
274
|
+
ENV[k] = v if v
|
286
275
|
end
|
287
276
|
|
288
277
|
retval = yield
|
@@ -1,11 +1,6 @@
|
|
1
1
|
require 'ostruct'
|
2
2
|
|
3
3
|
shared_examples_for "it has an ambiguous git repo" do
|
4
|
-
|
5
|
-
define_git_repo('dup test') do
|
6
|
-
system("git remote add dup git://github.com/engineyard/dup.git")
|
7
|
-
end
|
8
|
-
|
9
4
|
use_git_repo('dup test')
|
10
5
|
|
11
6
|
before(:all) do
|
@@ -141,15 +136,6 @@ shared_examples_for "it takes an environment name" do
|
|
141
136
|
end
|
142
137
|
|
143
138
|
context "outside a git repo" do
|
144
|
-
|
145
|
-
define_git_repo("not actually a git repo") do |git_dir|
|
146
|
-
# in case we screw up and are not in a freshly-generated test
|
147
|
-
# git repository, don't blow away the thing we're developing
|
148
|
-
system("rm -rf .git") if `git remote -v`.include?("path/to/repo.git")
|
149
|
-
git_dir.join("cookbooks").mkdir
|
150
|
-
link_recipes_tgz(git_dir)
|
151
|
-
end
|
152
|
-
|
153
139
|
use_git_repo("not actually a git repo")
|
154
140
|
|
155
141
|
before :all do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: engineyard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.10
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-12-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rest-client
|
@@ -43,22 +43,6 @@ dependencies:
|
|
43
43
|
- - ~>
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: 1.6.1
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: json_pure
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
|
-
requirements:
|
51
|
-
- - ! '>='
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: '0'
|
54
|
-
type: :runtime
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ! '>='
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
46
|
- !ruby/object:Gem::Dependency
|
63
47
|
name: escape
|
64
48
|
requirement: !ruby/object:Gem::Requirement
|
@@ -242,7 +226,7 @@ dependencies:
|
|
242
226
|
requirements:
|
243
227
|
- - ~>
|
244
228
|
- !ruby/object:Gem::Version
|
245
|
-
version: 0.
|
229
|
+
version: 1.0.0
|
246
230
|
type: :development
|
247
231
|
prerelease: false
|
248
232
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -250,7 +234,7 @@ dependencies:
|
|
250
234
|
requirements:
|
251
235
|
- - ~>
|
252
236
|
- !ruby/object:Gem::Version
|
253
|
-
version: 0.
|
237
|
+
version: 1.0.0
|
254
238
|
- !ruby/object:Gem::Dependency
|
255
239
|
name: open4
|
256
240
|
requirement: !ruby/object:Gem::Requirement
|
@@ -299,6 +283,22 @@ dependencies:
|
|
299
283
|
- - ! '>='
|
300
284
|
- !ruby/object:Gem::Version
|
301
285
|
version: '0'
|
286
|
+
- !ruby/object:Gem::Dependency
|
287
|
+
name: multi_json
|
288
|
+
requirement: !ruby/object:Gem::Requirement
|
289
|
+
none: false
|
290
|
+
requirements:
|
291
|
+
- - ! '>='
|
292
|
+
- !ruby/object:Gem::Version
|
293
|
+
version: '0'
|
294
|
+
type: :development
|
295
|
+
prerelease: false
|
296
|
+
version_requirements: !ruby/object:Gem::Requirement
|
297
|
+
none: false
|
298
|
+
requirements:
|
299
|
+
- - ! '>='
|
300
|
+
- !ruby/object:Gem::Version
|
301
|
+
version: '0'
|
302
302
|
description: This gem allows you to deploy your rails application to the Engine Yard
|
303
303
|
cloud directly from the command line.
|
304
304
|
email: cloud@engineyard.com
|
@@ -425,7 +425,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
425
425
|
version: '0'
|
426
426
|
segments:
|
427
427
|
- 0
|
428
|
-
hash:
|
428
|
+
hash: 4323358539070812213
|
429
429
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
430
430
|
none: false
|
431
431
|
requirements:
|
@@ -434,7 +434,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
434
434
|
version: '0'
|
435
435
|
segments:
|
436
436
|
- 0
|
437
|
-
hash:
|
437
|
+
hash: 4323358539070812213
|
438
438
|
requirements: []
|
439
439
|
rubyforge_project:
|
440
440
|
rubygems_version: 1.8.24
|