ecs_deployer 1.0.12 → 2.0.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.
- 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
|