ecs_deployer 1.0.12 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/example/sample.rb +3 -3
- data/lib/ecs_deployer.rb +0 -1
- data/lib/ecs_deployer/client.rb +35 -46
- data/lib/ecs_deployer/version.rb +1 -1
- 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: 7c04f404f3247f1b7908c78f61d4a5139dd7a765
|
4
|
+
data.tar.gz: cc5867745048b07123f8f556e21c5ebd2f06e394
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 37a8a063edc9c3639a5fe6b8979628c676b44fe8954809da4557441a329fe256ba44e8734dd51cf4e0fc2661612e984ea99e8f2a047273b5c2463c2c80248eeb
|
7
|
+
data.tar.gz: 8f28ca6748a8a2783af87032ed03194dbe264374f23a37cf77bbf5abef461da15fd11127e81c7cf45144a487573fa7d51351d51528572473324b1681bde05a46
|
data/example/sample.rb
CHANGED
@@ -3,6 +3,6 @@ require 'ecs_deployer'
|
|
3
3
|
|
4
4
|
path = File.expand_path('../spec/fixtures/task.yml', File.dirname(File.realpath(__FILE__)))
|
5
5
|
|
6
|
-
deployer = EcsDeployer::Client.new
|
7
|
-
deployer.register_task(path, tag: 'latest')
|
8
|
-
|
6
|
+
deployer = EcsDeployer::Client.new('sandbox')
|
7
|
+
task_definition = deployer.register_task(path, tag: 'latest')
|
8
|
+
deployer.update_service('production', task_definition)
|
data/lib/ecs_deployer.rb
CHANGED
@@ -7,7 +7,6 @@ module EcsDeployer
|
|
7
7
|
class ServiceNotFoundError < EcsDeployer::Error; end
|
8
8
|
class TaskRunningError < EcsDeployer::Error; end
|
9
9
|
class TaskDefinitionValidateError < EcsDeployer::Error; end
|
10
|
-
class TaskDesiredError < EcsDeployer::Error; end
|
11
10
|
class TaskStoppedError < EcsDeployer::Error; end
|
12
11
|
class KmsEncryptError < EcsDeployer::Error; end
|
13
12
|
class KmsDecryptError < EcsDeployer::Error; end
|
data/lib/ecs_deployer/client.rb
CHANGED
@@ -10,15 +10,17 @@ module EcsDeployer
|
|
10
10
|
ENCRYPT_PATTERN = /^\${(.+)}$/
|
11
11
|
|
12
12
|
attr_reader :ecs
|
13
|
-
attr_accessor :
|
13
|
+
attr_accessor :wait_timeout, :pauling_interval
|
14
14
|
|
15
|
+
# @param [String] cluster
|
15
16
|
# @param [Logger] logger
|
16
17
|
# @return [EcsDeployer::Client]
|
17
|
-
def initialize(logger = nil, aws_options = {})
|
18
|
+
def initialize(cluster, logger = nil, aws_options = {})
|
19
|
+
@cluster = cluster
|
18
20
|
@logger = logger.nil? ? Logger.new(STDOUT) : logger
|
19
21
|
@ecs = Aws::ECS::Client.new(aws_options)
|
20
22
|
@kms = Aws::KMS::Client.new(aws_options)
|
21
|
-
@
|
23
|
+
@wait_timeout = 900
|
22
24
|
@pauling_interval = 20
|
23
25
|
end
|
24
26
|
|
@@ -56,7 +58,7 @@ module EcsDeployer
|
|
56
58
|
|
57
59
|
# @param [Hash] task_definition
|
58
60
|
# @param [Hash] replace_variables
|
59
|
-
# @return [
|
61
|
+
# @return [Aws::ECS::Types::TaskDefinition]
|
60
62
|
def register_task_hash(task_definition, replace_variables = {})
|
61
63
|
task_definition = Oj.load(Oj.dump(task_definition), symbol_keys: true)
|
62
64
|
|
@@ -70,19 +72,14 @@ module EcsDeployer
|
|
70
72
|
volumes: task_definition[:volumes]
|
71
73
|
)
|
72
74
|
|
73
|
-
|
74
|
-
@revision = result[:task_definition][:revision]
|
75
|
-
@new_task_definition_arn = result[:task_definition][:task_definition_arn]
|
75
|
+
result[:task_definition]
|
76
76
|
end
|
77
77
|
|
78
|
-
# @param [String] cluster
|
79
78
|
# @param [String] service
|
80
79
|
# @return [String]
|
81
|
-
def register_clone_task(
|
82
|
-
detected_service = false
|
83
|
-
|
80
|
+
def register_clone_task(service)
|
84
81
|
result = @ecs.describe_services(
|
85
|
-
cluster: cluster,
|
82
|
+
cluster: @cluster,
|
86
83
|
services: [service]
|
87
84
|
)
|
88
85
|
|
@@ -92,28 +89,25 @@ module EcsDeployer
|
|
92
89
|
result = @ecs.describe_task_definition(
|
93
90
|
task_definition: svc[:task_definition]
|
94
91
|
)
|
95
|
-
@new_task_definition_arn = register_task_hash(result[:task_definition].to_hash)
|
96
|
-
detected_service = true
|
97
|
-
break
|
98
|
-
end
|
99
92
|
|
100
|
-
|
93
|
+
return register_task_hash(result[:task_definition].to_hash)
|
94
|
+
end
|
101
95
|
|
102
|
-
|
96
|
+
raise ServiceNotFoundError, "'#{service}' service is not found."
|
103
97
|
end
|
104
98
|
|
105
|
-
# @param [String] cluster
|
106
99
|
# @param [String] service
|
100
|
+
# @param [Aws::ECS::Types::TaskDefinition] task_definition
|
107
101
|
# @return [String]
|
108
|
-
def update_service(
|
109
|
-
register_clone_task(
|
102
|
+
def update_service(service, task_definition = nil, wait = true)
|
103
|
+
task_definition = register_clone_task(service) if task_definition.nil?
|
110
104
|
result = @ecs.update_service(
|
111
|
-
cluster: cluster,
|
105
|
+
cluster: @cluster,
|
112
106
|
service: service,
|
113
|
-
task_definition:
|
107
|
+
task_definition: task_definition[:family] + ':' + task_definition[:revision].to_s
|
114
108
|
)
|
115
109
|
|
116
|
-
wait_for_deploy(
|
110
|
+
wait_for_deploy(service, result.service.task_definition) if wait
|
117
111
|
result.service.service_arn
|
118
112
|
end
|
119
113
|
|
@@ -151,13 +145,12 @@ module EcsDeployer
|
|
151
145
|
end
|
152
146
|
end
|
153
147
|
|
154
|
-
# @param [String] cluster
|
155
148
|
# @param [String] service
|
156
149
|
# @return [Aws::ECS::Types::Service]
|
157
|
-
def service_status(
|
150
|
+
def service_status(service)
|
158
151
|
status = nil
|
159
152
|
result = @ecs.describe_services(
|
160
|
-
cluster: cluster,
|
153
|
+
cluster: @cluster,
|
161
154
|
services: [service]
|
162
155
|
)
|
163
156
|
result[:services].each do |svc|
|
@@ -171,12 +164,11 @@ module EcsDeployer
|
|
171
164
|
status
|
172
165
|
end
|
173
166
|
|
174
|
-
# @param [String] cluster
|
175
167
|
# @param [String] service
|
176
168
|
# @param [String] task_definition_arn
|
177
|
-
def detect_stopped_task(
|
169
|
+
def detect_stopped_task(service, task_definition_arn)
|
178
170
|
stopped_tasks = @ecs.list_tasks(
|
179
|
-
cluster: cluster,
|
171
|
+
cluster: @cluster,
|
180
172
|
service_name: service,
|
181
173
|
desired_status: 'STOPPED'
|
182
174
|
).task_arns
|
@@ -184,7 +176,7 @@ module EcsDeployer
|
|
184
176
|
return if stopped_tasks.size.zero?
|
185
177
|
|
186
178
|
description_tasks = @ecs.describe_tasks(
|
187
|
-
cluster: cluster,
|
179
|
+
cluster: @cluster,
|
188
180
|
tasks: stopped_tasks
|
189
181
|
).tasks
|
190
182
|
|
@@ -193,16 +185,15 @@ module EcsDeployer
|
|
193
185
|
end
|
194
186
|
end
|
195
187
|
|
196
|
-
# @param [String] cluster
|
197
188
|
# @param [String] service
|
198
189
|
# @param [String] task_definition_arn
|
199
190
|
# @return [Hash]
|
200
|
-
def deploy_status(
|
201
|
-
detect_stopped_task(
|
191
|
+
def deploy_status(service, task_definition_arn)
|
192
|
+
detect_stopped_task(service, task_definition_arn)
|
202
193
|
|
203
194
|
# Get current tasks
|
204
195
|
result = @ecs.list_tasks(
|
205
|
-
cluster: cluster,
|
196
|
+
cluster: @cluster,
|
206
197
|
service_name: service,
|
207
198
|
desired_status: 'RUNNING'
|
208
199
|
)
|
@@ -210,7 +201,7 @@ module EcsDeployer
|
|
210
201
|
raise TaskRunningError, 'Running task not found.' if result[:task_arns].size.zero?
|
211
202
|
|
212
203
|
result = @ecs.describe_tasks(
|
213
|
-
cluster: cluster,
|
204
|
+
cluster: @cluster,
|
214
205
|
tasks: result[:task_arns]
|
215
206
|
)
|
216
207
|
|
@@ -218,7 +209,7 @@ module EcsDeployer
|
|
218
209
|
task_status_logs = []
|
219
210
|
|
220
211
|
result[:tasks].each do |task|
|
221
|
-
new_running_count += 1 if
|
212
|
+
new_running_count += 1 if task_definition_arn == task[:task_definition_arn] && task[:last_status] == 'RUNNING'
|
222
213
|
task_status_logs << " #{task[:task_definition_arn]} [#{task[:last_status]}]"
|
223
214
|
end
|
224
215
|
|
@@ -229,12 +220,10 @@ module EcsDeployer
|
|
229
220
|
}
|
230
221
|
end
|
231
222
|
|
232
|
-
# @param [String] cluster
|
233
223
|
# @param [String] service
|
234
224
|
# @param [String] task_definition_arn
|
235
|
-
def wait_for_deploy(
|
236
|
-
service_status = service_status(
|
237
|
-
raise TaskDesiredError, 'Task desired by service is 0.' if service_status[:desired_count].zero?
|
225
|
+
def wait_for_deploy(service, task_definition_arn)
|
226
|
+
service_status = service_status(service)
|
238
227
|
|
239
228
|
wait_time = 0
|
240
229
|
@logger.info 'Start deploying...'
|
@@ -242,10 +231,10 @@ module EcsDeployer
|
|
242
231
|
loop do
|
243
232
|
sleep(@pauling_interval)
|
244
233
|
wait_time += @pauling_interval
|
245
|
-
result = deploy_status(
|
234
|
+
result = deploy_status(service, task_definition_arn)
|
246
235
|
|
247
236
|
@logger.info "Deploying... [#{result[:new_running_count]}/#{result[:current_running_count]}] (#{wait_time} seconds elapsed)"
|
248
|
-
@logger.info "New task: #{
|
237
|
+
@logger.info "New task: #{task_definition_arn}"
|
249
238
|
@logger.info LOG_SEPARATOR
|
250
239
|
|
251
240
|
result[:task_status_logs].each do |log|
|
@@ -256,14 +245,14 @@ module EcsDeployer
|
|
256
245
|
|
257
246
|
if result[:new_running_count] == result[:current_running_count]
|
258
247
|
@logger.info "Service update succeeded. [#{result[:new_running_count]}/#{result[:current_running_count]}]"
|
259
|
-
@logger.info "New task definition: #{
|
248
|
+
@logger.info "New task definition: #{task_definition_arn}"
|
260
249
|
|
261
250
|
break
|
262
251
|
else
|
263
252
|
@logger.info 'You can stop process with Ctrl+C. Deployment will continue.'
|
264
253
|
|
265
|
-
if wait_time > @
|
266
|
-
@logger.info "New task definition: #{
|
254
|
+
if wait_time > @wait_timeout
|
255
|
+
@logger.info "New task definition: #{task_definition_arn}"
|
267
256
|
raise DeployTimeoutError, 'Service is being updating, but process is timed out.'
|
268
257
|
end
|
269
258
|
end
|
data/lib/ecs_deployer/version.rb
CHANGED
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:
|
4
|
+
version: 2.0.0
|
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-
|
11
|
+
date: 2017-10-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oj
|