engineyard 1.3.0 → 1.3.1
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.rb +0 -1
- data/lib/engineyard/api.rb +1 -1
- data/lib/engineyard/cli.rb +0 -6
- data/lib/engineyard/cli/web.rb +0 -2
- data/lib/engineyard/model/api_struct.rb +4 -2
- data/lib/engineyard/model/environment.rb +0 -4
- data/lib/engineyard/model/instance.rb +34 -106
- data/lib/engineyard/repo.rb +1 -1
- data/lib/engineyard/thor.rb +0 -14
- data/lib/engineyard/version.rb +1 -1
- data/spec/ey/deploy_spec.rb +19 -8
- data/spec/ey/rollback_spec.rb +1 -1
- data/spec/support/shared_behavior.rb +2 -47
- metadata +20 -5
- data/lib/engineyard/serverside_version.rb +0 -3
data/lib/engineyard.rb
CHANGED
data/lib/engineyard/api.rb
CHANGED
data/lib/engineyard/cli.rb
CHANGED
@@ -61,10 +61,6 @@ module EY
|
|
61
61
|
raise(DeployArgumentError)
|
62
62
|
end
|
63
63
|
|
64
|
-
EY.ui.info "Connecting to the server..."
|
65
|
-
|
66
|
-
loudly_check_engineyard_serverside(environment)
|
67
|
-
|
68
64
|
EY.ui.info "Beginning deploy for '#{app.name}' in '#{environment.name}' on server..."
|
69
65
|
|
70
66
|
deploy_options = {'extras' => options[:extra_deploy_hook_options]}
|
@@ -148,8 +144,6 @@ module EY
|
|
148
144
|
app = fetch_app(options[:app])
|
149
145
|
env = fetch_environment(options[:environment], app)
|
150
146
|
|
151
|
-
loudly_check_engineyard_serverside(env)
|
152
|
-
|
153
147
|
EY.ui.info("Rolling back '#{app.name}' in '#{env.name}'")
|
154
148
|
if env.rollback(app,
|
155
149
|
options[:extra_deploy_hook_options],
|
data/lib/engineyard/cli/web.rb
CHANGED
@@ -12,7 +12,6 @@ module EY
|
|
12
12
|
def enable
|
13
13
|
app = fetch_app(options[:app])
|
14
14
|
environment = fetch_environment(options[:environment], app)
|
15
|
-
loudly_check_engineyard_serverside(environment)
|
16
15
|
EY.ui.info "Taking down maintenance page for '#{app.name}' in '#{environment.name}'"
|
17
16
|
environment.take_down_maintenance_page(app, options[:verbose])
|
18
17
|
end
|
@@ -39,7 +38,6 @@ module EY
|
|
39
38
|
def disable
|
40
39
|
app = fetch_app(options[:app])
|
41
40
|
environment = fetch_environment(options[:environment], app)
|
42
|
-
loudly_check_engineyard_serverside(environment)
|
43
41
|
EY.ui.info "Putting up maintenance page for '#{app.name}' in '#{environment.name}'"
|
44
42
|
environment.put_up_maintenance_page(app, options[:verbose])
|
45
43
|
end
|
@@ -14,8 +14,10 @@ module EY
|
|
14
14
|
|
15
15
|
def self.from_hash(hash)
|
16
16
|
return nil unless hash
|
17
|
-
|
18
|
-
|
17
|
+
# in ruby 1.8, #members is an array of strings
|
18
|
+
# in ruby 1.9, #members is an array of symbols
|
19
|
+
members = new.members.map {|m| m.to_sym}
|
20
|
+
values = members.map{|a| hash.has_key?(a) ? hash[a] : hash[a.to_s] }
|
19
21
|
new(*values)
|
20
22
|
end
|
21
23
|
|
@@ -3,99 +3,51 @@ 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
|
-
EXIT_STATUS = Hash.new { |h,k| raise EY::Error, "engineyard-serverside version checker exited with unknown status code #{k}" }
|
7
|
-
EXIT_STATUS.merge!({
|
8
|
-
255 => :ssh_failed,
|
9
|
-
1 => :engineyard_serverside_missing,
|
10
|
-
0 => :ok,
|
11
|
-
})
|
12
|
-
|
13
6
|
alias :hostname :public_hostname
|
14
7
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
'
|
22
|
-
|
23
|
-
|
24
|
-
if extra_configuration
|
25
|
-
deploy_args << '--config' << extra_configuration.to_json
|
8
|
+
def adapter(app, verbose)
|
9
|
+
require 'engineyard-serverside-adapter'
|
10
|
+
EY::Serverside::Adapter.new("/usr/local/ey_resin/ruby/bin") do |args|
|
11
|
+
args.app = app.name
|
12
|
+
args.repo = app.repository_uri
|
13
|
+
args.instances = instances_data
|
14
|
+
args.verbose = verbose || ENV['DEBUG']
|
15
|
+
args.stack = environment.stack_name
|
16
|
+
args.framework_env = environment.framework_env
|
26
17
|
end
|
18
|
+
end
|
19
|
+
private :adapter
|
27
20
|
|
28
|
-
|
29
|
-
|
21
|
+
def deploy(app, ref, migration_command=nil, extra_configuration=nil, verbose=false)
|
22
|
+
deploy_command = adapter(app, verbose).deploy do |args|
|
23
|
+
args.config = extra_configuration if extra_configuration
|
24
|
+
args.migrate = migration_command if migration_command
|
25
|
+
args.ref = ref
|
30
26
|
end
|
31
27
|
|
32
|
-
|
28
|
+
invoke deploy_command
|
33
29
|
end
|
34
30
|
|
35
31
|
def rollback(app, extra_configuration=nil, verbose=false)
|
36
|
-
|
37
|
-
|
38
|
-
'--stack', environment.stack_name,
|
39
|
-
]
|
40
|
-
|
41
|
-
if extra_configuration
|
42
|
-
deploy_args << '--config' << extra_configuration.to_json
|
32
|
+
rollback = adapter(app, verbose).rollback do |args|
|
33
|
+
args.config = extra_configuration if extra_configuration
|
43
34
|
end
|
44
|
-
|
45
|
-
invoke_engineyard_serverside(deploy_args, verbose)
|
35
|
+
invoke rollback
|
46
36
|
end
|
47
37
|
|
48
38
|
|
49
39
|
def put_up_maintenance_page(app, verbose=false)
|
50
|
-
|
40
|
+
invoke adapter(app, verbose).enable_maintenance_page
|
51
41
|
end
|
52
42
|
|
53
43
|
def take_down_maintenance_page(app, verbose=false)
|
54
|
-
|
44
|
+
invoke adapter(app, verbose).disable_maintenance_page
|
55
45
|
end
|
56
46
|
|
57
|
-
|
58
47
|
def has_app_code?
|
59
48
|
!["db_master", "db_slave"].include?(role.to_s)
|
60
49
|
end
|
61
50
|
|
62
|
-
def ensure_engineyard_serverside_present
|
63
|
-
case engineyard_serverside_status = engineyard_serverside_check
|
64
|
-
when :ssh_failed
|
65
|
-
raise EnvironmentError, "SSH connection to #{hostname} failed"
|
66
|
-
when :engineyard_serverside_missing
|
67
|
-
yield :installing if block_given?
|
68
|
-
install_engineyard_serverside
|
69
|
-
when :ok
|
70
|
-
# no action needed
|
71
|
-
else
|
72
|
-
raise EY::Error, "Internal error: Unexpected status from Instance#engineyard_serverside_check; got #{engineyard_serverside_status.inspect}"
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def engineyard_serverside_check
|
77
|
-
escaped_engineyard_serverside_version = ENGINEYARD_SERVERSIDE_VERSION.gsub(/\./, '\.')
|
78
|
-
|
79
|
-
if ENV["NO_SSH"]
|
80
|
-
:ok
|
81
|
-
else
|
82
|
-
ssh "#{gem_path} list engineyard-serverside | grep \"engineyard-serverside\" | egrep -q '#{escaped_engineyard_serverside_version}[,)]'", false
|
83
|
-
EXIT_STATUS[$?.exitstatus]
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def install_engineyard_serverside
|
88
|
-
ssh(Escape.shell_command([
|
89
|
-
'sudo', 'sh', '-c',
|
90
|
-
# rubygems looks at *.gem in its current directory for
|
91
|
-
# installation candidates, so we have to make sure it
|
92
|
-
# runs from a directory with no gem files in it.
|
93
|
-
#
|
94
|
-
# rubygems help suggests that --remote will disable this
|
95
|
-
# behavior, but it doesn't.
|
96
|
-
"cd `mktemp -d` && #{gem_path} install engineyard-serverside --no-rdoc --no-ri -v #{ENGINEYARD_SERVERSIDE_VERSION}"]))
|
97
|
-
end
|
98
|
-
|
99
51
|
protected
|
100
52
|
|
101
53
|
def engineyard_serverside_hostname
|
@@ -123,50 +75,26 @@ module EY
|
|
123
75
|
end
|
124
76
|
end
|
125
77
|
|
126
|
-
def
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
instance_args = ['']
|
131
|
-
if !instances.empty?
|
132
|
-
instance_args << '--instances'
|
133
|
-
instance_args += instances.collect { |i| i.engineyard_serverside_hostname }
|
134
|
-
|
135
|
-
instance_args << '--instance-roles'
|
136
|
-
instance_args += instances.collect { |i| [i.engineyard_serverside_hostname, i.role].join(':') }
|
137
|
-
|
138
|
-
instance_names = instances.collect { |i| i.name ? [i.engineyard_serverside_hostname, i.name].join(':') : nil }.compact
|
139
|
-
unless instance_names.empty?
|
140
|
-
instance_args << '--instance-names'
|
141
|
-
instance_args += instance_names
|
142
|
-
end
|
78
|
+
def invoke(action)
|
79
|
+
action.call do |cmd|
|
80
|
+
puts cmd if action.verbose
|
81
|
+
ssh cmd
|
143
82
|
end
|
144
|
-
|
145
|
-
framework_arg = ['--framework-env', environment.framework_env]
|
146
|
-
|
147
|
-
verbose_arg = (verbose || ENV['DEBUG']) ? ['--verbose'] : []
|
148
|
-
|
149
|
-
cmd = Escape.shell_command(start + deploy_args + framework_arg + instance_args + verbose_arg)
|
150
|
-
puts cmd if verbose
|
151
|
-
ssh cmd
|
152
83
|
end
|
153
84
|
|
154
|
-
def
|
155
|
-
|
85
|
+
def instances_data
|
86
|
+
environment.instances.select { |inst| inst.has_app_code? }.map do |i|
|
87
|
+
{
|
88
|
+
:hostname => i.engineyard_serverside_hostname,
|
89
|
+
:roles => [i.role],
|
90
|
+
:name => i.name,
|
91
|
+
}
|
92
|
+
end
|
156
93
|
end
|
157
94
|
|
158
95
|
def app_master?
|
159
96
|
environment.app_master == self
|
160
97
|
end
|
161
|
-
|
162
|
-
def gem_path
|
163
|
-
"/usr/local/ey_resin/ruby/bin/gem"
|
164
|
-
end
|
165
|
-
|
166
|
-
def ruby_path
|
167
|
-
"/usr/local/ey_resin/ruby/bin/ruby"
|
168
|
-
end
|
169
|
-
|
170
98
|
end
|
171
99
|
end
|
172
100
|
end
|
data/lib/engineyard/repo.rb
CHANGED
@@ -21,7 +21,7 @@ module EY
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def urls
|
24
|
-
lines = `git config -f #{Escape.shell_command(@path)}/.git/config --get-regexp 'remote.*.url'`.split(/\n/)
|
24
|
+
lines = `git config -f #{Escape.shell_command([@path])}/.git/config --get-regexp 'remote.*.url'`.split(/\n/)
|
25
25
|
raise NoRemotesError.new(@path) if lines.empty?
|
26
26
|
lines.map { |c| c.split.last }
|
27
27
|
end
|
data/lib/engineyard/thor.rb
CHANGED
@@ -11,20 +11,6 @@ module EY
|
|
11
11
|
@repo ||= EY::Repo.new
|
12
12
|
end
|
13
13
|
|
14
|
-
def loudly_check_engineyard_serverside(environment)
|
15
|
-
environment.ensure_engineyard_serverside_present do |action|
|
16
|
-
case action
|
17
|
-
when :installing
|
18
|
-
EY.ui.warn "Instance does not have server-side component installed"
|
19
|
-
EY.ui.info "Installing server-side component..."
|
20
|
-
when :upgrading
|
21
|
-
EY.ui.info "Upgrading server-side component..."
|
22
|
-
else
|
23
|
-
# nothing slow is happening, so there's nothing to say
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
14
|
# if an app is supplied, it is used as a constraint for implied environment lookup
|
29
15
|
def fetch_environment(env_name, app = nil)
|
30
16
|
env_name ||= EY.config.default_environment
|
data/lib/engineyard/version.rb
CHANGED
data/spec/ey/deploy_spec.rb
CHANGED
@@ -165,6 +165,17 @@ describe "ey deploy" do
|
|
165
165
|
end
|
166
166
|
end
|
167
167
|
|
168
|
+
context "the --framework-env option" do
|
169
|
+
before(:each) do
|
170
|
+
api_scenario "one app, one environment"
|
171
|
+
end
|
172
|
+
|
173
|
+
it "passes the framework environment" do
|
174
|
+
ey "deploy"
|
175
|
+
@ssh_commands.last.should match(/--framework-env production/)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
168
179
|
context "choosing something to deploy" do
|
169
180
|
define_git_repo('deploy test') do
|
170
181
|
# we'll have one commit on master
|
@@ -188,27 +199,27 @@ describe "ey deploy" do
|
|
188
199
|
context "without a configured default branch" do
|
189
200
|
it "defaults to the checked-out local branch" do
|
190
201
|
ey "deploy"
|
191
|
-
@ssh_commands.last.should =~ /--
|
202
|
+
@ssh_commands.last.should =~ /--ref current-branch/
|
192
203
|
end
|
193
204
|
|
194
205
|
it "deploys another branch if given" do
|
195
206
|
ey "deploy --ref master"
|
196
|
-
@ssh_commands.last.should =~ /--
|
207
|
+
@ssh_commands.last.should =~ /--ref master/
|
197
208
|
end
|
198
209
|
|
199
210
|
it "deploys a tag if given" do
|
200
211
|
ey "deploy --ref v1"
|
201
|
-
@ssh_commands.last.should =~ /--
|
212
|
+
@ssh_commands.last.should =~ /--ref v1/
|
202
213
|
end
|
203
214
|
|
204
215
|
it "allows using --branch to specify a branch" do
|
205
216
|
ey "deploy --branch master"
|
206
|
-
@ssh_commands.last.should match(/--
|
217
|
+
@ssh_commands.last.should match(/--ref master/)
|
207
218
|
end
|
208
219
|
|
209
220
|
it "allows using --tag to specify the tag" do
|
210
221
|
ey "deploy --tag v1"
|
211
|
-
@ssh_commands.last.should match(/--
|
222
|
+
@ssh_commands.last.should match(/--ref v1/)
|
212
223
|
end
|
213
224
|
end
|
214
225
|
|
@@ -238,7 +249,7 @@ describe "ey deploy" do
|
|
238
249
|
|
239
250
|
it "deploys the default branch by default" do
|
240
251
|
ey "deploy"
|
241
|
-
@ssh_commands.last.should =~ /--
|
252
|
+
@ssh_commands.last.should =~ /--ref master/
|
242
253
|
end
|
243
254
|
|
244
255
|
it "complains about a non-default branch without --ignore-default_branch" do
|
@@ -248,7 +259,7 @@ describe "ey deploy" do
|
|
248
259
|
|
249
260
|
it "deploys a non-default branch with --ignore-default-branch" do
|
250
261
|
ey "deploy -r current-branch --ignore-default-branch"
|
251
|
-
@ssh_commands.last.should =~ /--
|
262
|
+
@ssh_commands.last.should =~ /--ref current-branch/
|
252
263
|
end
|
253
264
|
end
|
254
265
|
end
|
@@ -315,7 +326,7 @@ describe "ey deploy" do
|
|
315
326
|
it "allows you to specify an app when not in a directory" do
|
316
327
|
ey "deploy --app rails232app --ref master"
|
317
328
|
@ssh_commands.last.should match(/--app rails232app/)
|
318
|
-
@ssh_commands.last.should match(/--
|
329
|
+
@ssh_commands.last.should match(/--ref master/)
|
319
330
|
end
|
320
331
|
|
321
332
|
it "requires that you specify a ref when specifying the application" do
|
data/spec/ey/rollback_spec.rb
CHANGED
@@ -55,7 +55,7 @@ describe "ey rollback" do
|
|
55
55
|
after { File.unlink("ey.yml") }
|
56
56
|
|
57
57
|
it "overrides what's in ey.yml" do
|
58
|
-
ey "
|
58
|
+
ey "rollback --extra-deploy-hook-options beer:esb"
|
59
59
|
extra_deploy_hook_options['beer'].should == 'esb'
|
60
60
|
end
|
61
61
|
end
|
@@ -150,8 +150,8 @@ shared_examples_for "it invokes engineyard-serverside" do
|
|
150
150
|
|
151
151
|
it "passes along instance information to engineyard-serverside" do
|
152
152
|
instance_args = [
|
153
|
-
/--instances
|
154
|
-
/--instance-roles
|
153
|
+
/--instances app_hostname[^\s]+ localhost util_fluffy/,
|
154
|
+
/--instance-roles app_hostname[^\s]+:app localhost:app_master util_fluffy[^\s]+:util/,
|
155
155
|
/--instance-names util_fluffy_hostname[^\s]+:fluffy/
|
156
156
|
]
|
157
157
|
|
@@ -166,9 +166,6 @@ shared_examples_for "it invokes engineyard-serverside" do
|
|
166
166
|
@ssh_commands.last.should_not =~ /#{db_instance}/
|
167
167
|
end
|
168
168
|
|
169
|
-
it "passes the framework environment" do
|
170
|
-
@ssh_commands.last.should match(/--framework-env production/)
|
171
|
-
end
|
172
169
|
end
|
173
170
|
|
174
171
|
context "when no instances have names" do
|
@@ -181,48 +178,6 @@ shared_examples_for "it invokes engineyard-serverside" do
|
|
181
178
|
@ssh_commands.last.should_not include("--instance-names")
|
182
179
|
end
|
183
180
|
end
|
184
|
-
|
185
|
-
|
186
|
-
context "engineyard-serverside installation" do
|
187
|
-
before(:all) do
|
188
|
-
api_scenario "one app, one environment"
|
189
|
-
end
|
190
|
-
|
191
|
-
before(:each) do
|
192
|
-
ENV.delete "NO_SSH"
|
193
|
-
end
|
194
|
-
|
195
|
-
after(:each) do
|
196
|
-
ENV['NO_SSH'] = "true"
|
197
|
-
end
|
198
|
-
|
199
|
-
def exiting_ssh(exit_code)
|
200
|
-
"#!/usr/bin/env ruby\n exit!(#{exit_code}) if ARGV.to_s =~ /gem list engineyard-serverside/"
|
201
|
-
end
|
202
|
-
|
203
|
-
it "raises an error if SSH fails" do
|
204
|
-
run_ey({:env => 'giblets'},
|
205
|
-
{:prepend_to_path => {'ssh' => exiting_ssh(255)}, :expect_failure => true})
|
206
|
-
@err.should =~ /SSH connection to \S+ failed/
|
207
|
-
end
|
208
|
-
|
209
|
-
it "installs engineyard-serverside if it's missing" do
|
210
|
-
run_ey({:env => 'giblets'}, {:prepend_to_path => {'ssh' => exiting_ssh(1)}})
|
211
|
-
|
212
|
-
gem_install_command = @ssh_commands.find do |command|
|
213
|
-
command =~ /gem install engineyard-serverside/
|
214
|
-
end
|
215
|
-
gem_install_command.should_not be_nil
|
216
|
-
gem_install_command.should =~ %r{/usr/local/ey_resin/ruby/bin/gem install.*engineyard-serverside}
|
217
|
-
end
|
218
|
-
|
219
|
-
it "does not try to install engineyard-serverside if it's already there" do
|
220
|
-
run_ey({:env => 'giblets'}, {:prepend_to_path => {'ssh' => exiting_ssh(0)}})
|
221
|
-
@ssh_commands.should_not have_command_like(/gem install engineyard-serverside/)
|
222
|
-
ver = Regexp.quote(EY::ENGINEYARD_SERVERSIDE_VERSION)
|
223
|
-
@ssh_commands.should have_command_like(/engineyard-serverside _#{ver}_ deploy/)
|
224
|
-
end
|
225
|
-
end
|
226
181
|
end
|
227
182
|
|
228
183
|
shared_examples_for "model collections" do
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: engineyard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 1.3.
|
9
|
+
- 1
|
10
|
+
version: 1.3.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- EY Cloud Team
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-09-
|
18
|
+
date: 2010-09-20 00:00:00 -07:00
|
19
19
|
default_executable: ey
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -109,6 +109,22 @@ dependencies:
|
|
109
109
|
type: :runtime
|
110
110
|
name: escape
|
111
111
|
prerelease: false
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
version_requirements: &id007 !ruby/object:Gem::Requirement
|
114
|
+
none: false
|
115
|
+
requirements:
|
116
|
+
- - "="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
hash: 29
|
119
|
+
segments:
|
120
|
+
- 1
|
121
|
+
- 3
|
122
|
+
- 3
|
123
|
+
version: 1.3.3
|
124
|
+
requirement: *id007
|
125
|
+
type: :runtime
|
126
|
+
name: engineyard-serverside-adapter
|
127
|
+
prerelease: false
|
112
128
|
description: This gem allows you to deploy your rails application to the Engine Yard cloud directly from the command line.
|
113
129
|
email: cloud@engineyard.com
|
114
130
|
executables:
|
@@ -139,7 +155,6 @@ files:
|
|
139
155
|
- lib/engineyard/model.rb
|
140
156
|
- lib/engineyard/repo.rb
|
141
157
|
- lib/engineyard/ruby_ext.rb
|
142
|
-
- lib/engineyard/serverside_version.rb
|
143
158
|
- lib/engineyard/thor.rb
|
144
159
|
- lib/engineyard/version.rb
|
145
160
|
- lib/engineyard.rb
|