hako 0.7.4 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e9a7759d62912ccf9f7b41c2497aaa3642eeee80
4
- data.tar.gz: a6498a17bcf8f155d4df71263fb3493302f01f23
3
+ metadata.gz: 09a67f10cb41c44240b92e06db1fe5f13184e78a
4
+ data.tar.gz: 12debcaa9ddb9719d8b41ce5fb0511957918dcd9
5
5
  SHA512:
6
- metadata.gz: 67ae0a234cd5c4ea4c2b19eaf3ae876ce4de21c6f8003100f9a97586f242bef2bd87bf695217ddea022dc4d6b977c8996c322e84a4b6f12ba6c2bc4fa059cfe7
7
- data.tar.gz: 22bc8c6fccf5d3120ae6d9a4956eb38372d88efce844fc68c7f69b6b3724eea06a39225f50a9e47d5ad4b28802d119b50565b76ca2e80d2a0444bbd41a26fca9
6
+ metadata.gz: 94cc6eba550cde280f0e4f234d6dc4f9147e7a2fd7677edc25e7febd640688f462e127e103dc7139eb582b4a88bae8a87cf4c254f39c808db3ccdce99489e3da
7
+ data.tar.gz: 178293b2984bf77e788f07793a748c5688e1b2dcc7570d9614662cbcb0664b8c7e44bd629794872bdbcdf33f10a1aeb76da13eff41c76b8545b06b97455f8e7c
@@ -7,7 +7,9 @@ module Hako
7
7
  @logger ||=
8
8
  begin
9
9
  $stdout.sync = true
10
- Logger.new($stdout)
10
+ Logger.new($stdout).tap do |l|
11
+ l.level = Logger::INFO
12
+ end
11
13
  end
12
14
  end
13
15
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ require 'hako'
2
3
  require 'thor'
3
4
 
4
5
  module Hako
@@ -7,18 +8,31 @@ module Hako
7
8
  option :force, aliases: %w[-f], type: :boolean, default: false, desc: 'Run deployment even if nothing is changed'
8
9
  option :tag, aliases: %w[-t], type: :string, default: 'latest', desc: 'Specify tag (default: latest)'
9
10
  option :dry_run, aliases: %w[-n], type: :boolean, default: false, desc: 'Enable dry-run mode'
11
+ option :verbose, aliases: %w[-v], type: :boolean, default: false, desc: 'Enable verbose logging'
10
12
  def deploy(yaml_path)
11
13
  require 'hako/application'
12
14
  require 'hako/commander'
15
+
16
+ if options[:verbose]
17
+ Hako.logger.level = Logger::DEBUG
18
+ end
19
+
13
20
  Commander.new(Application.new(yaml_path)).deploy(force: options[:force], tag: options[:tag], dry_run: options[:dry_run])
14
21
  end
15
22
 
16
23
  desc 'oneshot FILE COMMAND ARG...', 'Run oneshot task'
17
24
  option :tag, aliases: %w[-t], type: :string, default: 'latest', desc: 'Specify tag (default: latest)'
25
+ option :containers, aliases: %w[-c], type: :string, default: '', banner: 'NAME1,NAME2', desc: 'Comma-separated additional container names to start with the app container (default: "")'
26
+ option :verbose, aliases: %w[-v], type: :boolean, default: false, desc: 'Enable verbose logging'
18
27
  def oneshot(yaml_path, command, *args)
19
28
  require 'hako/application'
20
29
  require 'hako/commander'
21
- Commander.new(Application.new(yaml_path)).oneshot([command, *args], tag: options[:tag])
30
+
31
+ if options[:verbose]
32
+ Hako.logger.level = Logger::DEBUG
33
+ end
34
+
35
+ Commander.new(Application.new(yaml_path)).oneshot([command, *args], tag: options[:tag], containers: options[:containers].split(','))
22
36
  end
23
37
 
24
38
  desc 'show-yaml FILE', 'Show expanded YAML'
@@ -40,5 +54,15 @@ module Hako
40
54
  require 'hako/commander'
41
55
  Commander.new(Application.new(yaml_path)).remove
42
56
  end
57
+
58
+ desc 'version', 'Show version'
59
+ option :numeric, type: :boolean, default: false, desc: 'Show numeric only'
60
+ def version
61
+ if options[:numeric]
62
+ say VERSION
63
+ else
64
+ say "hako v#{VERSION}"
65
+ end
66
+ end
43
67
  end
