eb_deployer 0.4.13 → 0.5.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/eb_deployer/aws_driver/beanstalk.rb +5 -5
- data/lib/eb_deployer/cloud_formation_provisioner.rb +1 -1
- data/lib/eb_deployer/component.rb +7 -5
- data/lib/eb_deployer/default_component.rb +1 -1
- data/lib/eb_deployer/deployment_strategy/blue_green.rb +7 -0
- data/lib/eb_deployer/deployment_strategy/blue_only.rb +7 -0
- data/lib/eb_deployer/deployment_strategy/inplace_update.rb +3 -0
- data/lib/eb_deployer/eb_environment.rb +25 -2
- data/lib/eb_deployer/version.rb +1 -1
- data/test/aws_driver_stubs.rb +4 -2
- data/test/eb_environment_test.rb +21 -9
- data/test/multi_components_deploy_test.rb +9 -2
- data/test/tier_setting_deploy_test.rb +11 -0
- metadata +2 -2
@@ -1,6 +1,7 @@
|
|
1
1
|
module EbDeployer
|
2
2
|
module AWSDriver
|
3
3
|
class Beanstalk
|
4
|
+
include Utils
|
4
5
|
attr_reader :client
|
5
6
|
|
6
7
|
def initialize(client=AWS::ElasticBeanstalk.new.client)
|
@@ -41,17 +42,16 @@ module EbDeployer
|
|
41
42
|
end
|
42
43
|
|
43
44
|
def create_environment(app_name, env_name, stack_name, cname_prefix, version, tier, tags, settings)
|
44
|
-
request = {
|
45
|
+
request = reject_nil({
|
45
46
|
:application_name => app_name,
|
46
47
|
:environment_name => env_name,
|
47
48
|
:solution_stack_name => stack_name,
|
48
49
|
:version_label => version,
|
49
50
|
:option_settings => settings,
|
50
51
|
:tier => environment_tier(tier),
|
51
|
-
:
|
52
|
-
:
|
53
|
-
}
|
54
|
-
|
52
|
+
:cname_prefix => cname_prefix,
|
53
|
+
:tags => tags
|
54
|
+
})
|
55
55
|
@client.create_environment(request)
|
56
56
|
end
|
57
57
|
|
@@ -30,7 +30,7 @@ module EbDeployer
|
|
30
30
|
def output(key)
|
31
31
|
@cf_driver.query_output(@stack_name, key)
|
32
32
|
rescue AWS::CloudFormation::Errors::ValidationError => e
|
33
|
-
raise ResourceNotInReadyState.new("Resource stack
|
33
|
+
raise ResourceNotInReadyState.new("Resource stack not in ready state yet, perhaps you should provision it first?")
|
34
34
|
end
|
35
35
|
|
36
36
|
private
|
@@ -18,24 +18,26 @@ module EbDeployer
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def deploy(version_label, eb_settings, inactive_settings=[])
|
21
|
+
@strategy.test_compatibility(create_options)
|
21
22
|
@strategy.deploy(version_label,
|
22
23
|
eb_settings + @component_eb_settings,
|
23
24
|
inactive_settings + @component_inactive_settings)
|
24
25
|
end
|
25
26
|
|
26
27
|
def new_eb_env(suffix=nil, cname_prefix_overriding=nil)
|
27
|
-
env_name = [@env.name, @name, suffix].compact.join('-')
|
28
|
-
creation_opts = @env.creation_opts.merge(@options)
|
29
|
-
creation_opts = creation_opts.merge(:cname_prefix => cname_prefix_overriding || cname_prefix)
|
30
28
|
EbEnvironment.new(@env.app_name,
|
31
|
-
|
29
|
+
[@env.name, @name, suffix].compact.join('-'),
|
32
30
|
@eb_driver,
|
33
|
-
|
31
|
+
create_options.merge(:cname_prefix => cname_prefix_overriding || cname_prefix))
|
34
32
|
|
35
33
|
end
|
36
34
|
|
37
35
|
private
|
38
36
|
|
37
|
+
def create_options
|
38
|
+
@env.creation_opts.merge(@options)
|
39
|
+
end
|
40
|
+
|
39
41
|
def default_cname_prefix
|
40
42
|
[@env.app_name, @env.name, @name].join('-')
|
41
43
|
end
|
@@ -11,8 +11,8 @@ module EbDeployer
|
|
11
11
|
@creation_opts[:cname_prefix] || default_cname_prefix
|
12
12
|
end
|
13
13
|
|
14
|
-
|
15
14
|
def deploy(version_label, eb_settings, inactive_settings=[])
|
15
|
+
@strategy.test_compatibility(@creation_opts)
|
16
16
|
@strategy.deploy(version_label, eb_settings, inactive_settings)
|
17
17
|
end
|
18
18
|
|
@@ -5,6 +5,13 @@ module EbDeployer
|
|
5
5
|
@env = env
|
6
6
|
end
|
7
7
|
|
8
|
+
def test_compatibility(env_create_options)
|
9
|
+
tier = env_create_options[:tier]
|
10
|
+
if tier && tier.downcase == 'worker'
|
11
|
+
raise "Blue green deployment is not supported for Worker tier"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
8
15
|
def deploy(version_label, env_settings, inactive_settings=[])
|
9
16
|
if !ebenvs.any?(&method(:active_ebenv?))
|
10
17
|
ebenv('a', @env.cname_prefix).
|
@@ -5,6 +5,13 @@ module EbDeployer
|
|
5
5
|
@env = env
|
6
6
|
end
|
7
7
|
|
8
|
+
def test_compatibility(env_create_options)
|
9
|
+
tier = env_create_options[:tier]
|
10
|
+
if tier && tier.downcase == 'worker'
|
11
|
+
raise "Blue only deployment is not supported for Worker tier"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
8
15
|
def deploy(version_label, env_settings, inactive_settings=[])
|
9
16
|
if !ebenvs.any?(&method(:active_ebenv?))
|
10
17
|
ebenv('a', @env.cname_prefix).
|
@@ -63,18 +63,41 @@ module EbDeployer
|
|
63
63
|
|
64
64
|
private
|
65
65
|
|
66
|
+
def configured_tier
|
67
|
+
@creation_opts[:tier]
|
68
|
+
end
|
69
|
+
|
70
|
+
def has_cname?
|
71
|
+
!configured_tier || configured_tier.downcase == 'webserver'
|
72
|
+
end
|
73
|
+
|
74
|
+
def configured_cname_prefix
|
75
|
+
@creation_opts[:cname_prefix]
|
76
|
+
end
|
77
|
+
|
66
78
|
def create_eb_env(settings, version_label)
|
67
79
|
solution_stack = @creation_opts[:solution_stack]
|
68
80
|
tags = convert_tags_hash_to_array(@creation_opts.delete(:tags))
|
69
81
|
validate_solutions_stack(solution_stack)
|
70
82
|
with_polling_events(/Successfully launched environment/i) do
|
71
|
-
@bs.create_environment(@app,
|
83
|
+
@bs.create_environment(@app,
|
84
|
+
@name,
|
85
|
+
solution_stack,
|
86
|
+
has_cname? ? configured_cname_prefix : nil,
|
87
|
+
version_label,
|
88
|
+
configured_tier,
|
89
|
+
tags,
|
90
|
+
settings)
|
72
91
|
end
|
73
92
|
end
|
74
93
|
|
75
94
|
def update_eb_env(settings, version_label)
|
76
95
|
with_polling_events(/Environment update completed successfully/i) do
|
77
|
-
@bs.update_environment(@app,
|
96
|
+
@bs.update_environment(@app,
|
97
|
+
@name,
|
98
|
+
version_label,
|
99
|
+
configured_tier,
|
100
|
+
settings)
|
78
101
|
end
|
79
102
|
end
|
80
103
|
|
data/lib/eb_deployer/version.rb
CHANGED
data/test/aws_driver_stubs.rb
CHANGED
@@ -139,12 +139,14 @@ class EBStub
|
|
139
139
|
|
140
140
|
def environment_cname_prefix(app_name, env_name)
|
141
141
|
return unless @envs[env_key(app_name, env_name)]
|
142
|
-
@envs[env_key(app_name, env_name)][:cname_prefix]
|
142
|
+
@envs[env_key(app_name, env_name)][:cname_prefix]
|
143
143
|
end
|
144
144
|
|
145
145
|
def environment_cname(app_name, env_name)
|
146
146
|
return unless @envs[env_key(app_name, env_name)]
|
147
|
-
environment_cname_prefix(app_name, env_name)
|
147
|
+
if cname_prefix = environment_cname_prefix(app_name, env_name)
|
148
|
+
cname_prefix + ".elasticbeanstalk.com"
|
149
|
+
end
|
148
150
|
end
|
149
151
|
|
150
152
|
|
data/test/eb_environment_test.rb
CHANGED
@@ -7,13 +7,13 @@ class EbEnvironmentTest < MiniTest::Unit::TestCase
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def test_deploy_should_create_corresponding_eb_env
|
10
|
-
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver)
|
10
|
+
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver, :cname_prefix => 'myapp-production')
|
11
11
|
env.deploy("version1")
|
12
12
|
assert @eb_driver.environment_exists?('myapp', t('production', 'myapp'))
|
13
13
|
end
|
14
14
|
|
15
15
|
def test_deploy_again_should_update_environment
|
16
|
-
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver)
|
16
|
+
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver, :cname_prefix => 'myapp-production')
|
17
17
|
env.deploy("version1")
|
18
18
|
env.deploy("version2")
|
19
19
|
assert @eb_driver.environment_exists?('myapp', t('production', 'myapp'))
|
@@ -21,20 +21,20 @@ class EbEnvironmentTest < MiniTest::Unit::TestCase
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def test_option_setttings_get_set_on_eb_env
|
24
|
-
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver)
|
24
|
+
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver, :cname_prefix => 'myapp-production')
|
25
25
|
env.deploy("version1", {s1: 'v1'})
|
26
26
|
assert_equal({s1: 'v1' }, @eb_driver.environment_settings('myapp', t('production', 'myapp')))
|
27
27
|
end
|
28
28
|
|
29
29
|
def test_deploy_should_include_tags
|
30
|
-
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver,
|
30
|
+
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver, :cname_prefix => 'myapp-production', :tags => {:my_tag => 'my_value', :tag2 => 'value2'})
|
31
31
|
env.deploy("version1")
|
32
32
|
assert_equal [{:key => :my_tag, :value => 'my_value'}, {:key => :tag2, :value => 'value2'}], @eb_driver.environment_tags('myapp', t('production', 'myapp'))
|
33
33
|
end
|
34
34
|
|
35
35
|
def test_should_run_smoke_test_after_deploy
|
36
36
|
smoked_host = nil
|
37
|
-
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver, :smoke_test => Proc.new { |host| smoked_host = host })
|
37
|
+
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver, :smoke_test => Proc.new { |host| smoked_host = host }, :cname_prefix => 'myapp-production')
|
38
38
|
env.deploy("version1")
|
39
39
|
|
40
40
|
assert !smoked_host.nil?
|
@@ -42,7 +42,7 @@ class EbEnvironmentTest < MiniTest::Unit::TestCase
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def test_should_raise_runtime_error_when_deploy_failed
|
45
|
-
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver)
|
45
|
+
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver, :cname_prefix => 'myapp-production')
|
46
46
|
@eb_driver.set_events("myapp", t("production", 'myapp'),
|
47
47
|
[],
|
48
48
|
["start deploying", "Failed to deploy application"])
|
@@ -50,7 +50,7 @@ class EbEnvironmentTest < MiniTest::Unit::TestCase
|
|
50
50
|
end
|
51
51
|
|
52
52
|
def test_should_raise_runtime_error_when_eb_extension_execution_failed
|
53
|
-
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver)
|
53
|
+
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver, :cname_prefix => 'myapp-production')
|
54
54
|
@eb_driver.set_events("myapp", t("production", 'myapp'),
|
55
55
|
[],
|
56
56
|
["start deploying",
|
@@ -62,7 +62,7 @@ class EbEnvironmentTest < MiniTest::Unit::TestCase
|
|
62
62
|
end
|
63
63
|
|
64
64
|
def test_should_raise_runtime_error_when_issues_during_launch
|
65
|
-
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver)
|
65
|
+
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver, :cname_prefix => 'myapp-production')
|
66
66
|
@eb_driver.set_events("myapp", t("production", 'myapp'),
|
67
67
|
[],
|
68
68
|
["start deploying",
|
@@ -73,7 +73,7 @@ class EbEnvironmentTest < MiniTest::Unit::TestCase
|
|
73
73
|
end
|
74
74
|
|
75
75
|
def test_terminate_should_delete_environment
|
76
|
-
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver)
|
76
|
+
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver, :cname_prefix => 'myapp-production')
|
77
77
|
env.deploy("version1")
|
78
78
|
env.terminate
|
79
79
|
assert !@eb_driver.environment_exists?('myapp', t('production', 'myapp'))
|
@@ -81,11 +81,23 @@ class EbEnvironmentTest < MiniTest::Unit::TestCase
|
|
81
81
|
|
82
82
|
def test_should_raise_runtime_error_when_solution_stack_is_not_valid
|
83
83
|
env = EbDeployer::EbEnvironment.new("myapp", "production", @eb_driver, {
|
84
|
+
:cname_prefix => 'myapp-production',
|
84
85
|
:solution_stack => "python"
|
85
86
|
})
|
86
87
|
@eb_driver.set_solution_stacks(["java", "ruby"])
|
87
88
|
assert_raises(RuntimeError) { env.deploy("version 1") }
|
88
89
|
end
|
89
90
|
|
91
|
+
def test_should_no_set_cname_prefix_for_create_unless_for_web_tier
|
92
|
+
env = EbDeployer::EbEnvironment.new("myapp",
|
93
|
+
"production",
|
94
|
+
@eb_driver,
|
95
|
+
:tier => "Worker",
|
96
|
+
:cname_prefix => 'myapp-production')
|
97
|
+
env.deploy("version1")
|
98
|
+
assert @eb_driver.environment_exists?('myapp', t('production', 'myapp'))
|
99
|
+
assert_nil @eb_driver.environment_cname_prefix('myapp', t('production', 'myapp'))
|
100
|
+
end
|
101
|
+
|
90
102
|
|
91
103
|
end
|
@@ -135,10 +135,17 @@ class MultiComponentsDeployTest < DeployTest
|
|
135
135
|
do_bg_deploy(settings)
|
136
136
|
assert_equal 2, @eb.environment_settings('simple', t('prod-web-a', 'simple')).last[:value]
|
137
137
|
assert_equal 1, @eb.environment_settings('simple', t('prod-api-a', 'simple')).last[:value]
|
138
|
-
|
139
|
-
|
140
138
|
end
|
141
139
|
|
140
|
+
def test_should_raise_error_when_deploy_work_tier_component_with_blue_green
|
141
|
+
assert_raises(RuntimeError) do
|
142
|
+
deploy(:application => 'simple',
|
143
|
+
:environment => 'prod',
|
144
|
+
:strategy => 'blue-green',
|
145
|
+
:components => [{ 'name' => 'web' },
|
146
|
+
{ 'name' => 'bg', 'tier' => 'worker' }])
|
147
|
+
end
|
148
|
+
end
|
142
149
|
|
143
150
|
private
|
144
151
|
def do_deploy(options={})
|
@@ -10,4 +10,15 @@ class TierSettingDeployTest < DeployTest
|
|
10
10
|
deploy(:application => 'simple', :environment => "production", :tier => 'Worker')
|
11
11
|
assert_equal 'Worker', @eb.environment_tier('simple', t('production', 'simple'))
|
12
12
|
end
|
13
|
+
|
14
|
+
def test_should_worker_tier_should_not_have_cname_prefix
|
15
|
+
deploy(:application => 'simple', :environment => "production", :tier => 'Worker')
|
16
|
+
assert_nil @eb.environment_cname_prefix('simple', t('production', 'simple'))
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_should_raise_error_when_deploy_worker_tier_with_blue_green
|
20
|
+
assert_raises(RuntimeError) do
|
21
|
+
deploy(:application => 'simple', :environment => "production", :tier => 'Worker', :strategy => 'blue-green')
|
22
|
+
end
|
23
|
+
end
|
13
24
|
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
|
+
version: 0.5.0
|
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: 2015-
|
13
|
+
date: 2015-05-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: aws-sdk-v1
|