ecs_deployer 0.1.11 → 0.1.12
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +26 -0
- data/README.md +9 -7
- data/Rakefile +3 -3
- data/bin/console +3 -3
- data/ecs_deployer.gemspec +22 -20
- data/example/sample.rb +1 -1
- data/lib/ecs_deployer/client.rb +112 -96
- data/lib/ecs_deployer/version.rb +1 -1
- data/lib/ecs_deployer.rb +2 -1
- metadata +47 -19
- data/.travis.yml +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e60347cf25748e10ebd8fb31c60a16bcb7c744f0
|
4
|
+
data.tar.gz: 70df50d8c38bafe0637bc36baf59dff095faeb92
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 96b2e854dc1c9dbf9a789ceba7e24fc97913fdaed3fdc54f85616e7fe159acaa44e63a9a3211a2961d911e744b7189683f29912fc9a36e859463f50da3aa6d77
|
7
|
+
data.tar.gz: 927248da5b5c2aaee7f92012455155fb6f3a8380ce28ae05b4afac6dc88e81d858b5b336e55296813f4f75bebf80893500c44eb827f24a1fa278bcfd26c73ebe
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
AllCops:
|
2
|
+
Exclude:
|
3
|
+
- 'tmp/**/*'
|
4
|
+
Style/Documentation:
|
5
|
+
Enabled: false
|
6
|
+
Style/ExtraSpacing:
|
7
|
+
Enabled: false
|
8
|
+
Style/FrozenStringLiteralComment:
|
9
|
+
Enabled: false
|
10
|
+
Metrics/AbcSize:
|
11
|
+
Max: 20
|
12
|
+
Metrics/BlockLength:
|
13
|
+
Enabled: false
|
14
|
+
Metrics/ClassLength:
|
15
|
+
Enabled: false
|
16
|
+
Metrics/LineLength:
|
17
|
+
Enabled: false
|
18
|
+
Metrics/MethodLength:
|
19
|
+
CountComments: false
|
20
|
+
Max: 64
|
21
|
+
Metrics/ModuleLength:
|
22
|
+
Enabled: false
|
23
|
+
Security/YAMLLoad:
|
24
|
+
Enabled: false
|
25
|
+
Style/SpaceAroundOperators:
|
26
|
+
Enabled: false
|
data/README.md
CHANGED
@@ -59,9 +59,11 @@ Encrypted values must be enclosed in `${XXX}`.
|
|
59
59
|
|
60
60
|
Values are decrypted when task is created.
|
61
61
|
|
62
|
-
## Usage
|
62
|
+
## Usage
|
63
63
|
|
64
|
-
|
64
|
+
### API
|
65
|
+
|
66
|
+
This sample file is in `spec/fixtures/task.yml`.
|
65
67
|
|
66
68
|
```
|
67
69
|
ecs_deployer = EcsDeployer::Client.new
|
@@ -69,29 +71,29 @@ ecs_deployer.register_task('development.yml')
|
|
69
71
|
ecs_deployer.update_service('cluster', 'development')
|
70
72
|
```
|
71
73
|
|
72
|
-
|
74
|
+
### CLI
|
73
75
|
|
74
|
-
|
76
|
+
#### Register new task
|
75
77
|
|
76
78
|
```
|
77
79
|
$ bundle exec ecs_deployer task-register --path=example/fixtures/task.yml
|
78
80
|
```
|
79
81
|
|
80
|
-
|
82
|
+
#### Encrypt environment value
|
81
83
|
|
82
84
|
```
|
83
85
|
$ bundle exec ecs_deployer encrypt --master-key=master --value='test'
|
84
86
|
Encrypted value: ${xxx}
|
85
87
|
```
|
86
88
|
|
87
|
-
|
89
|
+
#### Decrypt encironment value
|
88
90
|
|
89
91
|
```
|
90
92
|
$ bundle exec ecs_deployer decrypt --value='${xxx}'
|
91
93
|
Decrypted value: xxx
|
92
94
|
```
|
93
95
|
|
94
|
-
|
96
|
+
#### Update service
|
95
97
|
|
96
98
|
```
|
97
99
|
$ bundle exec ecs_deployer update-service --cluster=xxx --service=xxx --wait --timeout=600
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'ecs_deployer'
|
5
5
|
|
6
6
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
7
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -10,5 +10,5 @@ require "ecs_deployer"
|
|
10
10
|
# require "pry"
|
11
11
|
# Pry.start
|
12
12
|
|
13
|
-
require
|
13
|
+
require 'irb'
|
14
14
|
IRB.start(__FILE__)
|
data/ecs_deployer.gemspec
CHANGED
@@ -4,38 +4,40 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
require 'ecs_deployer/version'
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
7
|
+
spec.name = 'ecs_deployer'
|
8
8
|
spec.version = EcsDeployer::VERSION
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
9
|
+
spec.authors = ['naomichi-y']
|
10
|
+
spec.email = ['n.yamakita@gmail.com']
|
11
11
|
|
12
|
-
spec.summary =
|
13
|
-
spec.description =
|
14
|
-
spec.homepage =
|
12
|
+
spec.summary = 'Deploy application to ECS.'
|
13
|
+
spec.description = 'This package provides the service deployment function of ECS.'
|
14
|
+
spec.homepage = 'https://github.com/naomichi-y/ecs_deployer'
|
15
15
|
|
16
16
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
17
17
|
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
18
18
|
if spec.respond_to?(:metadata)
|
19
|
-
# spec.metadata['allowed_push_host'] =
|
19
|
+
# spec.metadata['allowed_push_host'] = ''
|
20
20
|
else
|
21
|
-
raise
|
22
|
-
|
21
|
+
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
22
|
+
'public gem pushes.'
|
23
23
|
end
|
24
24
|
|
25
25
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
26
26
|
f.match(%r{^(test|spec|features)/})
|
27
27
|
end
|
28
|
-
spec.bindir =
|
28
|
+
spec.bindir = 'exe'
|
29
29
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
30
|
-
spec.require_paths = [
|
30
|
+
spec.require_paths = ['lib']
|
31
31
|
|
32
|
-
spec.add_dependency
|
33
|
-
spec.add_dependency
|
34
|
-
spec.add_dependency
|
35
|
-
spec.add_dependency
|
36
|
-
spec.add_dependency
|
37
|
-
spec.
|
38
|
-
spec.add_development_dependency
|
39
|
-
spec.add_development_dependency
|
40
|
-
spec.add_development_dependency
|
32
|
+
spec.add_dependency 'runtime_command'
|
33
|
+
spec.add_dependency 'oj'
|
34
|
+
spec.add_dependency 'thor'
|
35
|
+
spec.add_dependency 'aws-sdk'
|
36
|
+
spec.add_dependency 'aws_config'
|
37
|
+
spec.add_development_dependency 'bundler', '~> 1.13'
|
38
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
39
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
40
|
+
spec.add_development_dependency 'json_spec'
|
41
|
+
spec.add_development_dependency 'rubocop'
|
42
|
+
spec.add_development_dependency 'simplecov'
|
41
43
|
end
|
data/example/sample.rb
CHANGED
data/lib/ecs_deployer/client.rb
CHANGED
@@ -2,9 +2,11 @@ require 'yaml'
|
|
2
2
|
require 'oj'
|
3
3
|
require 'aws-sdk'
|
4
4
|
require 'runtime_command'
|
5
|
+
require 'base64'
|
5
6
|
|
6
7
|
module EcsDeployer
|
7
8
|
class Client
|
9
|
+
LOG_SEPARATOR = '-' * 96
|
8
10
|
PAULING_INTERVAL = 20
|
9
11
|
DEPLOY_TIMEOUT = 600
|
10
12
|
ENCRYPT_PATTERN = /^\${(.+)}$/
|
@@ -25,32 +27,29 @@ module EcsDeployer
|
|
25
27
|
# @param [String] value
|
26
28
|
# @return [String]
|
27
29
|
def encrypt(master_key, value)
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
raise KmsEncryptError.new(e.to_s)
|
33
|
-
end
|
30
|
+
encode = @kms.encrypt(key_id: "alias/#{master_key}", plaintext: value)
|
31
|
+
"${#{Base64.strict_encode64(encode.ciphertext_blob)}}"
|
32
|
+
rescue => e
|
33
|
+
raise KmsEncryptError, e.to_s
|
34
34
|
end
|
35
35
|
|
36
36
|
# @param [String] value
|
37
37
|
# @return [String]
|
38
38
|
def decrypt(value)
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
raise KmsDecryptError.new('Encrypted string is invalid.')
|
39
|
+
match = value.match(ENCRYPT_PATTERN)
|
40
|
+
raise KmsDecryptError, 'Encrypted string is invalid.' unless match
|
41
|
+
|
42
|
+
begin
|
43
|
+
@kms.decrypt(ciphertext_blob: Base64.strict_decode64(match[1])).plaintext
|
44
|
+
rescue => e
|
45
|
+
raise KmsDecryptError, e.to_s
|
47
46
|
end
|
48
47
|
end
|
49
48
|
|
50
49
|
# @param [String] path
|
51
50
|
# @return [String]
|
52
51
|
def register_task(path)
|
53
|
-
raise IOError
|
52
|
+
raise IOError, "File does not exist. [#{path}]" unless File.exist?(path)
|
54
53
|
|
55
54
|
register_task_hash(YAML.load(File.read(path)))
|
56
55
|
end
|
@@ -61,11 +60,11 @@ module EcsDeployer
|
|
61
60
|
task_definition = Oj.load(Oj.dump(task_definition), symbol_keys: true)
|
62
61
|
decrypt_environment_variables!(task_definition)
|
63
62
|
|
64
|
-
result = @cli.register_task_definition(
|
63
|
+
result = @cli.register_task_definition(
|
65
64
|
container_definitions: task_definition[:container_definitions],
|
66
65
|
family: task_definition[:family],
|
67
66
|
task_role_arn: task_definition[:task_role_arn]
|
68
|
-
|
67
|
+
)
|
69
68
|
|
70
69
|
@family = result[:task_definition][:family]
|
71
70
|
@revision = result[:task_definition][:revision]
|
@@ -78,23 +77,23 @@ module EcsDeployer
|
|
78
77
|
def register_clone_task(cluster, service)
|
79
78
|
detected_service = false
|
80
79
|
|
81
|
-
result = @cli.describe_services(
|
80
|
+
result = @cli.describe_services(
|
82
81
|
cluster: cluster,
|
83
82
|
services: [service]
|
84
|
-
|
83
|
+
)
|
85
84
|
|
86
85
|
result[:services].each do |svc|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
86
|
+
next unless svc[:service_name] == service
|
87
|
+
|
88
|
+
result = @cli.describe_task_definition(
|
89
|
+
task_definition: svc[:task_definition]
|
90
|
+
)
|
91
|
+
@new_task_definition_arn = register_task_hash(result[:task_definition].to_hash)
|
92
|
+
detected_service = true
|
93
|
+
break
|
95
94
|
end
|
96
95
|
|
97
|
-
raise ServiceNotFoundError
|
96
|
+
raise ServiceNotFoundError, "'#{service}' service is not found." unless detected_service
|
98
97
|
|
99
98
|
@new_task_definition_arn
|
100
99
|
end
|
@@ -106,101 +105,118 @@ module EcsDeployer
|
|
106
105
|
def update_service(cluster, service, wait = true, timeout = DEPLOY_TIMEOUT)
|
107
106
|
register_clone_task(cluster, service) if @new_task_definition_arn.nil?
|
108
107
|
|
109
|
-
result = @cli.update_service(
|
108
|
+
result = @cli.update_service(
|
110
109
|
cluster: cluster,
|
111
110
|
service: service,
|
112
111
|
task_definition: @family + ':' + @revision.to_s
|
113
|
-
|
112
|
+
)
|
114
113
|
wait_for_deploy(cluster, service, timeout) if wait
|
115
114
|
result.service.service_arn
|
116
115
|
end
|
117
116
|
|
118
117
|
private
|
118
|
+
|
119
119
|
# @param [Hash] task_definition
|
120
120
|
def decrypt_environment_variables!(task_definition)
|
121
|
-
raise TaskDefinitionValidateError
|
121
|
+
raise TaskDefinitionValidateError, '\'container_definition\' is undefined.' unless task_definition.key?(:container_definitions)
|
122
122
|
task_definition[:container_definitions].each do |container_definition|
|
123
|
-
next unless container_definition.
|
123
|
+
next unless container_definition.key?(:environment)
|
124
124
|
|
125
125
|
container_definition[:environment].each do |environment|
|
126
|
-
|
127
|
-
|
128
|
-
end
|
126
|
+
match = environment[:value].match(ENCRYPT_PATTERN)
|
127
|
+
environment[:value] = decrypt(match[0]) if match
|
129
128
|
end
|
130
129
|
end
|
131
130
|
end
|
132
131
|
|
133
132
|
# @param [String] cluster
|
134
133
|
# @param [String] service
|
135
|
-
# @
|
136
|
-
def
|
137
|
-
|
138
|
-
|
139
|
-
result = @cli.describe_services({
|
134
|
+
# @return [Aws::ECS::Types::Service]
|
135
|
+
def service_status(cluster, service)
|
136
|
+
status = nil
|
137
|
+
result = @cli.describe_services(
|
140
138
|
cluster: cluster,
|
141
139
|
services: [service]
|
142
|
-
|
140
|
+
)
|
143
141
|
result[:services].each do |svc|
|
144
142
|
next unless svc[:service_name] == service
|
145
|
-
|
143
|
+
status = svc
|
144
|
+
break
|
145
|
+
end
|
146
146
|
|
147
|
-
|
148
|
-
task_definition: svc[:task_definition]
|
149
|
-
})
|
150
|
-
|
151
|
-
if svc[:desired_count] > 0
|
152
|
-
running_new_task = false
|
153
|
-
wait_time = 0
|
154
|
-
@command.puts 'Start deploing...'
|
155
|
-
|
156
|
-
begin
|
157
|
-
sleep(PAULING_INTERVAL)
|
158
|
-
wait_time += PAULING_INTERVAL
|
159
|
-
|
160
|
-
# Get current tasks
|
161
|
-
result = @cli.list_tasks({
|
162
|
-
cluster: cluster,
|
163
|
-
service_name: service,
|
164
|
-
desired_status: 'RUNNING'
|
165
|
-
})
|
166
|
-
|
167
|
-
raise TaskNotFoundError.new('Desired count is 0.') if result[:task_arns].size == 0
|
168
|
-
|
169
|
-
new_running_count = 0
|
170
|
-
result = @cli.describe_tasks({
|
171
|
-
tasks: result[:task_arns],
|
172
|
-
cluster: cluster
|
173
|
-
})
|
174
|
-
|
175
|
-
result[:tasks].each do |task|
|
176
|
-
new_running_count += 1 if @new_task_definition_arn == task[:task_definition_arn]
|
177
|
-
end
|
178
|
-
|
179
|
-
current_running_count = result[:tasks].size
|
180
|
-
|
181
|
-
if current_running_count == new_running_count
|
182
|
-
@command.puts "Service update succeeded. [#{new_running_count}/#{current_running_count}]"
|
183
|
-
@command.puts "New task definition: #{@new_task_definition_arn}"
|
184
|
-
|
185
|
-
running_new_task = true
|
186
|
-
|
187
|
-
else
|
188
|
-
@command.puts "Deploying... [#{new_running_count}/#{current_running_count}] (#{wait_time} seconds elapsed)"
|
189
|
-
@command.puts "New task: #{@new_task_definition_arn}"
|
190
|
-
@command.puts 'You can stop process with Ctrl+C. Deployment will continue.'
|
191
|
-
|
192
|
-
if wait_time > timeout
|
193
|
-
@command.puts "New task definition: #{@new_task_definition_arn}"
|
194
|
-
raise DeployTimeoutError.new('Service is being updating, but process is timed out.')
|
195
|
-
end
|
196
|
-
end
|
197
|
-
end while !running_new_task
|
198
|
-
end
|
147
|
+
raise ServiceNotFoundError, "'#{service}' service is not found." if status.nil?
|
199
148
|
|
200
|
-
|
149
|
+
status
|
150
|
+
end
|
151
|
+
|
152
|
+
# @param [String] cluster
|
153
|
+
# @param [String] service
|
154
|
+
# @return [Hash]
|
155
|
+
def deploy_status(cluster, service)
|
156
|
+
# Get current tasks
|
157
|
+
result = @cli.list_tasks(
|
158
|
+
cluster: cluster,
|
159
|
+
service_name: service,
|
160
|
+
desired_status: 'RUNNING'
|
161
|
+
)
|
162
|
+
|
163
|
+
raise TaskRunningError, 'Running task not found.' if result[:task_arns].size.zero?
|
164
|
+
|
165
|
+
result = @cli.describe_tasks(
|
166
|
+
cluster: cluster,
|
167
|
+
tasks: result[:task_arns]
|
168
|
+
)
|
169
|
+
|
170
|
+
new_running_count = 0
|
171
|
+
task_status_logs = ''
|
172
|
+
|
173
|
+
result[:tasks].each do |task|
|
174
|
+
new_running_count += 1 if @new_task_definition_arn == task[:task_definition_arn]
|
175
|
+
task_status_logs << " #{task[:task_definition_arn]} [#{task[:last_status]}]\n"
|
201
176
|
end
|
202
177
|
|
203
|
-
|
178
|
+
{
|
179
|
+
current_running_count: result[:tasks].size,
|
180
|
+
new_running_count: new_running_count,
|
181
|
+
task_status_logs: task_status_logs
|
182
|
+
}
|
183
|
+
end
|
184
|
+
|
185
|
+
# @param [String] cluster
|
186
|
+
# @param [String] service
|
187
|
+
# @param [Fixnum] timeout
|
188
|
+
def wait_for_deploy(cluster, service, timeout)
|
189
|
+
service_status = service_status(cluster, service)
|
190
|
+
raise TaskDesiredError, 'Task desired by service is 0.' if service_status[:desired_count].zero?
|
191
|
+
|
192
|
+
wait_time = 0
|
193
|
+
@command.puts 'Start deploing...'
|
194
|
+
|
195
|
+
loop do
|
196
|
+
sleep(PAULING_INTERVAL)
|
197
|
+
wait_time += PAULING_INTERVAL
|
198
|
+
result = deploy_status(cluster, service)
|
199
|
+
|
200
|
+
if result[:new_running_count] == result[:current_running_count]
|
201
|
+
@command.puts "Service update succeeded. [#{result[:new_running_count]}/#{result[:current_running_count]}]"
|
202
|
+
@command.puts "New task definition: #{@new_task_definition_arn}"
|
203
|
+
|
204
|
+
break
|
205
|
+
|
206
|
+
else
|
207
|
+
@command.puts "Deploying... [#{result[:new_running_count]}/#{result[:current_running_count]}] (#{wait_time} seconds elapsed)"
|
208
|
+
@command.puts "New task: #{@new_task_definition_arn}"
|
209
|
+
@command.puts LOG_SEPARATOR
|
210
|
+
@command.puts result[:task_status_logs]
|
211
|
+
@command.puts LOG_SEPARATOR
|
212
|
+
@command.puts 'You can stop process with Ctrl+C. Deployment will continue.'
|
213
|
+
|
214
|
+
if wait_time > timeout
|
215
|
+
@command.puts "New task definition: #{@new_task_definition_arn}"
|
216
|
+
raise DeployTimeoutError, 'Service is being updating, but process is timed out.'
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
204
220
|
end
|
205
221
|
end
|
206
222
|
end
|
data/lib/ecs_deployer/version.rb
CHANGED
data/lib/ecs_deployer.rb
CHANGED
@@ -5,8 +5,9 @@ require 'ecs_deployer/cli'
|
|
5
5
|
|
6
6
|
module EcsDeployer
|
7
7
|
class ServiceNotFoundError < EcsDeployer::Error; end
|
8
|
-
class
|
8
|
+
class TaskRunningError < EcsDeployer::Error; end
|
9
9
|
class TaskDefinitionValidateError < EcsDeployer::Error; end
|
10
|
+
class TaskDesiredError < EcsDeployer::Error; end
|
10
11
|
class KmsEncryptError < EcsDeployer::Error; end
|
11
12
|
class KmsDecryptError < EcsDeployer::Error; end
|
12
13
|
class DeployTimeoutError < EcsDeployer::Error; end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ecs_deployer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- naomichi-y
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-03-
|
11
|
+
date: 2017-03-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: runtime_command
|
@@ -80,34 +80,20 @@ dependencies:
|
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: json_spec
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :runtime
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
83
|
- !ruby/object:Gem::Dependency
|
98
84
|
name: bundler
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
100
86
|
requirements:
|
101
87
|
- - "~>"
|
102
88
|
- !ruby/object:Gem::Version
|
103
|
-
version: '1.
|
89
|
+
version: '1.13'
|
104
90
|
type: :development
|
105
91
|
prerelease: false
|
106
92
|
version_requirements: !ruby/object:Gem::Requirement
|
107
93
|
requirements:
|
108
94
|
- - "~>"
|
109
95
|
- !ruby/object:Gem::Version
|
110
|
-
version: '1.
|
96
|
+
version: '1.13'
|
111
97
|
- !ruby/object:Gem::Dependency
|
112
98
|
name: rake
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -136,6 +122,48 @@ dependencies:
|
|
136
122
|
- - "~>"
|
137
123
|
- !ruby/object:Gem::Version
|
138
124
|
version: '3.0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: json_spec
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rubocop
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: simplecov
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
139
167
|
description: This package provides the service deployment function of ECS.
|
140
168
|
email:
|
141
169
|
- n.yamakita@gmail.com
|
@@ -146,7 +174,7 @@ extra_rdoc_files: []
|
|
146
174
|
files:
|
147
175
|
- ".gitignore"
|
148
176
|
- ".rspec"
|
149
|
-
- ".
|
177
|
+
- ".rubocop.yml"
|
150
178
|
- Gemfile
|
151
179
|
- README.md
|
152
180
|
- Rakefile
|