rebi 0.2.3 → 0.3.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 +12 -21
- data/bin/rebi +17 -3
- data/lib/rebi.rb +16 -18
- data/lib/rebi/application.rb +31 -58
- data/lib/rebi/config.rb +45 -1
- data/lib/rebi/config_environment.rb +33 -1
- data/lib/rebi/ec2.rb +7 -4
- data/lib/rebi/environment.rb +134 -67
- data/lib/rebi/log.rb +54 -0
- data/lib/rebi/version.rb +1 -1
- data/lib/rebi/zip_helper.rb +80 -13
- data/sample/rebi.yml +11 -0
- metadata +78 -8
- data/lib/rebi/iam.rb +0 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d5506d4a48ece06d7c2c3cc00b56e931ae6aeb3
|
4
|
+
data.tar.gz: 27748616915072f0eb9de0f9c588a64680212598
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c8575bb0477ce90c205cdbbcf07000d508594281605d1e406d7ccfa6247ee4f47d6c0e3886deb139982d929b120f4af9a82b3c77936522f5aebc8f8c0b558988
|
7
|
+
data.tar.gz: 1643039aaa197bbb8303b6ecbaa50ff3cb49522ab86b7f3e46ebaab129913403c6c477fe6e05098d24b3afef666ed99dde0738f5a663099d5e5b7100a22678e7
|
data/README.md
CHANGED
@@ -2,11 +2,13 @@
|
|
2
2
|
Deployment tool for Elasticbeanstalk
|
3
3
|
|
4
4
|
# Features
|
5
|
-
- Switchable
|
5
|
+
- Switchable + multiple ebextensions folder
|
6
|
+
- Switchable + ERB Supported Dockerrun.aws.json
|
6
7
|
- Support erb in ebextension config files
|
7
8
|
- Support env_file for environment variables
|
8
9
|
- Multiple deployment
|
9
10
|
- Deploy source code along with updating beanstalk options
|
11
|
+
- Hook commands before and after deploy
|
10
12
|
- Simple config
|
11
13
|
- Simple ssh
|
12
14
|
|
@@ -17,28 +19,17 @@ $ gem install rebi
|
|
17
19
|
```
|
18
20
|
|
19
21
|
## Usage
|
20
|
-
How to use my plugin.
|
21
|
-
|
22
|
-
### AWS authentication
|
23
|
-
Rebi uses environment variables to get aws credentials
|
24
|
-
To set environment variables use `export` or `.env` file
|
25
|
-
```bash
|
26
|
-
# Use access key
|
27
|
-
export AWS_ACCESS_KEY_ID=xxxxx
|
28
|
-
export AWS_SECRET_ACCESS_KEY=xxxxxx
|
29
|
-
```
|
30
|
-
Or
|
31
|
-
```bash
|
32
|
-
# Use profile
|
33
|
-
export AWS_PROFILE=xxxxx
|
34
|
-
```
|
35
|
-
|
36
|
-
Refer http://docs.aws.amazon.com/sdkforruby/api/Aws/ElasticBeanstalk/Client.html for other settings
|
37
22
|
|
38
23
|
### Yaml config
|
39
|
-
Default config file is
|
24
|
+
Default config file is `.rebi.yml` use `-c` to switch
|
40
25
|
```yaml
|
41
26
|
app_name: app-name
|
27
|
+
profile: aws_profile # if use profile, can overwrite this by command option --profile
|
28
|
+
|
29
|
+
# if use key/secret credentials(If you dont want to commit credentials to version control system use environment variables instead (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY))
|
30
|
+
aws_key: aws_key
|
31
|
+
aws_secret: aws_secret
|
32
|
+
|
42
33
|
stages:
|
43
34
|
development:
|
44
35
|
web:
|
@@ -47,9 +38,9 @@ stages:
|
|
47
38
|
ebextensions: "web-ebextensions"
|
48
39
|
```
|
49
40
|
|
50
|
-
For other configs(
|
41
|
+
For other configs(key_name, instance_type, instance_num, service_role,...), please refer sample config
|
51
42
|
```bash
|
52
|
-
$ bundle exec rebi sample > rebi.yml
|
43
|
+
$ bundle exec rebi sample > .rebi.yml
|
53
44
|
```
|
54
45
|
|
55
46
|
### Deploy
|
data/bin/rebi
CHANGED
@@ -4,6 +4,13 @@ require 'rubygems'
|
|
4
4
|
require 'commander/import'
|
5
5
|
require 'rebi'
|
6
6
|
|
7
|
+
# For debug
|
8
|
+
begin
|
9
|
+
require 'byebug'
|
10
|
+
rescue LoadError
|
11
|
+
|
12
|
+
end
|
13
|
+
|
7
14
|
REBI_PATH = File.join(File.dirname(File.expand_path(__FILE__)), "..")
|
8
15
|
|
9
16
|
program :name, 'Rebi'
|
@@ -15,6 +22,11 @@ global_option('-c', '--config FILE', 'Load config data for your commands to use'
|
|
15
22
|
Rebi.config.reload!
|
16
23
|
end
|
17
24
|
|
25
|
+
global_option('--profile STRING', 'Aws profile') do |profile|
|
26
|
+
Rebi.config.aws_profile = profile
|
27
|
+
Rebi.config.reload!
|
28
|
+
end
|
29
|
+
|
18
30
|
command :deploy do |c|
|
19
31
|
c.syntax = 'rebi deploy stage [env_name] [--options]'
|
20
32
|
c.description = 'Deploy single or multiple ElasticBeanstalk environments'
|
@@ -22,6 +34,8 @@ command :deploy do |c|
|
|
22
34
|
c.example 'Deploy all environments in development', 'rebi deploy development'
|
23
35
|
c.option '--include-settings', 'Deploy source and settings'
|
24
36
|
c.option '--settings-only', 'Deploy option_settings and environment variables only'
|
37
|
+
c.option '--staged', 'Deploy files staged in git rather than the HEAD commit'
|
38
|
+
c.option '-y', '--yes', 'Skip confirmation'
|
25
39
|
c.action do |args, options|
|
26
40
|
stage, env_name = args
|
27
41
|
raise Rebi::Error.new("Stage cannot be nil") if stage.blank?
|
@@ -29,7 +43,7 @@ command :deploy do |c|
|
|
29
43
|
if env_name.present?
|
30
44
|
Rebi.app.deploy stage, env_name, opts
|
31
45
|
else
|
32
|
-
if agree("Do you want to deploy all environments in #{stage} stage?(Y/n)")
|
46
|
+
if options.yes || agree("Do you want to deploy all environments in #{stage} stage?(Y/n)")
|
33
47
|
Rebi.log("Preparing for deployment")
|
34
48
|
Rebi.app.deploy stage, nil, opts
|
35
49
|
end
|
@@ -72,12 +86,13 @@ end
|
|
72
86
|
command :terminate do |c|
|
73
87
|
c.syntax = 'rebi terminate stage env_name'
|
74
88
|
c.description = 'Terminate environment'
|
89
|
+
c.option '-y', '--yes', 'Skip confirmation'
|
75
90
|
c.action do |args, options|
|
76
91
|
stage, env_name = args
|
77
92
|
raise Rebi::Error.new("Stage cannot be nil") if stage.blank?
|
78
93
|
raise Rebi::Error.new("Env name cannot be nil") if env_name.blank?
|
79
94
|
env_conf = Rebi.config.environment(stage, env_name)
|
80
|
-
if
|
95
|
+
if options.yes || agree("Do you want to terminate '#{env_conf.name}' environment?(Y/n)")
|
81
96
|
Rebi.app.terminate! stage, env_name
|
82
97
|
end
|
83
98
|
end
|
@@ -98,7 +113,6 @@ command :ssh do |c|
|
|
98
113
|
c.action do |args, options|
|
99
114
|
stage, env_name = args
|
100
115
|
raise Rebi::Error.new("Stage cannot be nil") if stage.blank?
|
101
|
-
raise Rebi::Error.new("Env name cannot be nil") if env_name.blank?
|
102
116
|
Rebi.app.ssh_interaction stage, env_name, options.__hash__
|
103
117
|
end
|
104
118
|
end
|
data/lib/rebi.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
require 'active_support/all'
|
2
|
-
require 'aws-sdk'
|
2
|
+
require 'aws-sdk-ec2'
|
3
|
+
require 'aws-sdk-s3'
|
4
|
+
require 'aws-sdk-elasticbeanstalk'
|
5
|
+
require 'aws-sdk-iam'
|
3
6
|
require 'colorized_string'
|
4
7
|
require 'singleton'
|
5
8
|
require 'yaml'
|
@@ -13,7 +16,9 @@ require 'ostruct'
|
|
13
16
|
require 'thread'
|
14
17
|
require 'thwait'
|
15
18
|
require 'subprocess'
|
19
|
+
require 'pathspec'
|
16
20
|
|
21
|
+
require 'rebi/log'
|
17
22
|
require 'rebi/erb_helper'
|
18
23
|
require 'rebi/zip_helper'
|
19
24
|
require 'rebi/application'
|
@@ -24,11 +29,12 @@ require 'rebi/error'
|
|
24
29
|
require 'rebi/ec2'
|
25
30
|
require 'rebi/version'
|
26
31
|
|
27
|
-
Dotenv.load
|
32
|
+
# Dotenv.load
|
28
33
|
|
29
34
|
module Rebi
|
30
|
-
|
35
|
+
include Rebi::Log
|
31
36
|
|
37
|
+
extend self
|
32
38
|
attr_accessor :config_file
|
33
39
|
@config_file = "config/rebi.yml"
|
34
40
|
|
@@ -36,18 +42,22 @@ module Rebi
|
|
36
42
|
Dir.pwd
|
37
43
|
end
|
38
44
|
|
39
|
-
def
|
40
|
-
@@
|
45
|
+
def eb c=nil
|
46
|
+
@@eb = Aws::ElasticBeanstalk::Client.new
|
41
47
|
end
|
42
48
|
|
43
49
|
def ec2
|
44
|
-
@@ec2_client = Rebi::EC2.new
|
50
|
+
@@ec2_client = Rebi::EC2.new Aws::EC2::Client.new
|
45
51
|
end
|
46
52
|
|
47
53
|
def iam
|
48
54
|
@@iam_client = Aws::IAM::Client.new
|
49
55
|
end
|
50
56
|
|
57
|
+
def s3
|
58
|
+
@@s3_client = Aws::S3::Client.new
|
59
|
+
end
|
60
|
+
|
51
61
|
def app
|
52
62
|
return Rebi::Application.get_or_create_application(config.app_name)
|
53
63
|
end
|
@@ -61,16 +71,4 @@ module Rebi
|
|
61
71
|
config.reload!
|
62
72
|
end
|
63
73
|
|
64
|
-
def log mes, prefix=nil
|
65
|
-
puts "#{prefix ? "#{colorize_prefix(prefix)}: " : ""}#{mes}"
|
66
|
-
end
|
67
|
-
|
68
|
-
COLORS = [:red, :green, :yellow, :blue, :magenta, :cyan, :white]
|
69
|
-
def colorize_prefix(prefix)
|
70
|
-
h = prefix.chars.inject(0) do |m, c|
|
71
|
-
m + c.ord
|
72
|
-
end
|
73
|
-
return ColorizedString[prefix].colorize(COLORS[h % COLORS.count])
|
74
|
-
end
|
75
|
-
|
76
74
|
end
|
data/lib/rebi/application.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
module Rebi
|
2
2
|
class Application
|
3
|
+
include Rebi::Log
|
3
4
|
attr_reader :app, :app_name, :client, :s3_client
|
4
|
-
def initialize app, client
|
5
|
+
def initialize app, client=Rebi.eb
|
5
6
|
@app = app
|
6
7
|
@app_name = app.application_name
|
7
8
|
@client = client
|
8
|
-
@s3_client = Aws::S3::Client.new
|
9
9
|
end
|
10
10
|
|
11
11
|
def bucket_name
|
@@ -16,18 +16,18 @@ module Rebi
|
|
16
16
|
Rebi::Environment.all app_name
|
17
17
|
end
|
18
18
|
|
19
|
+
def log_label
|
20
|
+
app_name
|
21
|
+
end
|
22
|
+
|
19
23
|
def deploy stage_name, env_name=nil, opts={}
|
20
24
|
return deploy_stage(stage_name, opts) if env_name.blank?
|
21
25
|
env = get_environment stage_name, env_name
|
22
|
-
app_version = create_app_version env
|
23
26
|
begin
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
Rebi.log("Environment in updating", env.name)
|
28
|
-
raise e
|
27
|
+
env.deploy opts
|
28
|
+
rescue Interrupt
|
29
|
+
log("Interrupt")
|
29
30
|
end
|
30
|
-
req_id
|
31
31
|
end
|
32
32
|
|
33
33
|
def deploy_stage stage_name, opts={}
|
@@ -38,9 +38,9 @@ module Rebi
|
|
38
38
|
begin
|
39
39
|
deploy stage_name, env_name, opts
|
40
40
|
rescue Exception => e
|
41
|
-
|
42
|
-
e.backtrace.each do |m|
|
43
|
-
|
41
|
+
error(e.message)
|
42
|
+
opts[:trace] && e.backtrace.each do |m|
|
43
|
+
error(m)
|
44
44
|
end
|
45
45
|
end
|
46
46
|
end
|
@@ -61,11 +61,11 @@ module Rebi
|
|
61
61
|
env = get_environment stage_name, env_name
|
62
62
|
env_vars = from_config ? env.config.environment_variables : env.environment_variables
|
63
63
|
|
64
|
-
|
64
|
+
log("#{from_config ? "Config" : "Current"} environment variables")
|
65
65
|
env_vars.each do |k,v|
|
66
|
-
|
66
|
+
log("#{k}=#{v}")
|
67
67
|
end
|
68
|
-
|
68
|
+
log("--------------------------------------")
|
69
69
|
end
|
70
70
|
|
71
71
|
def print_environment_status stage_name, env_name
|
@@ -79,11 +79,11 @@ module Rebi
|
|
79
79
|
|
80
80
|
env = get_environment stage_name, env_name
|
81
81
|
env.check_created!
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
82
|
+
log("--------- CURRENT STATUS -------------")
|
83
|
+
log("id: #{env.id}")
|
84
|
+
log("Status: #{env.status}")
|
85
|
+
log("Health: #{env.health}")
|
86
|
+
log("--------------------------------------")
|
87
87
|
end
|
88
88
|
|
89
89
|
def terminate! stage_name, env_name
|
@@ -92,37 +92,11 @@ module Rebi
|
|
92
92
|
req_id = env.terminate!
|
93
93
|
ThreadsWait.all_waits(env.watch_request req_id) if req_id
|
94
94
|
rescue Rebi::Error::EnvironmentInUpdating => e
|
95
|
-
|
95
|
+
log("Environment in updating")
|
96
96
|
raise e
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
100
|
-
def create_app_version env
|
101
|
-
start = Time.now.utc
|
102
|
-
source_bundle = Rebi::ZipHelper.new.gen(env.config)
|
103
|
-
version_label = source_bundle[:label]
|
104
|
-
key = "#{app_name}/#{version_label}.zip"
|
105
|
-
Rebi.log("Uploading source bundle: #{version_label}.zip", env.config.name)
|
106
|
-
s3_client.put_object(
|
107
|
-
bucket: bucket_name,
|
108
|
-
key: key,
|
109
|
-
body: source_bundle[:file].read
|
110
|
-
)
|
111
|
-
Rebi.log("Creating app version: #{version_label}", env.config.name)
|
112
|
-
client.create_application_version({
|
113
|
-
application_name: app_name,
|
114
|
-
description: source_bundle[:message],
|
115
|
-
version_label: version_label,
|
116
|
-
source_bundle: {
|
117
|
-
s3_bucket: bucket_name,
|
118
|
-
s3_key: key
|
119
|
-
}
|
120
|
-
})
|
121
|
-
Rebi.log("App version was created in: #{Time.now.utc - start}s", env.config.name)
|
122
|
-
return version_label
|
123
|
-
end
|
124
|
-
|
125
|
-
|
126
100
|
def print_list
|
127
101
|
others = []
|
128
102
|
configed = Hash.new {|h, k| h[k] = {} }
|
@@ -135,36 +109,35 @@ module Rebi
|
|
135
109
|
end
|
136
110
|
|
137
111
|
configed.each do |stg, envs|
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
112
|
+
log h1("#{stg.camelize}")
|
113
|
+
envs.each do |kname, env_name|
|
114
|
+
env = get_environment stg, kname
|
115
|
+
log "\t[#{kname.camelize}] #{env.name} #{h2(env.status)} #{hstatus(env.health)}"
|
142
116
|
end
|
143
117
|
end
|
144
118
|
|
145
119
|
if others.present?
|
146
|
-
|
147
|
-
Rebi.log "Others:"
|
120
|
+
log h1("Others")
|
148
121
|
others.each do |e|
|
149
|
-
|
122
|
+
log "\t- #{e}"
|
150
123
|
end
|
151
124
|
end
|
152
125
|
end
|
153
126
|
|
154
127
|
def ssh_interaction stage_name, env_name, opts={}
|
128
|
+
env_name = Rebi.config.stage(stage_name).keys.first unless env_name
|
155
129
|
env = get_environment stage_name, env_name
|
156
130
|
instance_ids = env.instance_ids
|
157
131
|
return if instance_ids.empty?
|
158
132
|
|
159
133
|
instance_ids.each.with_index do |i,idx|
|
160
|
-
|
134
|
+
log "#{idx+1}) #{i}"
|
161
135
|
end
|
162
136
|
|
163
137
|
instance_id = instance_ids.first
|
164
138
|
|
165
139
|
if instance_ids.count != 1 && opts[:select]
|
166
140
|
|
167
|
-
|
168
141
|
idx = 0
|
169
142
|
while idx < 1 || idx > instance_ids.count
|
170
143
|
idx = ask_for_integer "Select an instance to ssh into:"
|
@@ -172,7 +145,7 @@ module Rebi
|
|
172
145
|
instance_id = instance_ids[idx - 1]
|
173
146
|
end
|
174
147
|
|
175
|
-
|
148
|
+
log "Preparing to ssh into [#{instance_id}]"
|
176
149
|
env.ssh instance_id
|
177
150
|
end
|
178
151
|
|
@@ -181,7 +154,7 @@ module Rebi
|
|
181
154
|
end
|
182
155
|
|
183
156
|
def self.client
|
184
|
-
Rebi.
|
157
|
+
Rebi.eb
|
185
158
|
end
|
186
159
|
|
187
160
|
def self.get_application app_name
|
data/lib/rebi/config.rb
CHANGED
@@ -2,16 +2,38 @@ module Rebi
|
|
2
2
|
class Config
|
3
3
|
include Singleton
|
4
4
|
|
5
|
+
def initialize
|
6
|
+
reload!
|
7
|
+
end
|
8
|
+
|
5
9
|
def config_file
|
6
|
-
@config_file ||= "#{Rebi.root}
|
10
|
+
@config_file ||= "#{Rebi.root}/.rebi.yml"
|
7
11
|
end
|
8
12
|
|
9
13
|
def config_file=path
|
10
14
|
@config_file = Pathname.new(path).realpath.to_s
|
11
15
|
end
|
12
16
|
|
17
|
+
attr_writer :aws_profile, :aws_key, :aws_secret, :region
|
18
|
+
def aws_profile
|
19
|
+
@aws_profile || data[:profile] || ENV["AWS_PROFILE"]
|
20
|
+
end
|
21
|
+
|
22
|
+
def aws_key
|
23
|
+
data[:aws_key] || ENV["AWS_ACCESS_KEY_ID"]
|
24
|
+
end
|
25
|
+
|
26
|
+
def aws_secret
|
27
|
+
data[:aws_secret] || ENV["AWS_SECRET_ACCESS_KEY"]
|
28
|
+
end
|
29
|
+
|
30
|
+
def region
|
31
|
+
data[:region]
|
32
|
+
end
|
33
|
+
|
13
34
|
def reload!
|
14
35
|
@data = nil
|
36
|
+
set_aws_config
|
15
37
|
return data
|
16
38
|
end
|
17
39
|
|
@@ -59,5 +81,27 @@ module Rebi
|
|
59
81
|
raise Rebi::Error::ConfigInvalid.new("stages cannot be nil") if @data[:stages].blank?
|
60
82
|
return @data
|
61
83
|
end
|
84
|
+
|
85
|
+
def set_aws_config
|
86
|
+
conf = {}
|
87
|
+
|
88
|
+
if region
|
89
|
+
conf.merge!({
|
90
|
+
region: region
|
91
|
+
})
|
92
|
+
end
|
93
|
+
|
94
|
+
if aws_profile
|
95
|
+
conf.merge!({
|
96
|
+
profile: aws_profile
|
97
|
+
})
|
98
|
+
elsif aws_secret && aws_key
|
99
|
+
conf.merge!(
|
100
|
+
credentials: Aws::Credentials::new(aws_key, aws_secret)
|
101
|
+
)
|
102
|
+
end
|
103
|
+
|
104
|
+
Aws.config.update conf
|
105
|
+
end
|
62
106
|
end
|
63
107
|
end
|
@@ -61,7 +61,7 @@ module Rebi
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def cname_prefix
|
64
|
-
@cname_prefix
|
64
|
+
self.worker? ? nil : @cname_prefix || raw_conf[:cname_prefix]
|
65
65
|
end
|
66
66
|
|
67
67
|
def tier
|
@@ -95,6 +95,10 @@ module Rebi
|
|
95
95
|
tier[:name] == "Worker" ? true : false
|
96
96
|
end
|
97
97
|
|
98
|
+
def web?
|
99
|
+
!worker?
|
100
|
+
end
|
101
|
+
|
98
102
|
def instance_type
|
99
103
|
get_opt ns[:autoscaling_launch], :InstanceType
|
100
104
|
end
|
@@ -135,6 +139,10 @@ module Rebi
|
|
135
139
|
@env_file ||= raw_conf[:env_file]
|
136
140
|
end
|
137
141
|
|
142
|
+
def dockerrun
|
143
|
+
raw_conf[:dockerrun]
|
144
|
+
end
|
145
|
+
|
138
146
|
def cfg
|
139
147
|
begin
|
140
148
|
return nil if cfg_file.blank?
|
@@ -222,6 +230,30 @@ module Rebi
|
|
222
230
|
key.present? ? NAMESPACE[key.to_sym] : NAMESPACE
|
223
231
|
end
|
224
232
|
|
233
|
+
def hooks
|
234
|
+
return @hooks if @hooks
|
235
|
+
|
236
|
+
@hooks = {
|
237
|
+
pre: [],
|
238
|
+
post: [],
|
239
|
+
}.with_indifferent_access
|
240
|
+
|
241
|
+
[:pre, :post].each do |type|
|
242
|
+
next unless h = raw_conf[:hooks] && raw_conf[:hooks][type]
|
243
|
+
@hooks[type] = h.is_a?(Array) ? h : [h]
|
244
|
+
end
|
245
|
+
|
246
|
+
return @hooks
|
247
|
+
end
|
248
|
+
|
249
|
+
def pre_hooks
|
250
|
+
hooks[:pre]
|
251
|
+
end
|
252
|
+
|
253
|
+
def post_hooks
|
254
|
+
hooks[:post]
|
255
|
+
end
|
256
|
+
|
225
257
|
private
|
226
258
|
|
227
259
|
def has_value_by_keys(hash, *keys)
|
data/lib/rebi/ec2.rb
CHANGED
@@ -1,12 +1,18 @@
|
|
1
1
|
module Rebi
|
2
2
|
class EC2
|
3
3
|
|
4
|
+
include Rebi::Log
|
5
|
+
|
4
6
|
attr_reader :client
|
5
7
|
|
6
|
-
def initialize client
|
8
|
+
def initialize client
|
7
9
|
@client = client
|
8
10
|
end
|
9
11
|
|
12
|
+
def log_label
|
13
|
+
"EC2"
|
14
|
+
end
|
15
|
+
|
10
16
|
def describe_instance instance_id
|
11
17
|
res = client.describe_instances instance_ids: [instance_id]
|
12
18
|
return res.reservations.first.instances.first
|
@@ -52,8 +58,5 @@ module Rebi
|
|
52
58
|
end
|
53
59
|
end
|
54
60
|
|
55
|
-
def log mes
|
56
|
-
Rebi.log(mes, "EC2")
|
57
|
-
end
|
58
61
|
end
|
59
62
|
end
|
data/lib/rebi/environment.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module Rebi
|
2
2
|
class Environment
|
3
3
|
|
4
|
+
include Rebi::Log
|
5
|
+
|
4
6
|
attr_reader :stage_name,
|
5
7
|
:env_name,
|
6
8
|
:app_name,
|
@@ -8,6 +10,7 @@ module Rebi
|
|
8
10
|
:config
|
9
11
|
|
10
12
|
attr_accessor :client,
|
13
|
+
:s3_client,
|
11
14
|
:api_data
|
12
15
|
|
13
16
|
|
@@ -41,15 +44,20 @@ module Rebi
|
|
41
44
|
'ec2.sshalreadyopen': 'the specified rule "peer: 0.0.0.0/0, TCP, from port: 22, to port: 22,',
|
42
45
|
}
|
43
46
|
|
44
|
-
def initialize stage_name, env_name, client=Rebi.
|
47
|
+
def initialize stage_name, env_name, client=Rebi.eb
|
45
48
|
@stage_name = stage_name
|
46
49
|
@env_name = env_name
|
47
50
|
@client = client
|
51
|
+
@s3_client = Rebi.s3
|
48
52
|
@config = Rebi.config.environment(stage_name, env_name)
|
49
53
|
@app_name = @config.app_name
|
50
54
|
@api_data
|
51
55
|
end
|
52
56
|
|
57
|
+
def bucket_name
|
58
|
+
@bucket_name ||= client.create_storage_location.s3_bucket
|
59
|
+
end
|
60
|
+
|
53
61
|
def name
|
54
62
|
created? ? api_data.environment_name : config.name
|
55
63
|
end
|
@@ -128,6 +136,8 @@ module Rebi
|
|
128
136
|
end
|
129
137
|
|
130
138
|
def watch_request request_id
|
139
|
+
return unless request_id
|
140
|
+
log h1("WATCHING REQUEST [#{request_id}]")
|
131
141
|
check_created!
|
132
142
|
start = Time.now
|
133
143
|
finished = false
|
@@ -169,23 +179,39 @@ module Rebi
|
|
169
179
|
resp.environment_resources.instances.map(&:id).sort
|
170
180
|
end
|
171
181
|
|
182
|
+
def create_app_version opts={}
|
183
|
+
return if opts[:settings_only]
|
184
|
+
start = Time.now.utc
|
185
|
+
source_bundle = Rebi::ZipHelper.new.gen(self.config, opts)
|
186
|
+
version_label = source_bundle[:label]
|
187
|
+
key = "#{app_name}/#{version_label}.zip"
|
188
|
+
log("Uploading source bundle: #{version_label}.zip")
|
189
|
+
s3_client.put_object(
|
190
|
+
bucket: bucket_name,
|
191
|
+
key: key,
|
192
|
+
body: source_bundle[:file].read
|
193
|
+
)
|
194
|
+
log("Creating app version: #{version_label}")
|
195
|
+
client.create_application_version({
|
196
|
+
application_name: app_name,
|
197
|
+
description: source_bundle[:message],
|
198
|
+
version_label: version_label,
|
199
|
+
source_bundle: {
|
200
|
+
s3_bucket: bucket_name,
|
201
|
+
s3_key: key
|
202
|
+
}
|
203
|
+
})
|
204
|
+
log("App version was created in: #{Time.now.utc - start}s")
|
205
|
+
return version_label
|
206
|
+
end
|
207
|
+
|
172
208
|
def init version_label, opts={}
|
173
|
-
log("
|
209
|
+
log h2("Start creating new environment")
|
174
210
|
start_time = Time.now
|
175
211
|
|
176
212
|
self.check_instance_profile
|
177
213
|
|
178
|
-
self.api_data = client.create_environment(
|
179
|
-
application_name: config.app_name,
|
180
|
-
environment_name: config.name,
|
181
|
-
version_label: version_label,
|
182
|
-
tier: config.tier,
|
183
|
-
description: config.description,
|
184
|
-
option_settings: config.opts_array,
|
185
|
-
}.merge(
|
186
|
-
config.worker? ? {} : { cname_prefix: config.cname_prefix }
|
187
|
-
).merge(config.platform_arn ? { platform_arn: config.platform_arn } : { solution_stack_name: config.solution_stack_name })
|
188
|
-
)
|
214
|
+
self.api_data = client.create_environment _create_args(version_label, opts)
|
189
215
|
|
190
216
|
request_id = events(start_time).select do |e|
|
191
217
|
e.message.match(response_msgs('event.createstarting'))
|
@@ -195,31 +221,11 @@ module Rebi
|
|
195
221
|
|
196
222
|
def update version_label, opts={}
|
197
223
|
|
198
|
-
raise Rebi::Error::EnvironmentInUpdating.new(name) if in_updating?
|
199
|
-
log("Start updating")
|
224
|
+
raise Rebi::Error::EnvironmentInUpdating.new("Environment is in updating: #{name}") if in_updating?
|
225
|
+
log h2("Start updating")
|
200
226
|
start_time = Time.now
|
201
|
-
deploy_opts = gen_deploy_opts
|
202
|
-
deploy_args = {
|
203
|
-
application_name: config.app_name,
|
204
|
-
environment_name: config.name,
|
205
|
-
version_label: version_label,
|
206
|
-
description: config.description,
|
207
|
-
}
|
208
227
|
|
209
|
-
|
210
|
-
deploy_args.merge!({
|
211
|
-
option_settings: deploy_opts[:option_settings],
|
212
|
-
options_to_remove: deploy_opts[:options_to_remove],
|
213
|
-
})
|
214
|
-
deploy_args.delete(:version_label) if opts[:settings_only]
|
215
|
-
else
|
216
|
-
deploy_args.merge!({
|
217
|
-
option_settings: deploy_opts[:env_only],
|
218
|
-
options_to_remove: deploy_opts[:options_to_remove],
|
219
|
-
})
|
220
|
-
end
|
221
|
-
|
222
|
-
self.api_data = client.update_environment(deploy_args)
|
228
|
+
self.api_data = client.update_environment(_update_args(version_label, opts))
|
223
229
|
|
224
230
|
request_id = events(start_time).select do |e|
|
225
231
|
e.message.match(response_msgs('event.updatestarting'))
|
@@ -228,18 +234,23 @@ module Rebi
|
|
228
234
|
return request_id
|
229
235
|
end
|
230
236
|
|
231
|
-
def deploy
|
237
|
+
def deploy opts={}
|
238
|
+
_run_hooks :pre
|
239
|
+
version_label = create_app_version opts
|
232
240
|
request_id = if created?
|
233
241
|
update version_label, opts
|
234
242
|
else
|
235
243
|
init version_label, opts
|
236
244
|
end
|
245
|
+
log h3("DEPLOYING")
|
246
|
+
_run_hooks :post
|
247
|
+
watch_request request_id
|
237
248
|
return request_id
|
238
249
|
end
|
239
250
|
|
240
251
|
def terminate!
|
241
252
|
check_created
|
242
|
-
log("Start terminating")
|
253
|
+
log h2("Start terminating")
|
243
254
|
client.terminate_environment({
|
244
255
|
environment_name: name,
|
245
256
|
environment_id: id,
|
@@ -252,8 +263,8 @@ module Rebi
|
|
252
263
|
return request_id
|
253
264
|
end
|
254
265
|
|
255
|
-
def
|
256
|
-
|
266
|
+
def log_label
|
267
|
+
name
|
257
268
|
end
|
258
269
|
|
259
270
|
def success_message? mes
|
@@ -280,31 +291,6 @@ module Rebi
|
|
280
291
|
return false
|
281
292
|
end
|
282
293
|
|
283
|
-
def gen_deploy_opts
|
284
|
-
to_deploy = []
|
285
|
-
to_remove = []
|
286
|
-
env_only = []
|
287
|
-
config.opts_array.each do |o|
|
288
|
-
o = o.deep_dup
|
289
|
-
|
290
|
-
if o[:namespace] == config.ns(:app_env)
|
291
|
-
if o[:value].blank?
|
292
|
-
o.delete(:value)
|
293
|
-
to_remove << o
|
294
|
-
next
|
295
|
-
else
|
296
|
-
env_only << o
|
297
|
-
end
|
298
|
-
end
|
299
|
-
to_deploy << o
|
300
|
-
end
|
301
|
-
return {
|
302
|
-
option_settings: to_deploy,
|
303
|
-
options_to_remove: to_remove,
|
304
|
-
env_only: env_only,
|
305
|
-
}
|
306
|
-
end
|
307
|
-
|
308
294
|
def ssh instance_id
|
309
295
|
raise "Invalid instance_id" unless self.instance_ids.include?(instance_id)
|
310
296
|
|
@@ -390,15 +376,96 @@ module Rebi
|
|
390
376
|
end
|
391
377
|
|
392
378
|
# TODO
|
393
|
-
def self.all app_name, client=Rebi.
|
379
|
+
def self.all app_name, client=Rebi.eb
|
394
380
|
client.describe_environments(application_name: app_name,
|
395
381
|
include_deleted: false).environments
|
396
382
|
end
|
397
383
|
|
398
|
-
def self.get stage_name, env_name, client=Rebi.
|
384
|
+
def self.get stage_name, env_name, client=Rebi.eb
|
399
385
|
env = new stage_name, env_name, client
|
400
386
|
return env.created? ? env : nil
|
401
387
|
end
|
402
388
|
|
389
|
+
private
|
390
|
+
|
391
|
+
def _create_args version_label, opts={}
|
392
|
+
args = {
|
393
|
+
application_name: config.app_name,
|
394
|
+
environment_name: config.name,
|
395
|
+
version_label: version_label,
|
396
|
+
tier: config.tier,
|
397
|
+
description: config.description,
|
398
|
+
option_settings: config.opts_array,
|
399
|
+
}
|
400
|
+
|
401
|
+
args.merge!(cname_prefix: config.cname_prefix) if config.cname_prefix
|
402
|
+
|
403
|
+
args.merge!(config.platform_arn ? { platform_arn: config.platform_arn } : { solution_stack_name: config.solution_stack_name })
|
404
|
+
return args
|
405
|
+
end
|
406
|
+
|
407
|
+
def _update_args version_label, opts={}
|
408
|
+
deploy_opts = _gen_deploy_opts
|
409
|
+
|
410
|
+
args = {
|
411
|
+
application_name: config.app_name,
|
412
|
+
environment_name: config.name,
|
413
|
+
description: config.description,
|
414
|
+
}
|
415
|
+
|
416
|
+
args.merge!(version_label: version_label) if version_label
|
417
|
+
|
418
|
+
if opts[:include_settings] || opts[:settings_only]
|
419
|
+
args.merge!({
|
420
|
+
option_settings: deploy_opts[:option_settings],
|
421
|
+
options_to_remove: deploy_opts[:options_to_remove],
|
422
|
+
})
|
423
|
+
args.delete(:version_label) if opts[:settings_only]
|
424
|
+
else
|
425
|
+
args.merge!({
|
426
|
+
option_settings: deploy_opts[:env_only],
|
427
|
+
options_to_remove: deploy_opts[:options_to_remove],
|
428
|
+
})
|
429
|
+
end
|
430
|
+
|
431
|
+
return args
|
432
|
+
end
|
433
|
+
|
434
|
+
def _gen_deploy_opts
|
435
|
+
to_deploy = []
|
436
|
+
to_remove = []
|
437
|
+
env_only = []
|
438
|
+
config.opts_array.each do |o|
|
439
|
+
o = o.deep_dup
|
440
|
+
|
441
|
+
if o[:namespace] == config.ns(:app_env)
|
442
|
+
if o[:value].blank?
|
443
|
+
o.delete(:value)
|
444
|
+
to_remove << o
|
445
|
+
next
|
446
|
+
else
|
447
|
+
env_only << o
|
448
|
+
end
|
449
|
+
end
|
450
|
+
to_deploy << o
|
451
|
+
end
|
452
|
+
return {
|
453
|
+
option_settings: to_deploy,
|
454
|
+
options_to_remove: to_remove,
|
455
|
+
env_only: env_only,
|
456
|
+
}
|
457
|
+
end
|
458
|
+
|
459
|
+
def _run_hooks type
|
460
|
+
if (hooks = config.hooks[type]).present?
|
461
|
+
log h1("RUNNING #{type.upcase} HOOKS")
|
462
|
+
hooks.each do |cmd|
|
463
|
+
log h4(cmd)
|
464
|
+
system "#{cmd} 2>&1"
|
465
|
+
raise "Command failed" unless $?.success?
|
466
|
+
end
|
467
|
+
log h1("#{type.upcase} HOOKS FINISHED!!!")
|
468
|
+
end
|
469
|
+
end
|
403
470
|
end
|
404
471
|
end
|
data/lib/rebi/log.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
module Rebi
|
2
|
+
module Log
|
3
|
+
def log mes, label=self.log_label
|
4
|
+
puts "#{label ? "#{colorize_prefix(label)}: " : ""}#{mes}"
|
5
|
+
end
|
6
|
+
|
7
|
+
def error mes, label=self.error_label
|
8
|
+
puts colorize(label, color: :white, background: :red) + ": " + mes
|
9
|
+
end
|
10
|
+
|
11
|
+
def log_label
|
12
|
+
"Rebi"
|
13
|
+
end
|
14
|
+
|
15
|
+
def error_label
|
16
|
+
"ERROR"
|
17
|
+
end
|
18
|
+
|
19
|
+
def colorize_prefix(prefix)
|
20
|
+
colors = ColorizedString.colors
|
21
|
+
colors.delete :light_black
|
22
|
+
h = prefix.chars.inject(0) do |m, c|
|
23
|
+
m + c.ord
|
24
|
+
end
|
25
|
+
return colorize(prefix, color: colors[h % colors.count], background: :light_black)
|
26
|
+
end
|
27
|
+
|
28
|
+
def h1 s
|
29
|
+
colorize(s, color: :light_yellow, background: :light_blue)
|
30
|
+
end
|
31
|
+
|
32
|
+
def h2 s
|
33
|
+
colorize(s, color: :light_blue, background: :light_cyan)
|
34
|
+
end
|
35
|
+
|
36
|
+
def h3 s
|
37
|
+
colorize(s, color: :light_yellow, background: :light_blue, mode: :bold)
|
38
|
+
end
|
39
|
+
|
40
|
+
def h4 s
|
41
|
+
colorize(s, color: :black, background: :green, mode: :italic)
|
42
|
+
end
|
43
|
+
|
44
|
+
def hstatus s
|
45
|
+
bg = s.downcase.to_sym
|
46
|
+
bg = :light_black unless ColorizedString.colors.include?(bg)
|
47
|
+
colorize(s, color: :black, background: bg, mode: :italic)
|
48
|
+
end
|
49
|
+
|
50
|
+
def colorize mes, opts={}
|
51
|
+
ColorizedString[mes].colorize(opts)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/lib/rebi/version.rb
CHANGED
data/lib/rebi/zip_helper.rb
CHANGED
@@ -1,41 +1,65 @@
|
|
1
1
|
module Rebi
|
2
2
|
class ZipHelper
|
3
3
|
|
4
|
+
include Rebi::Log
|
5
|
+
|
6
|
+
EB_IGNORE = ".ebignore"
|
7
|
+
|
4
8
|
def initialize
|
5
|
-
|
6
|
-
|
9
|
+
# raise Rebi::Error::NoGit.new("Not a git repository") unless git?
|
10
|
+
end
|
11
|
+
|
12
|
+
def git?
|
13
|
+
`git status 2>&1`
|
14
|
+
$?.success?
|
7
15
|
end
|
8
16
|
|
9
17
|
def ls_files
|
10
|
-
`git ls-files`.split("\n")
|
18
|
+
`git ls-files 2>&1`.split("\n")
|
11
19
|
end
|
12
20
|
|
13
21
|
def raw_zip_archive opts={}
|
14
22
|
tmp_file = Tempfile.new("git_archive")
|
15
|
-
|
23
|
+
if !git? || ebignore?
|
24
|
+
Zip::File.open(tmp_file.path, Zip::File::CREATE) do |z|
|
25
|
+
spec = ebignore_spec
|
26
|
+
Dir.glob("**/*").each do |f|
|
27
|
+
next if ebignore_spec.match f
|
28
|
+
if File.directory?(f)
|
29
|
+
z.mkdir f unless z.find_entry f
|
30
|
+
else
|
31
|
+
z.add f, f
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
else
|
36
|
+
commit_id = opts[:staged] ? `git write-tree`.chomp : "HEAD"
|
37
|
+
system "git archive --format=zip #{commit_id} > #{tmp_file.path}"
|
38
|
+
end
|
16
39
|
return tmp_file
|
17
40
|
end
|
18
41
|
|
19
42
|
def version_label
|
20
|
-
`git describe --always --abbrev=8`.chomp
|
43
|
+
git? ? `git describe --always --abbrev=8`.chomp : SecureRandom.hex[0, 8]
|
21
44
|
end
|
22
45
|
|
23
46
|
def message
|
24
|
-
`git log --oneline -1`.chomp.split(" ")[1..-1].join(" ")[0..190]
|
47
|
+
git? ? `git log --oneline -1`.chomp.split(" ")[1..-1].join(" ")[0..190] : "Deploy #{Time.now.strftime("%Y/%m/%d %H:%M")}"
|
25
48
|
end
|
26
49
|
|
27
50
|
# Create zip archivement
|
28
|
-
def gen env_conf
|
29
|
-
|
51
|
+
def gen env_conf,opts={}
|
52
|
+
log("Creating zip archivement", env_conf.name)
|
30
53
|
start = Time.now
|
31
54
|
ebextensions = env_conf.ebextensions
|
32
|
-
|
33
|
-
tmp_file = raw_zip_archive
|
55
|
+
tmp_file = raw_zip_archive opts
|
34
56
|
tmp_folder = Dir.mktmpdir
|
35
|
-
Zip::File.open(tmp_file) do |z|
|
57
|
+
Zip::File.open(tmp_file.path) do |z|
|
36
58
|
ebextensions.each do |ex_folder|
|
59
|
+
|
60
|
+
z.remove_folder ex_folder unless ex_folder == ".ebextension"
|
37
61
|
Dir.glob("#{ex_folder}/*.config") do |fname|
|
38
|
-
next unless
|
62
|
+
next unless File.file?(fname)
|
39
63
|
next unless y = YAML::load(ErbHelper.new(File.read(fname), env_conf).result)
|
40
64
|
basename = File.basename(fname)
|
41
65
|
target = ".ebextensions/#{basename}"
|
@@ -47,9 +71,25 @@ module Rebi
|
|
47
71
|
z.add target, tmp_yaml
|
48
72
|
end
|
49
73
|
end
|
74
|
+
dockerrun_file = env_conf.dockerrun || "Dockerrun.aws.json"
|
75
|
+
|
76
|
+
if File.exists?(dockerrun_file)
|
77
|
+
dockerrun = JSON.parse ErbHelper.new(File.read(dockerrun_file), env_conf).result
|
78
|
+
tmp_dockerrun = "#{tmp_folder}/Dockerrun.aws.json"
|
79
|
+
File.open(tmp_dockerrun, 'w') do |f|
|
80
|
+
f.write dockerrun.to_json
|
81
|
+
end
|
82
|
+
z.remove env_conf.dockerrun if z.find_entry env_conf.dockerrun
|
83
|
+
z.remove "Dockerrun.aws.json" if z.find_entry "Dockerrun.aws.json"
|
84
|
+
z.add "Dockerrun.aws.json", tmp_dockerrun
|
85
|
+
end
|
86
|
+
|
50
87
|
end
|
88
|
+
|
51
89
|
FileUtils.rm_rf tmp_folder
|
52
|
-
|
90
|
+
|
91
|
+
|
92
|
+
log("Zip was created in: #{Time.now - start}s", env_conf.name)
|
53
93
|
return {
|
54
94
|
label: Time.now.strftime("app_#{env_conf.name}_#{version_label}_%Y%m%d_%H%M%S"),
|
55
95
|
file: File.open(tmp_file.path),
|
@@ -57,5 +97,32 @@ module Rebi
|
|
57
97
|
}
|
58
98
|
end
|
59
99
|
|
100
|
+
def ebignore_spec
|
101
|
+
if ebignore?
|
102
|
+
path_spec = PathSpec.from_filename(EB_IGNORE)
|
103
|
+
path_spec.add(".git")
|
104
|
+
return path_spec
|
105
|
+
else
|
106
|
+
return PathSpec.new(".git")
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def ebignore?
|
111
|
+
File.exist?(EB_IGNORE)
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
module Zip
|
118
|
+
class File
|
119
|
+
def remove_folder fname
|
120
|
+
if folder = find_entry(fname)
|
121
|
+
remove folder if folder.directory?
|
122
|
+
end
|
123
|
+
glob("#{fname}/**/*").each do |f|
|
124
|
+
remove f
|
125
|
+
end
|
126
|
+
end
|
60
127
|
end
|
61
128
|
end
|
data/sample/rebi.yml
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
app_name: App_name # Required
|
2
2
|
app_description: Description # Optional
|
3
3
|
|
4
|
+
profile: aws_profile # if use profile config, overwrite with --profile option
|
5
|
+
|
6
|
+
# If use credentials(key, secret)
|
7
|
+
aws_key: aws_key
|
8
|
+
aws_secret: aws_secret
|
9
|
+
|
4
10
|
stages: #Required: Hash
|
5
11
|
development: #Stage name
|
6
12
|
web: # Env name
|
@@ -33,8 +39,13 @@ stages: #Required: Hash
|
|
33
39
|
# Result will has 01.config, 02.config(from web1_extensions) and 03.config
|
34
40
|
cfg_file: File path or cfg name # Optional
|
35
41
|
|
42
|
+
dockerrun: Dockerrun.aws.json.stg # Dockerrun file
|
36
43
|
options: #Hash, Other custom options for using in erb
|
37
44
|
use_basic: true # rebi.opts.use_basic
|
45
|
+
|
46
|
+
hooks:
|
47
|
+
pre: ls # String or Array, run before upload source bundle
|
48
|
+
post: ls # String or Array, run right after sending deploy request
|
38
49
|
worker:
|
39
50
|
# ...
|
40
51
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rebi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2
|
4
|
+
version: 0.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- KhiemNS
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -25,19 +25,61 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name: aws-sdk
|
28
|
+
name: aws-sdk-ec2
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '1.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: aws-sdk-s3
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: aws-sdk-elasticbeanstalk
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
32
67
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
68
|
+
version: '1.0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: aws-sdk-iam
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.0'
|
34
76
|
type: :runtime
|
35
77
|
prerelease: false
|
36
78
|
version_requirements: !ruby/object:Gem::Requirement
|
37
79
|
requirements:
|
38
|
-
- - "
|
80
|
+
- - "~>"
|
39
81
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
82
|
+
version: '1.0'
|
41
83
|
- !ruby/object:Gem::Dependency
|
42
84
|
name: dotenv
|
43
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,6 +150,34 @@ dependencies:
|
|
108
150
|
- - "~>"
|
109
151
|
- !ruby/object:Gem::Version
|
110
152
|
version: '1.3'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: pathspec
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0.2'
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0.2'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: byebug
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '9'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '9'
|
111
181
|
description: Deploy ElasticBeanstalk with multiple deploy, switchable and dynamic
|
112
182
|
generated ebextensions with erb
|
113
183
|
email:
|
@@ -129,7 +199,7 @@ files:
|
|
129
199
|
- lib/rebi/environment.rb
|
130
200
|
- lib/rebi/erb_helper.rb
|
131
201
|
- lib/rebi/error.rb
|
132
|
-
- lib/rebi/
|
202
|
+
- lib/rebi/log.rb
|
133
203
|
- lib/rebi/version.rb
|
134
204
|
- lib/rebi/zip_helper.rb
|
135
205
|
- lib/tasks/rebi.rake
|
data/lib/rebi/iam.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
# module Rebi
|
2
|
-
# class IAM
|
3
|
-
#
|
4
|
-
# attr_reader :client
|
5
|
-
#
|
6
|
-
# def initialize client=Aws::IAM::Client.new
|
7
|
-
# @client = client
|
8
|
-
# end
|
9
|
-
#
|
10
|
-
# def check_or_create_eb_profile profile
|
11
|
-
#
|
12
|
-
# end
|
13
|
-
#
|
14
|
-
# def create_instance_profile profile
|
15
|
-
# clieng.create_instance_profile({
|
16
|
-
# instance_profile_name: profile
|
17
|
-
# })
|
18
|
-
# end
|
19
|
-
#
|
20
|
-
# def get_default_role
|
21
|
-
# role = Rebi::ConfigEnvironment::DEFAULT_IAM_INSTANCE_PROFILE
|
22
|
-
# document = '{"Version": "2008-10-17","Statement": [{"Action":' \
|
23
|
-
# ' "sts:AssumeRole","Principal": {"Service": ' \
|
24
|
-
# '"ec2.amazonaws.com"},"Effect": "Allow","Sid": ""}]}'
|
25
|
-
# client.create_role({
|
26
|
-
# role_name: role,
|
27
|
-
# assume_role_policy_document: document
|
28
|
-
# })
|
29
|
-
# return role
|
30
|
-
# end
|
31
|
-
#
|
32
|
-
# def add_role_to_profile profile, role
|
33
|
-
# client.add_role_to_instance_profile({
|
34
|
-
# instance_profile_name: profile,
|
35
|
-
# role_name: role
|
36
|
-
# })
|
37
|
-
# end
|
38
|
-
#
|
39
|
-
# def log mes
|
40
|
-
# Rebi.log(mes, "IAM")
|
41
|
-
# end
|
42
|
-
# end
|
43
|
-
# end
|