eb_deployer 0.6.1 → 0.6.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +15 -8
- data/lib/eb_deployer/application.rb +2 -2
- data/lib/eb_deployer/deployment_strategy/blue_green.rb +29 -1
- data/lib/eb_deployer/eb_environment.rb +4 -0
- data/lib/eb_deployer/utils.rb +1 -1
- data/lib/eb_deployer/version.rb +1 -1
- data/lib/eb_deployer.rb +5 -2
- data/lib/generators/eb_deployer/install/install_generator.rb +1 -1
- data/lib/generators/eb_deployer/install/templates/eb_deployer.yml.erb +15 -0
- data/test/blue_green_deploy_test.rb +7 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 737e66cde134b8ec8983b1dfc500adedab3cf526
|
4
|
+
data.tar.gz: 9e54bffac3fbd172d2f4d36a15aa4dc9502d6210
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1efa091565e68ddee6a383bb6c9b343199a40aaf4f381a8bd96faac1b38c4a390aba3fce924e6e45b79d5fe165fbace47dea0d81246b96050de6123f4aff905a
|
7
|
+
data.tar.gz: 678ceb2f2fa5f752b133edabbb451c8a9fb5d459bf86e51e95c20065b985cd047aa85f6ac5008065ee84e52521778771f7bc6226ae51c26b52f9385e51c19972
|
data/README.md
CHANGED
@@ -1,11 +1,9 @@
|
|
1
|
-
# EbDeployer [![Build Status](https://snap-ci.com/ThoughtWorksStudios/eb_deployer/branch/master/build_image)](https://snap-ci.com/ThoughtWorksStudios/eb_deployer/branch/master) [![Build Status](https://travis-ci.org/ThoughtWorksStudios/eb_deployer.png?branch=master)](https://travis-ci.org/ThoughtWorksStudios/eb_deployer) [![Gem Version](https://badge.fury.io/rb/eb_deployer.svg)](http://badge.fury.io/rb/eb_deployer)
|
1
|
+
# EbDeployer [![Build Status](https://snap-ci.com/ThoughtWorksStudios/eb_deployer/branch/master/build_image)](https://snap-ci.com/ThoughtWorksStudios/eb_deployer/branch/master) [![Build Status](https://travis-ci.org/ThoughtWorksStudios/eb_deployer.png?branch=master)](https://travis-ci.org/ThoughtWorksStudios/eb_deployer) [![Gem Version](https://badge.fury.io/rb/eb_deployer.svg)](http://badge.fury.io/rb/eb_deployer) [![Dependency Status](https://www.versioneye.com/ruby/eb_deployer/0.6.1/badge.svg)](https://www.versioneye.com/ruby/eb_deployer/0.6.1)
|
2
2
|
|
3
3
|
[Built with :yellow_heart: and :coffee: in San Francisco](http://www.thoughtworks.com/mingle/team/)
|
4
4
|
|
5
5
|
Low friction deployments should be a breeze. Elastic Beanstalk provides a great foundation for performing Blue-Green deployments, and EbDeployer add a missing link to automate the whole flow out of box.
|
6
6
|
|
7
|
-
EbDeployer thus allows you to do continuous delivery on AWS.
|
8
|
-
|
9
7
|
[Deploy Service by EbDeployer](http://www.thoughtworks.com/mingle/infrastructure/2015/06/01/deploy-service-by-ebdeployer.html)
|
10
8
|
|
11
9
|
## Installation
|
@@ -93,18 +91,26 @@ Take a look at code if you can not wait for the documentation.
|
|
93
91
|
|
94
92
|
### eb_deploy.yml configuration file
|
95
93
|
|
96
|
-
Like Rails database.yml file, EbDeployer will read eb_deploy.yml file as ERB template file. So you can trade it as standard ERB template file, and substitute Ruby script.
|
94
|
+
Like Rails database.yml file, EbDeployer will read eb_deploy.yml file as ERB template file. So you can trade it as standard ERB template file, and substitute Ruby script. For example, the following eb_deployer.yml file partial configures DBPassword parameter for your CloudFormation template from an environment variable:
|
95
|
+
|
96
|
+
resources:
|
97
|
+
template: config/my_rds.json
|
98
|
+
inputs:
|
99
|
+
DBPassword: <%= ENV['MYDBPASSWORD'] %>
|
97
100
|
|
98
|
-
|
101
|
+
|
102
|
+
EbDeployer also provides the following help methods for convenience:
|
99
103
|
|
100
104
|
1. random_hash: it basically is `SecureRandom.hex[0..9]`
|
101
105
|
2. package_digest: it is your eb package file digest
|
102
|
-
3. environment: environment name you passed in when executing eb_deploy script.
|
106
|
+
3. environment: environment name you passed in when executing eb_deploy script using -e option.
|
103
107
|
|
104
108
|
## More
|
105
109
|
|
106
110
|
[Automated zero downtime deployment to AWS Elastic Beanstalk for Rails with EbDeployer](http://helabs.com/blog/2015/05/19/automated-zero-downtime-deployment-to-aws-elastic-beanstalk-for-rails-with-eb-deployer/?utm_content=buffer12098&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer)
|
107
111
|
|
112
|
+
Co-presented session with Amazon ElasticBeanstalk team at AWS re:Invent 2013: [slideshare](http://www.slideshare.net/AmazonWebServices/aws-elastic-beanstalk-under-the-hood-dmg301-aws-reinvent-2013-28428616) and [video (starting at 27:46)](http://www.youtube.com/watch?v=U06-QLd4FL4)
|
113
|
+
|
108
114
|
[Deploy Service by EbDeployer](http://www.thoughtworks.com/mingle/infrastructure/2015/06/01/deploy-service-by-ebdeployer.html)
|
109
115
|
|
110
116
|
[Rails 3/4 Support](https://github.com/ThoughtWorksStudios/eb_deployer/wiki/Rails-3-Support)
|
@@ -113,10 +119,11 @@ By default, EbDeployer provides the following methods:
|
|
113
119
|
|
114
120
|
[Introduction to EbDeployer](http://getmingle.io/scaling/2014/06/13/introduction-to-eb-deployer.html)
|
115
121
|
|
116
|
-
AWS re:Invent 2013: [slideshare](http://www.slideshare.net/AmazonWebServices/aws-elastic-beanstalk-under-the-hood-dmg301-aws-reinvent-2013-28428616) and [video (starting at 27:46)](http://www.youtube.com/watch?v=U06-QLd4FL4)
|
117
|
-
|
118
122
|
[Papertrail Solution for Rails Applications on ElasticBeanstalk
|
119
123
|
](http://www.thoughtworks.com/mingle/infrastructure/2015/06/10/simple-solution-for-papertrail-on-elasticbeanstalk.html)
|
124
|
+
|
125
|
+
[Elastic Beanstalk Tips and Tricks](https://github.com/ThoughtWorksStudios/eb_deployer/wiki/Elastic-Beanstalk-Tips-and-Tricks) (* recommended to read for new Elastic Beanstalk users )
|
126
|
+
|
120
127
|
## Contributing
|
121
128
|
|
122
129
|
1. Fork it
|
@@ -68,9 +68,9 @@ module EbDeployer
|
|
68
68
|
begin
|
69
69
|
log("Removing #{version}")
|
70
70
|
@eb_driver.delete_application_version(@name, version, delete_from_s3)
|
71
|
-
rescue
|
71
|
+
rescue Aws::ElasticBeanstalk::Errors::SourceBundleDeletionFailure => e
|
72
72
|
log(e.message)
|
73
|
-
rescue
|
73
|
+
rescue Aws::ElasticBeanstalk::Errors::OperationInProgressFailure => e
|
74
74
|
log(e.message)
|
75
75
|
end
|
76
76
|
end
|
@@ -6,13 +6,16 @@ module EbDeployer
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def test_compatibility(env_create_options)
|
9
|
+
@create_opts = env_create_options
|
9
10
|
tier = env_create_options[:tier]
|
11
|
+
|
10
12
|
if tier && tier.downcase == 'worker'
|
11
13
|
raise "Blue green deployment is not supported for Worker tier"
|
12
14
|
end
|
13
15
|
end
|
14
16
|
|
15
17
|
def deploy(version_label, env_settings, inactive_settings=[])
|
18
|
+
|
16
19
|
if !ebenvs.any?(&method(:active_ebenv?))
|
17
20
|
ebenv('a', @component.cname_prefix).
|
18
21
|
deploy(version_label, env_settings)
|
@@ -24,7 +27,32 @@ module EbDeployer
|
|
24
27
|
|
25
28
|
inactive_ebenv.deploy(version_label, env_settings)
|
26
29
|
active_ebenv.swap_cname_with(inactive_ebenv)
|
27
|
-
|
30
|
+
|
31
|
+
blue_green_terminate_inactive = @create_opts[:blue_green_terminate_inactive]
|
32
|
+
blue_green_terminate_inactive_wait = @create_opts[:blue_green_terminate_inactive_wait]
|
33
|
+
blue_green_terminate_inactive_sleep = @create_opts[:blue_green_terminate_inactive_sleep]
|
34
|
+
|
35
|
+
if blue_green_terminate_inactive
|
36
|
+
active_ebenv.log("Waiting #{blue_green_terminate_inactive_wait}s before terminating environment...")
|
37
|
+
|
38
|
+
# Loop until timeout reached or environment becomes Red
|
39
|
+
count = 0
|
40
|
+
loop do
|
41
|
+
break if count >= blue_green_terminate_inactive_wait or inactive_ebenv.health_state != 'Green'
|
42
|
+
sleep blue_green_terminate_inactive_sleep
|
43
|
+
count += blue_green_terminate_inactive_sleep
|
44
|
+
end
|
45
|
+
|
46
|
+
if inactive_ebenv.health_state == 'Green'
|
47
|
+
active_ebenv.log("Active environment healthy, terminating inactive (black) environment")
|
48
|
+
active_ebenv.terminate
|
49
|
+
else
|
50
|
+
active_ebenv.log("Active environment changed state to unhealthy. Existing (black) environment will not be terminated")
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
unless inactive_settings.empty? || blue_green_terminate_inactive
|
28
56
|
active_ebenv.log("applying inactive settings...")
|
29
57
|
active_ebenv.apply_settings(inactive_settings)
|
30
58
|
end
|
data/lib/eb_deployer/utils.rb
CHANGED
data/lib/eb_deployer/version.rb
CHANGED
data/lib/eb_deployer.rb
CHANGED
@@ -95,7 +95,7 @@ module EbDeployer
|
|
95
95
|
# will terminate the old elastic beanstalk environment and recreate on
|
96
96
|
# deploy. For blue-green deployment it terminate the inactive environment
|
97
97
|
# first then recreate it. This is useful to avoiding configuration drift and
|
98
|
-
# accumulating state on the EC2 instances. Also it has the
|
98
|
+
# accumulating state on the EC2 instances. Also it has the benefit of keeping
|
99
99
|
# your EC2 instance system package upto date, because everytime EC2 instance
|
100
100
|
# boot up from AMI it does a system update.
|
101
101
|
#
|
@@ -204,6 +204,9 @@ module EbDeployer
|
|
204
204
|
:cname_prefix => opts[:cname_prefix],
|
205
205
|
:smoke_test => opts[:smoke_test],
|
206
206
|
:phoenix_mode => opts[:phoenix_mode],
|
207
|
+
:blue_green_terminate_inactive => opts[:blue_green_terminate_inactive] || false,
|
208
|
+
:blue_green_terminate_inactive_wait => opts[:blue_green_terminate_inactive_wait] || 600,
|
209
|
+
:blue_green_terminate_inactive_sleep => opts[:blue_green_terminate_inactive_sleep] || 15,
|
207
210
|
:tags => opts[:tags],
|
208
211
|
:tier => opts[:tier]
|
209
212
|
}
|
@@ -302,7 +305,7 @@ module EbDeployer
|
|
302
305
|
require 'aws-sdk'
|
303
306
|
logger = Logger.new($stdout)
|
304
307
|
logger.level = Logger::DEBUG
|
305
|
-
Aws.config
|
308
|
+
Aws.config.update(:logger => logger)
|
306
309
|
end
|
307
310
|
|
308
311
|
opts.on("-h", "--help", "help") do
|
@@ -59,7 +59,7 @@ YAML
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def solution_stack_name
|
62
|
-
|
62
|
+
Aws::ElasticBeanstalk.Client.new.list_available_solution_stacks[:solution_stacks].find do |s|
|
63
63
|
s =~ /Amazon Linux/ && s =~ /running Ruby 2.1 \(Passenger Standalone\)/
|
64
64
|
end
|
65
65
|
rescue
|
@@ -37,6 +37,21 @@ common:
|
|
37
37
|
# you override it to 'on' for production environment.
|
38
38
|
# phoenix_mode: false
|
39
39
|
|
40
|
+
# Terminates the inactive stack upon successful blue-green deployment.
|
41
|
+
# This is useful if you require HA deployment but don't want the cost of running
|
42
|
+
# a stack that is not in use. See https://github.com/ThoughtWorksStudios/eb_deployer/pull/44/
|
43
|
+
# for other strategies that can be employed.
|
44
|
+
# Note: As EB Deployer uses DNS to switch between stacks, this should be used only if you
|
45
|
+
# both put in a sufficient wait period and accept the risk that traffic may still be
|
46
|
+
# going to the inactive stack when it is terminated, due to client DNS caching, for example.
|
47
|
+
#blue_green_terminate_inactive: false
|
48
|
+
|
49
|
+
# How long to wait before terminating the inactive stack if 'blue_green_terminate_inactive' is set to true.
|
50
|
+
#blue_green_terminate_inactive_wait: 600
|
51
|
+
|
52
|
+
# How often to check for changes to the inactive stack during the 'blue_green_terminate_inactive_wait' period.
|
53
|
+
#blue_green_terminate_inactive_sleep: 15
|
54
|
+
|
40
55
|
# Specifies the maximum number of versions to keep. Older versions are removed
|
41
56
|
# and deleted from the S3 source bucket as well. If specified as zero or not
|
42
57
|
# specified, all versions will be kept. If a version_prefix is given, only removes
|
@@ -39,6 +39,13 @@ class BlueGreenDeployTest < DeployTest
|
|
39
39
|
'simple-production-inactive.elasticbeanstalk.com'], smoked_host
|
40
40
|
end
|
41
41
|
|
42
|
+
def test_blue_green_deploy_should_blue_green_terminate_inactive_env_if_blue_green_terminate_inactive_is_enabled
|
43
|
+
do_deploy(42, :blue_green_terminate_inactive => true, :blue_green_terminate_inactive_wait => 1, :blue_green_terminate_inactive_sleep => 1)
|
44
|
+
do_deploy(43, :blue_green_terminate_inactive => true, :blue_green_terminate_inactive_wait => 0, :blue_green_terminate_inactive_sleep => 0)
|
45
|
+
|
46
|
+
inactive_env = t('production-a', 'simple')
|
47
|
+
assert_equal [inactive_env], @eb.environments_been_deleted('simple')
|
48
|
+
end
|
42
49
|
|
43
50
|
def test_blue_green_deployment_should_delete_and_recreate_inactive_env_if_phoenix_mode_is_enabled
|
44
51
|
do_deploy(42, :phoenix_mode => true)
|
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.6.
|
4
|
+
version: 0.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- wpc
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-
|
12
|
+
date: 2015-09-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: aws-sdk
|