44
68
  end
@@ -24,10 +24,10 @@ module Hako
24
24
  scripts.each { |script| script.after_deploy(containers) }
25
25
  end
26
26
 
27
- def oneshot(commands, tag: 'latest')
28
- app = AppContainer.new(@app, @app.yaml['app'].merge('tag' => tag), dry_run: false)
27
+ def oneshot(commands, tag:, containers:)
28
+ containers = load_containers(tag, dry_run: false, with: containers)
29
29
  scheduler = load_scheduler(@app.yaml['scheduler'])
30
- exit scheduler.oneshot(app, commands)
30
+ exit scheduler.oneshot(containers, commands)
31
31
  end
32
32
 
33
33
  def status
@@ -42,7 +42,7 @@ module Hako
42
42
 
43
43
  private
44
44
 
45
- def load_containers(tag, dry_run:)
45
+ def load_containers(tag, dry_run:, with: nil)
46
46
  app = AppContainer.new(@app, @app.yaml['app'].merge('tag' => tag), dry_run: dry_run)
47
47
  front = load_front(@app.yaml['front'], dry_run: dry_run)
48
48
 
@@ -50,6 +50,14 @@ module Hako
50
50
  @app.yaml.fetch('additional_containers', {}).each do |name, container|
51
51
  containers[name] = Container.new(@app, container, dry_run: dry_run)
52
52
  end
53
+ if with
54
+ keys = ['app'] + with
55
+ containers.keys.each do |key|
56
+ unless keys.include?(key)
57
+ containers.delete(key)
58
+ end
59
+ end
60
+ end
53
61
  containers
54
62
  end
55
63
 
@@ -42,7 +42,7 @@ module Hako
42
42
  else
43
43
  Hako.logger.info "Registered task definition: #{task_definition.task_definition_arn}"
44
44
  upload_front_config(@app_id, front, app.port)
45
- Hako.logger.info "Uploaded front configuration to s3://#{front.s3.bucket}/#{front.s3.key(@app_id)}"
45
+ Hako.logger.debug "Uploaded front configuration to s3://#{front.s3.bucket}/#{front.s3.key(@app_id)}"
46
46
  end
47
47
  service = create_or_update_service(task_definition.task_definition_arn, front_port)
48
48
  if service == :noop
@@ -55,10 +55,19 @@ module Hako
55
55
  end
56
56
  end
57
57
 
58
- def oneshot(app, commands)
59
- task_definition = register_task_definition_for_oneshot(app)
60
- Hako.logger.info "Registered task definition: #{task_definition.task_definition_arn}"
61
- task = run_task(task_definition, app.env, commands)
58
+ def oneshot(containers, commands)
59
+ definitions = create_definitions(containers, -1)
60
+ definitions.each do |definition|
61
+ definition.delete(:essential)
62
+ end
63
+ task_definition = register_task_definition_for_oneshot(definitions)
64
+ if task_definition == :noop
65
+ Hako.logger.info "Task definition isn't changed"
66
+ task_definition = @ecs.describe_task_definition(task_definition: "#{@app_id}-oneshot").task_definition
67
+ else
68
+ Hako.logger.info "Registered task definition: #{task_definition.task_definition_arn}"
69
+ end
70
+ task = run_task(task_definition, commands)
62
71
  Hako.logger.info "Started task: #{task.task_arn}"
63
72
  exit_code = wait_for_task(task)
64
73
  Hako.logger.info 'Oneshot task finished'
@@ -152,24 +161,28 @@ module Hako
152
161
  if service
153
162
  find_front_port(service)
154
163
  else
155
- max_port = -1
156
- @ecs.list_services(cluster: @cluster).each do |page|
157
- unless page.service_arns.empty?
158
- @ecs.describe_services(cluster: @cluster, services: page.service_arns).services.each do |s|
159
- if s.status != 'INACTIVE'
160
- port = find_front_port(s)
161
- if port
162
- max_port = [max_port, port].max
163
- end
164
+ new_front_port
165
+ end
166
+ end
167
+
168
+ def new_front_port
169
+ max_port = -1
170
+ @ecs.list_services(cluster: @cluster).each do |page|
171
+ unless page.service_arns.empty?
172
+ @ecs.describe_services(cluster: @cluster, services: page.service_arns).services.each do |s|
173
+ if s.status != 'INACTIVE'
174
+ port = find_front_port(s)
175
+ if port
176
+ max_port = [max_port, port].max
164
177
  end
