eb_deployer 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +5 -0
- data/lib/eb_deployer.rb +24 -31
- data/lib/eb_deployer/application.rb +7 -10
- data/lib/eb_deployer/aws_driver/beanstalk.rb +11 -2
- data/lib/eb_deployer/component.rb +40 -0
- data/lib/eb_deployer/config_loader.rb +12 -15
- data/lib/eb_deployer/default_component.rb +37 -0
- data/lib/eb_deployer/eb_environment.rb +6 -6
- data/lib/eb_deployer/environment.rb +38 -21
- data/lib/eb_deployer/event_poller.rb +9 -9
- data/lib/eb_deployer/version.rb +1 -1
- data/test/blue_green_deploy_test.rb +15 -0
- data/test/inplace_update_deploy_test.rb +7 -7
- data/test/multi_components_deploy_test.rb +93 -0
- data/test/tier_setting_deploy_test.rb +2 -8
- metadata +8 -4
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
0.4.1
|
2
|
+
=====
|
3
|
+
* Remove options for delete all environments ("-d --all"), because it is too destructive and not recoverable.
|
4
|
+
* Experimental support for multiple components deployment.
|
5
|
+
|
1
6
|
0.4.0
|
2
7
|
====
|
3
8
|
* revert back all changes from 0.3.8 to 0.3.9. Elasticbeanstalk haven't relex the real unique constain. The actually contrain is you can not have environment name cross different application
|
data/lib/eb_deployer.rb
CHANGED
@@ -16,6 +16,8 @@ require 'eb_deployer/application'
|
|
16
16
|
require 'eb_deployer/resource_stacks'
|
17
17
|
require 'eb_deployer/eb_environment'
|
18
18
|
require 'eb_deployer/environment'
|
19
|
+
require 'eb_deployer/default_component'
|
20
|
+
require 'eb_deployer/component'
|
19
21
|
require 'eb_deployer/event_poller'
|
20
22
|
require 'eb_deployer/package'
|
21
23
|
require 'eb_deployer/config_loader'
|
@@ -25,15 +27,6 @@ require 'eb_deployer/version_cleaner'
|
|
25
27
|
|
26
28
|
module EbDeployer
|
27
29
|
|
28
|
-
TIERS = [
|
29
|
-
{:name=>"Worker", :type=>"SQS/HTTP", :version=>"1.0"},
|
30
|
-
{:name=>"WebServer", :type=>"Standard", :version=>"1.0"}
|
31
|
-
]
|
32
|
-
|
33
|
-
def environment_tier(name)
|
34
|
-
TIERS.find {|t| t[:name].downcase == name.downcase} || raise("No tier found with name #{name.inspect}")
|
35
|
-
end
|
36
|
-
module_function :environment_tier
|
37
30
|
#
|
38
31
|
# Query ouput value of the cloud formation stack
|
39
32
|
#
|
@@ -83,7 +76,7 @@ module EbDeployer
|
|
83
76
|
# :option_name => 'InstanceType',
|
84
77
|
# :value => 'm1.small' }]
|
85
78
|
#
|
86
|
-
# When there are many,
|
79
|
+
# When there are many, using an external yaml file to hold those
|
87
80
|
# configuration is recommended. Such as:
|
88
81
|
#
|
89
82
|
# YAML.load(File.read("my_settings_file.yml"))
|
@@ -187,7 +180,7 @@ module EbDeployer
|
|
187
180
|
version_prefix = opts[:version_prefix].to_s.strip
|
188
181
|
version_label = "#{version_prefix}#{opts[:version_label].to_s.strip}"
|
189
182
|
cname = opts[:cname]
|
190
|
-
|
183
|
+
eb_settings = opts[:option_settings] || opts[:settings] || []
|
191
184
|
strategy_name = opts[:strategy] || :blue_green
|
192
185
|
cname_prefix = opts[:cname_prefix]
|
193
186
|
smoke_test = opts[:smoke_test] || Proc.new {}
|
@@ -195,22 +188,24 @@ module EbDeployer
|
|
195
188
|
bucket = opts[:package_bucket] || app
|
196
189
|
skip_resource = opts[:skip_resource_stack_update]
|
197
190
|
keep_latest = opts[:keep_latest].to_i || 0
|
198
|
-
app_tier =
|
191
|
+
app_tier = opts[:tier] || 'WebServer'
|
199
192
|
|
200
193
|
resource_stacks = ResourceStacks.new(opts[:resources], cf, skip_resource)
|
201
194
|
application = Application.new(app, bs, s3, bucket)
|
202
|
-
environment = Environment.new(application,
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
195
|
+
environment = Environment.new(application, env_name, bs) do |env|
|
196
|
+
env.resource_stacks = resource_stacks
|
197
|
+
env.settings = eb_settings
|
198
|
+
env.creation_opts = {
|
199
|
+
:solution_stack => stack_name,
|
200
|
+
:cname_prefix => cname_prefix,
|
201
|
+
:smoke_test => smoke_test,
|
202
|
+
:phoenix_mode => phoenix_mode,
|
203
|
+
:tier => app_tier
|
204
|
+
}
|
205
|
+
|
206
|
+
env.components = opts[:components]
|
207
|
+
env.component_under_deploy = opts[:component]
|
208
|
+
end
|
214
209
|
|
215
210
|
application.create_version(version_label, opts[:package])
|
216
211
|
environment.deploy(version_label, strategy_name)
|
@@ -241,8 +236,6 @@ module EbDeployer
|
|
241
236
|
parser.parse!
|
242
237
|
action = options.delete(:action)
|
243
238
|
|
244
|
-
raise "--all is only valid with --destroy" if (options[:all_envs] && action != :destroy)
|
245
|
-
|
246
239
|
if File.exists?(options[:config_file])
|
247
240
|
puts "Found configuration at #{options[:config_file]}."
|
248
241
|
else
|
@@ -278,16 +271,16 @@ module EbDeployer
|
|
278
271
|
options[:config_file] = v
|
279
272
|
end
|
280
273
|
|
281
|
-
opts.on("-d", "--destroy", "Destroy specified environment") do |v|
|
274
|
+
opts.on("-d", "--destroy", "Destroy all Elasticbeanstalk environments under the application which have specified environment as name prefix") do |v|
|
282
275
|
options[:action] = :destroy
|
283
276
|
end
|
284
277
|
|
285
|
-
opts.on("--
|
286
|
-
options[:
|
278
|
+
opts.on("--skip-resource-stack-update", "Skip cloud-formation stack update. (only for extreme situation like hitting a cloudformation bug)") do |v|
|
279
|
+
options[:skip_resource_stack_update] = true
|
287
280
|
end
|
288
281
|
|
289
|
-
opts.on("--
|
290
|
-
options[:
|
282
|
+
opts.on("--component [COMPONENT]", "Specify which component to deploy") do |v|
|
283
|
+
options[:component] = v
|
291
284
|
end
|
292
285
|
|
293
286
|
opts.on("-v", "--version", "Print current version") do |v|
|
@@ -34,24 +34,21 @@ module EbDeployer
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
def delete(
|
37
|
+
def delete(env_name_prefix)
|
38
38
|
if @eb_driver.application_exists?(@name)
|
39
|
-
available_envs = @eb_driver.environment_names_for_application(@name)
|
39
|
+
available_envs = @eb_driver.environment_names_for_application(@name).select do |name|
|
40
|
+
name =~ /^#{env_name_prefix}-/
|
41
|
+
end
|
40
42
|
|
41
|
-
|
42
|
-
log("Environment #{
|
43
|
+
if available_envs.empty?
|
44
|
+
log("Environment #{env_name_prefix.inspect} does not exist in application #{@name.inspect}. Skipping delete.")
|
43
45
|
return
|
44
46
|
end
|
45
47
|
|
46
|
-
available_envs.
|
48
|
+
available_envs.each do |env|
|
47
49
|
log("Terminating environment #{env}")
|
48
50
|
@eb_driver.delete_environment(@name, env)
|
49
51
|
end
|
50
|
-
|
51
|
-
if env_name.nil?
|
52
|
-
log("Deleting application")
|
53
|
-
@eb_driver.delete_application(@name)
|
54
|
-
end
|
55
52
|
end
|
56
53
|
end
|
57
54
|
|
@@ -25,7 +25,7 @@ module EbDeployer
|
|
25
25
|
:environment_id => env_id,
|
26
26
|
:version_label => version,
|
27
27
|
:option_settings => settings,
|
28
|
-
:tier => tier
|
28
|
+
:tier => environment_tier(tier)
|
29
29
|
}
|
30
30
|
|
31
31
|
@client.update_environment(request)
|
@@ -46,7 +46,7 @@ module EbDeployer
|
|
46
46
|
:solution_stack_name => stack_name,
|
47
47
|
:version_label => version,
|
48
48
|
:option_settings => settings,
|
49
|
-
:tier => tier,
|
49
|
+
:tier => environment_tier(tier),
|
50
50
|
:cname_prefix => cname_prefix
|
51
51
|
}
|
52
52
|
|
@@ -112,6 +112,15 @@ module EbDeployer
|
|
112
112
|
|
113
113
|
private
|
114
114
|
|
115
|
+
TIERS = [
|
116
|
+
{:name=>"Worker", :type=>"SQS/HTTP", :version=>"1.0"},
|
117
|
+
{:name=>"WebServer", :type=>"Standard", :version=>"1.0"}
|
118
|
+
]
|
119
|
+
|
120
|
+
def environment_tier(name)
|
121
|
+
TIERS.find {|t| t[:name].downcase == name.downcase} || raise("No tier found with name #{name.inspect}")
|
122
|
+
end
|
123
|
+
|
115
124
|
def convert_env_name_to_id(app_name, env_names)
|
116
125
|
envs = alive_envs(app_name, env_names)
|
117
126
|
envs.map { |env| env[:environment_id] }
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module EbDeployer
|
2
|
+
class Component
|
3
|
+
attr_reader :name
|
4
|
+
|
5
|
+
def initialize(name, env, creation_opts, eb_settings, eb_driver)
|
6
|
+
@name = name
|
7
|
+
@env = env
|
8
|
+
@eb_driver = eb_driver
|
9
|
+
@creation_opts = creation_opts
|
10
|
+
@eb_settings = eb_settings
|
11
|
+
end
|
12
|
+
|
13
|
+
def cname_prefix
|
14
|
+
@creation_opts[:cname_prefix] || default_cname_prefix
|
15
|
+
end
|
16
|
+
|
17
|
+
def deploy(version_label, strategy_name, eb_settings)
|
18
|
+
strategy = create_strategy(strategy_name)
|
19
|
+
strategy.deploy(version_label, eb_settings + @eb_settings)
|
20
|
+
end
|
21
|
+
|
22
|
+
def new_eb_env(suffix=nil, cname_prefix_overriding=nil)
|
23
|
+
EbEnvironment.new(@env.app_name,
|
24
|
+
[@env.name, @name, suffix].compact.join('-'),
|
25
|
+
@eb_driver,
|
26
|
+
@creation_opts.merge(:cname_prefix => cname_prefix_overriding || cname_prefix))
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def default_cname_prefix
|
32
|
+
[@env.app_name, @env.name, @name].join('-')
|
33
|
+
end
|
34
|
+
|
35
|
+
def create_strategy(strategy_name)
|
36
|
+
DeploymentStrategy.create(self, strategy_name)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
@@ -24,24 +24,21 @@ module EbDeployer
|
|
24
24
|
config_file = options.delete(:config_file)
|
25
25
|
config_settings = load_config_settings(config_file, package_digest)
|
26
26
|
|
27
|
-
|
28
|
-
common_settings[:version_label] ||= package_digest
|
27
|
+
app_name = config_settings[:application]
|
29
28
|
|
30
|
-
|
31
|
-
|
32
|
-
unless ret.delete(:all_envs)
|
33
|
-
env = ret[:environment]
|
34
|
-
raise "Environment #{env} is not defined in #{config_file}" unless envs.has_key?(env)
|
35
|
-
env_settings = symbolize_keys(envs[env] || {})
|
36
|
-
env_option_settings = env_settings.delete(:option_settings) || []
|
29
|
+
common_settings = symbolize_keys(config_settings[:common])
|
30
|
+
common_settings[:version_label] ||= package_digest
|
37
31
|
|
38
|
-
|
32
|
+
envs = config_settings[:environments]
|
33
|
+
env = options[:environment]
|
34
|
+
raise "Environment #{env} is not defined in #{config_file}" unless envs.has_key?(env)
|
35
|
+
env_settings = symbolize_keys(envs[env] || {})
|
36
|
+
env_option_settings = env_settings.delete(:option_settings) || []
|
39
37
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
end
|
38
|
+
ret = options.merge(common_settings).merge(env_settings)
|
39
|
+
ret[:application] = app_name
|
40
|
+
ret[:option_settings] ||= []
|
41
|
+
ret[:option_settings] += env_option_settings
|
45
42
|
ret
|
46
43
|
end
|
47
44
|
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module EbDeployer
|
2
|
+
class DefaultComponent
|
3
|
+
def initialize(env, creation_opts, eb_driver)
|
4
|
+
@env = env
|
5
|
+
@eb_driver = eb_driver
|
6
|
+
@creation_opts = creation_opts
|
7
|
+
end
|
8
|
+
|
9
|
+
def cname_prefix
|
10
|
+
@creation_opts[:cname_prefix] || default_cname_prefix
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
def deploy(version_label, strategy_name, eb_settings)
|
15
|
+
strategy = create_strategy(strategy_name)
|
16
|
+
strategy.deploy(version_label, eb_settings)
|
17
|
+
end
|
18
|
+
|
19
|
+
def new_eb_env(suffix=nil, cname_prefix_overriding=nil)
|
20
|
+
EbEnvironment.new(@env.app_name,
|
21
|
+
[@env.name, suffix].compact.join('-'),
|
22
|
+
@eb_driver,
|
23
|
+
@creation_opts.merge(:cname_prefix => cname_prefix_overriding || cname_prefix))
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def default_cname_prefix
|
29
|
+
[@env.app_name, @env.name].join('-')
|
30
|
+
end
|
31
|
+
|
32
|
+
def create_strategy(strategy_name)
|
33
|
+
DeploymentStrategy.create(self, strategy_name)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -38,7 +38,7 @@ module EbDeployer
|
|
38
38
|
|
39
39
|
def terminate
|
40
40
|
if @bs.environment_exists?(@app, @name)
|
41
|
-
with_polling_events(
|
41
|
+
with_polling_events(/terminateEnvironment completed successfully/i) do
|
42
42
|
@bs.delete_environment(@app, @name)
|
43
43
|
end
|
44
44
|
end
|
@@ -48,11 +48,11 @@ module EbDeployer
|
|
48
48
|
|
49
49
|
def create_or_update_env(version_label, settings)
|
50
50
|
if @bs.environment_exists?(@app, @name)
|
51
|
-
with_polling_events(
|
51
|
+
with_polling_events(/Environment update completed successfully/i) do
|
52
52
|
@bs.update_environment(@app, @name, version_label, @creation_opts[:tier], settings)
|
53
53
|
end
|
54
54
|
else
|
55
|
-
with_polling_events(
|
55
|
+
with_polling_events(/Successfully launched environment/i) do
|
56
56
|
@bs.create_environment(@app, @name, @creation_opts[:solution_stack], @creation_opts[:cname_prefix], version_label, @creation_opts[:tier], settings)
|
57
57
|
end
|
58
58
|
end
|
@@ -63,10 +63,10 @@ module EbDeployer
|
|
63
63
|
SmokeTest.new(@creation_opts[:smoke_test]).run(host_name, self)
|
64
64
|
end
|
65
65
|
|
66
|
-
def with_polling_events(
|
66
|
+
def with_polling_events(terminate_pattern, &block)
|
67
67
|
event_start_time = Time.now
|
68
68
|
yield
|
69
|
-
event_poller.poll(
|
69
|
+
event_poller.poll(event_start_time) do |event|
|
70
70
|
if event[:message] =~ /Failed to deploy application/
|
71
71
|
raise event[:message]
|
72
72
|
end
|
@@ -95,7 +95,7 @@ module EbDeployer
|
|
95
95
|
end
|
96
96
|
|
97
97
|
def event_poller
|
98
|
-
@event_poller || EventPoller.new(@app, @bs)
|
98
|
+
@event_poller || EventPoller.new(@app, @name, @bs)
|
99
99
|
end
|
100
100
|
|
101
101
|
|
@@ -1,45 +1,62 @@
|
|
1
1
|
module EbDeployer
|
2
2
|
class Environment
|
3
|
+
attr_writer :resource_stacks, :settings, :creation_opts, :components, :component_under_deploy
|
4
|
+
attr_reader :name
|
3
5
|
|
4
|
-
def initialize(app, name,
|
6
|
+
def initialize(app, name, eb_driver, &block)
|
5
7
|
@app = app
|
6
8
|
@name = name
|
7
|
-
@
|
8
|
-
@
|
9
|
-
@
|
10
|
-
|
9
|
+
@eb_driver = eb_driver
|
10
|
+
@creation_opts = {}
|
11
|
+
@settings = []
|
12
|
+
yield(self) if block_given?
|
13
|
+
unless @components
|
14
|
+
@components = [DefaultComponent.new(self, @creation_opts, @eb_driver)]
|
15
|
+
end
|
11
16
|
end
|
12
17
|
|
13
|
-
def
|
14
|
-
@
|
18
|
+
def app_name
|
19
|
+
@app.name
|
15
20
|
end
|
16
21
|
|
17
22
|
def deploy(version_label, strategy_name)
|
18
|
-
|
19
|
-
|
20
|
-
|
23
|
+
resource_settings = @resource_stacks.provision(resource_stack_name)
|
24
|
+
components_to_deploy.each do |component|
|
25
|
+
component.deploy(version_label, strategy_name, @settings + resource_settings)
|
26
|
+
end
|
21
27
|
end
|
22
28
|
|
23
|
-
def
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
29
|
+
def components=(components_attrs)
|
30
|
+
return unless components_attrs
|
31
|
+
@components = components_attrs.map do |attrs|
|
32
|
+
attrs = symbolize_keys(attrs)
|
33
|
+
name = attrs.delete(:name)
|
34
|
+
eb_settings = attrs.delete(:option_settings) || []
|
35
|
+
Component.new(name, self, @creation_opts.merge(attrs), eb_settings, @eb_driver)
|
36
|
+
end
|
28
37
|
end
|
29
38
|
|
30
39
|
private
|
31
|
-
|
32
|
-
|
33
|
-
|
40
|
+
def components_to_deploy
|
41
|
+
if @component_under_deploy
|
42
|
+
component = component_named(@component_under_deploy)
|
43
|
+
raise "'#{@component_under_deploy}' is not in the configuration. Available components are #{@components.map(&:name) }" unless component
|
44
|
+
[component]
|
45
|
+
else
|
46
|
+
@components
|
47
|
+
end
|
34
48
|
end
|
35
49
|
|
50
|
+
def component_named(name)
|
51
|
+
@components.detect { |c| c.name == name }
|
52
|
+
end
|
36
53
|
|
37
|
-
def
|
38
|
-
|
54
|
+
def symbolize_keys(hash)
|
55
|
+
hash.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}
|
39
56
|
end
|
40
57
|
|
41
58
|
def resource_stack_name
|
42
|
-
"#{
|
59
|
+
"#{app_name}-#{@name}"
|
43
60
|
end
|
44
61
|
end
|
45
62
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
module EbDeployer
|
2
2
|
class EventPoller
|
3
|
-
def initialize(app, beanstalk)
|
4
|
-
@app, @beanstalk = app, beanstalk
|
3
|
+
def initialize(app, env, beanstalk)
|
4
|
+
@app, @env, @beanstalk = app, env, beanstalk
|
5
5
|
end
|
6
6
|
|
7
|
-
def poll(
|
7
|
+
def poll(start_time = Time.now, &block)
|
8
8
|
handled = Set.new
|
9
9
|
loop do
|
10
|
-
fetch_events(
|
10
|
+
fetch_events(start_time) do |events|
|
11
11
|
new_events = events.reject { |e| handled.include?(digest(e)) }
|
12
12
|
handle(new_events, &block)
|
13
13
|
handled += new_events.map { |e| digest(e) }
|
@@ -27,14 +27,14 @@ module EbDeployer
|
|
27
27
|
events.reverse.each(&block)
|
28
28
|
end
|
29
29
|
|
30
|
-
def fetch_events(
|
31
|
-
events, next_token = @beanstalk.fetch_events(@app,
|
30
|
+
def fetch_events(start_time, &block)
|
31
|
+
events, next_token = @beanstalk.fetch_events(@app, @env, :start_time => start_time.iso8601)
|
32
32
|
yield(events)
|
33
|
-
fetch_next(
|
33
|
+
fetch_next(next_token, &block) if next_token
|
34
34
|
end
|
35
35
|
|
36
|
-
def fetch_next(
|
37
|
-
events, next_token = @beanstalk.fetch_events(@app,
|
36
|
+
def fetch_next(next_token, &block)
|
37
|
+
events, next_token = @beanstalk.fetch_events(@app, @env, :next_token => next_token)
|
38
38
|
yield(events)
|
39
39
|
fetch_next(next_token, &block) if next_token
|
40
40
|
end
|
data/lib/eb_deployer/version.rb
CHANGED
@@ -102,5 +102,20 @@ class BlueGreenDeployTest < DeployTest
|
|
102
102
|
assert_equal 'simple-production', @eb.environment_cname_prefix('simple', inactive_env)
|
103
103
|
end
|
104
104
|
|
105
|
+
def test_destroy_should_clean_up_env
|
106
|
+
2.times do
|
107
|
+
deploy(:application => 'simple',
|
108
|
+
:environment => "production",
|
109
|
+
:strategy => 'blue-green',
|
110
|
+
:version_label => 44,
|
111
|
+
:phoenix_mode => true)
|
112
|
+
end
|
113
|
+
|
114
|
+
destroy(:application => 'simple', :environment => 'production')
|
115
|
+
assert !@eb.environment_exists?('simple', t('production-a', 'simple'))
|
116
|
+
assert !@eb.environment_exists?('simple', t('production-b', 'simple'))
|
117
|
+
end
|
118
|
+
|
119
|
+
|
105
120
|
|
106
121
|
end
|
@@ -18,13 +18,6 @@ class InplaceUpdateDeployTest < DeployTest
|
|
18
18
|
|
19
19
|
end
|
20
20
|
|
21
|
-
def test_destroy_should_clean_up_eb_application_and_env
|
22
|
-
deploy(:application => 'simple', :environment => "production")
|
23
|
-
destroy(:application => 'simple')
|
24
|
-
assert !@eb.application_exists?('simple')
|
25
|
-
assert !@eb.environment_exists?('simple', t('production', 'simple'))
|
26
|
-
end
|
27
|
-
|
28
21
|
def test_first_deployment_create_environment
|
29
22
|
assert !@eb.environment_exists?('simple', t('production', 'simple'))
|
30
23
|
deploy(:application => 'simple', :environment => "production")
|
@@ -79,4 +72,11 @@ class InplaceUpdateDeployTest < DeployTest
|
|
79
72
|
assert @eb.environments_been_deleted('simple').include?(t('production', 'simple'))
|
80
73
|
assert @eb.environment_exists?('simple', t('production', 'simple'))
|
81
74
|
end
|
75
|
+
|
76
|
+
def test_destroy_should_clean_up_env
|
77
|
+
deploy(:application => 'simple', :environment => "production")
|
78
|
+
destroy(:application => 'simple', :environment => 'production')
|
79
|
+
assert !@eb.environment_exists?('simple', t('production', 'simple'))
|
80
|
+
end
|
81
|
+
|
82
82
|
end
|
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'deploy_test'
|
2
|
+
|
3
|
+
class MultiComponentsDeployTest < DeployTest
|
4
|
+
def test_deploy_with_components
|
5
|
+
do_deploy
|
6
|
+
assert @eb.environment_exists?('simple', t('prod-web', 'simple'))
|
7
|
+
assert @eb.environment_exists?('simple', t('prod-bg', 'simple'))
|
8
|
+
assert @eb.environment_exists?('simple', t('prod-api', 'simple'))
|
9
|
+
assert !@eb.environment_exists?('simple', t('prod', 'simple'))
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_deploy_with_components_with_blue_green
|
13
|
+
do_bg_deploy
|
14
|
+
assert @eb.environment_exists?('simple', t('prod-web-a', 'simple'))
|
15
|
+
assert @eb.environment_exists?('simple', t('prod-bg-a', 'simple'))
|
16
|
+
assert @eb.environment_exists?('simple', t('prod-api-a', 'simple'))
|
17
|
+
do_bg_deploy
|
18
|
+
assert @eb.environment_exists?('simple', t('prod-web-b', 'simple'))
|
19
|
+
assert @eb.environment_exists?('simple', t('prod-bg-b', 'simple'))
|
20
|
+
assert @eb.environment_exists?('simple', t('prod-api-b', 'simple'))
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_cname_include_component_name
|
24
|
+
do_deploy
|
25
|
+
assert_equal 'simple-prod-web', @eb.environment_cname_prefix('simple', t('prod-web', 'simple'))
|
26
|
+
assert_equal 'simple-prod-api', @eb.environment_cname_prefix('simple', t('prod-api', 'simple'))
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_cname_include_component_name_in_blue_green
|
30
|
+
do_bg_deploy
|
31
|
+
assert_equal 'simple-prod-web', @eb.environment_cname_prefix('simple', t('prod-web-a', 'simple'))
|
32
|
+
|
33
|
+
do_bg_deploy
|
34
|
+
assert_equal 'simple-prod-web', @eb.environment_cname_prefix('simple', t('prod-web-b', 'simple'))
|
35
|
+
assert_equal 'simple-prod-web-inactive', @eb.environment_cname_prefix('simple', t('prod-web-a', 'simple'))
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_components_inheritate_creation_options_from_environment
|
39
|
+
do_deploy
|
40
|
+
assert_equal 'WebServer', @eb.environment_tier('simple', t('prod-web', 'simple'))
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_components_can_override_creation_opts
|
44
|
+
do_deploy(:tier => 'WebServer',
|
45
|
+
:components => [{'name' => 'web'}, {'name' => 'bg', 'tier' => "Worker"}])
|
46
|
+
assert_equal 'WebServer', @eb.environment_tier('simple', t('prod-web', 'simple'))
|
47
|
+
assert_equal 'Worker', @eb.environment_tier('simple', t('prod-bg', 'simple'))
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_components_specific_eb_settings_will_override_env_eb_settings
|
51
|
+
minsize_3 = {:namespace => 'aws:autoscaling:launchconfiguration',
|
52
|
+
:option_name => 'MinSize',
|
53
|
+
:value => '3' }
|
54
|
+
minsize_2 = {:namespace => 'aws:autoscaling:launchconfiguration',
|
55
|
+
:option_name => 'MinSize',
|
56
|
+
:value => '2' }
|
57
|
+
|
58
|
+
do_deploy(:option_settings => [minsize_3],
|
59
|
+
:components => [{'name' => 'web'},
|
60
|
+
{'name' => 'api',
|
61
|
+
'option_settings' => [minsize_2]}])
|
62
|
+
assert_equal [minsize_3], @eb.environment_settings('simple', t('prod-web', 'simple'))
|
63
|
+
assert_equal [minsize_3, minsize_2], @eb.environment_settings('simple', t('prod-api', 'simple'))
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_can_deploy_single_component
|
67
|
+
do_deploy(:component => "bg")
|
68
|
+
assert !@eb.environment_exists?('simple', t('prod-web', 'simple'))
|
69
|
+
assert !@eb.environment_exists?('simple', t('prod-api', 'simple'))
|
70
|
+
assert @eb.environment_exists?('simple', t('prod-bg', 'simple'))
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_should_raise_exception_when_try_to_deploy_a_none_exists_component
|
74
|
+
assert_raises(RuntimeError) do
|
75
|
+
do_deploy(:component => "foo")
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
def do_deploy(options={})
|
81
|
+
deploy({:application => 'simple',
|
82
|
+
:environment => 'prod',
|
83
|
+
:components => [{ 'name' => 'web' },
|
84
|
+
{ 'name' => 'bg' },
|
85
|
+
{ 'name' => 'api' }]
|
86
|
+
}.merge(options))
|
87
|
+
end
|
88
|
+
|
89
|
+
def do_bg_deploy
|
90
|
+
do_deploy(:strategy => 'blue-green')
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
@@ -3,17 +3,11 @@ require 'deploy_test'
|
|
3
3
|
class TierSettingDeployTest < DeployTest
|
4
4
|
def test_sets_default_tier_as_webserver
|
5
5
|
deploy(:application => 'simple', :environment => "production")
|
6
|
-
assert_equal
|
6
|
+
assert_equal 'WebServer', @eb.environment_tier('simple', t('production', 'simple'))
|
7
7
|
end
|
8
8
|
|
9
9
|
def test_can_change_tier
|
10
10
|
deploy(:application => 'simple', :environment => "production", :tier => 'Worker')
|
11
|
-
assert_equal
|
12
|
-
end
|
13
|
-
|
14
|
-
def test_should_raise_error_when_tier_setting_is_not_recognized
|
15
|
-
assert_raises(RuntimeError) do
|
16
|
-
deploy(:application => 'simple', :environment => "production", :tier => 'Gum')
|
17
|
-
end
|
11
|
+
assert_equal 'Worker', @eb.environment_tier('simple', t('production', 'simple'))
|
18
12
|
end
|
19
13
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: eb_deployer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-03-
|
13
|
+
date: 2014-03-31 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: aws-sdk
|
@@ -55,7 +55,9 @@ files:
|
|
55
55
|
- lib/eb_deployer/aws_driver/cloud_formation_driver.rb
|
56
56
|
- lib/eb_deployer/aws_driver/s3_driver.rb
|
57
57
|
- lib/eb_deployer/cloud_formation_provisioner.rb
|
58
|
+
- lib/eb_deployer/component.rb
|
58
59
|
- lib/eb_deployer/config_loader.rb
|
60
|
+
- lib/eb_deployer/default_component.rb
|
59
61
|
- lib/eb_deployer/default_config.rb
|
60
62
|
- lib/eb_deployer/default_config.yml
|
61
63
|
- lib/eb_deployer/deployment_strategy.rb
|
@@ -76,6 +78,7 @@ files:
|
|
76
78
|
- test/deploy_test.rb
|
77
79
|
- test/eb_environment_test.rb
|
78
80
|
- test/inplace_update_deploy_test.rb
|
81
|
+
- test/multi_components_deploy_test.rb
|
79
82
|
- test/resources_deploy_test.rb
|
80
83
|
- test/smoke_test_test.rb
|
81
84
|
- test/test_helper.rb
|
@@ -96,7 +99,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
96
99
|
version: '0'
|
97
100
|
segments:
|
98
101
|
- 0
|
99
|
-
hash:
|
102
|
+
hash: -3040208226803688120
|
100
103
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
104
|
none: false
|
102
105
|
requirements:
|
@@ -105,7 +108,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
105
108
|
version: '0'
|
106
109
|
segments:
|
107
110
|
- 0
|
108
|
-
hash:
|
111
|
+
hash: -3040208226803688120
|
109
112
|
requirements: []
|
110
113
|
rubyforge_project:
|
111
114
|
rubygems_version: 1.8.29
|
@@ -122,6 +125,7 @@ test_files:
|
|
122
125
|
- test/deploy_test.rb
|
123
126
|
- test/eb_environment_test.rb
|
124
127
|
- test/inplace_update_deploy_test.rb
|
128
|
+
- test/multi_components_deploy_test.rb
|
125
129
|
- test/resources_deploy_test.rb
|
126
130
|
- test/smoke_test_test.rb
|
127
131
|
- test/test_helper.rb
|