165
178
  end
166
179
  end
167
180
  end
168
- if max_port == -1
169
- DEFAULT_FRONT_PORT
170
- else
171
- max_port + 1
172
- end
181
+ end
182
+ if max_port == -1
183
+ DEFAULT_FRONT_PORT
184
+ else
185
+ max_port + 1
173
186
  end
174
187
  end
175
188
 
@@ -184,11 +197,11 @@ module Hako
184
197
  end
185
198
  end
186
199
 
187
- def task_definition_changed?(definitions)
200
+ def task_definition_changed?(family, definitions)
188
201
  if @force
189
202
  return true
190
203
  end
191
- task_definition = @ecs.describe_task_definition(task_definition: @app_id).task_definition
204
+ task_definition = @ecs.describe_task_definition(task_definition: family).task_definition
192
205
  container_definitions = {}
193
206
  task_definition.container_definitions.each do |c|
194
207
  container_definitions[c.name] = c
@@ -207,7 +220,7 @@ module Hako
207
220
  end
208
221
 
209
222
  def register_task_definition(definitions)
210
- if task_definition_changed?(definitions)
223
+ if task_definition_changed?(@app_id, definitions)
211
224
  @ecs.register_task_definition(
212
225
  family: @app_id,
213
226
  container_definitions: definitions,
@@ -228,21 +241,16 @@ module Hako
228
241
  end
229
242
  end
230
243
 
231
- def register_task_definition_for_oneshot(app)
232
- @ecs.register_task_definition(
233
- family: "#{@app_id}-oneshot",
234
- container_definitions: [
235
- {
236
- name: 'oneshot',
237
- image: app.image_tag,
238
- cpu: app.cpu,
239
- memory: app.memory,
240
- links: [],
241
- port_mappings: [],
242
- environment: [],
243
- },
244
- ],
245
- ).task_definition
244
+ def register_task_definition_for_oneshot(definitions)
245
+ family = "#{@app_id}-oneshot"
246
+ if task_definition_changed?(family, definitions)
247
+ @ecs.register_task_definition(
248
+ family: "#{@app_id}-oneshot",
249
+ container_definitions: definitions,
250
+ ).task_definition
251
+ else
252
+ :noop
253
+ end
246
254
  end
247
255
 
248
256
  def front_container(front, front_port)
@@ -275,17 +283,15 @@ module Hako
275
283
  }
276
284
  end
277
285
 
278
- def run_task(task_definition, env, commands)
279
- environment = env.map { |k, v| { name: k, value: v } }
286
+ def run_task(task_definition, commands)
280
287
  @ecs.run_task(
281
288
  cluster: @cluster,
282
289
  task_definition: task_definition.task_definition_arn,
283
290
  overrides: {
284
291
  container_overrides: [
285
292
  {
286
- name: 'oneshot',
293
+ name: 'app',
287
294
  command: commands,
288
- environment: environment,
289
295
  },
290
296
  ],
291
297
  },
@@ -311,13 +317,17 @@ module Hako
311
317
  end
312
318
  end
313
319
 
314
- Hako.logger.info " status #{task.last_status}"
320
+ Hako.logger.debug " status #{task.last_status}"
315
321
 
316
322
  if task.last_status == 'STOPPED'
317
323
  Hako.logger.info "Stopped at #{task.stopped_at}"
318
- container = task.containers[0]
319
- Hako.logger.info "Exit code is #{container.exit_code}"
320
- return container.exit_code
324
+ containers = {}
325
+ task.containers.each do |c|
326
+ containers[c.name] = c
327
+ end
328
+ app = containers.fetch('app')
329
+ Hako.logger.info "Exit code is #{app.exit_code}"
330
+ return app.exit_code
321
331
  end
322
332
  sleep 1
323
333
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Hako
3
- VERSION = '0.7.4'
3
+ VERSION = '0.8.0'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hako
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.4
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kohei Suzuki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-02-26 00:00:00.000000000 Z
11
+ date: 2016-02-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk