hako 0.14.1 → 0.15.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b73b66a504c37b90e3234870e6333263e7abfc8c
4
- data.tar.gz: 1de7e857c4c8f40c275f72bd1822e211521d447b
3
+ metadata.gz: 824d56a1bf34b619cd7251d92817f5c080a71b63
4
+ data.tar.gz: 80aa695a436bd7af6f6d43d2ac5196d791fb8efc
5
5
  SHA512:
6
- metadata.gz: 805980ec90386912e4e69423820f6a224203c52cf06210f67c677c41ecfe181db3285597a6749703e8d73fdff18235352d868d416f182e8e01ca2b85db5d1888
7
- data.tar.gz: 01adc0732edc57ebab0304b4f2e95aa4f753038a6ac162def04688f7f8fb57c905948450ac50847b88f12abc190a19452e3b8e68a13a7603610fbb05320bd4fa
6
+ metadata.gz: 7942006910edb928222008730977d4842d9afe03c76699833e37acd2d5a60f43e6a04a0b2228c7aeeabdb123f7d98a891ab81400862ba2be59a0d4e140d206a7
7
+ data.tar.gz: 83f44968892aaaf5f8699b6962c842d520ae4e22727ee2d41d5be7e1cd152843fd0412aaffc86c18cf9256643073b31af20dc2612d9f50a81fdf1c5d2b779ab7
data/README.md CHANGED
@@ -47,6 +47,10 @@ Events:
47
47
  2015-10-05 13:35:53 +0900: (service hello) has reached a steady state.
48
48
  2015-10-05 13:35:14 +0900: (service hello) stopped 1 running tasks.
49
49
 
50
+ % hako rollback examples/hello.yml # [EXPERIMENTAL]
51
+ I, [2016-05-02T13:07:12.679926 #10961] INFO -- : Current task defintion is hello:29. Rolling back to arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:task-definition/hello:28
52
+ I, [2016-05-02T13:07:12.959116 #10961] INFO -- : Updated service: arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:service/hello
53
+ I, [2016-05-02T13:08:27.280686 #10961] INFO -- : Deployment completed
50
54
  ```
51
55
 
52
56
  ## Front image
data/lib/hako/cli.rb CHANGED
@@ -6,6 +6,7 @@ module Hako
6
6
  class CLI
7
7
  SUB_COMMANDS = %w[
8
8
  deploy
9
+ rollback
9
10
  oneshot
10
11
  show-yaml
11
12
  status
@@ -91,6 +92,41 @@ module Hako
91
92
  end
92
93
  end
93
94
 
95
+ class Rollback
96
+ def run(argv)
97
+ parse!(argv)
98
+ require 'hako/application'
99
+ require 'hako/commander'
100
+
101
+ if @verbose
102
+ Hako.logger.level = Logger::DEBUG
103
+ end
104
+
105
+ Commander.new(Application.new(@yaml_path)).rollback(dry_run: @dry_run)
106
+ end
107
+
108
+ def parse!(argv)
109
+ @dry_run = false
110
+ @verbose = false
111
+ parser.parse!(argv)
112
+ @yaml_path = argv.first
113
+
114
+ if @yaml_path.nil?
115
+ puts parser.help
116
+ exit 1
117
+ end
118
+ end
119
+
120
+ def parser
121
+ @parser ||= OptionParser.new do |opts|
122
+ opts.banner = 'hako rollback [OPTIONS] FILE'
123
+ opts.version = VERSION
124
+ opts.on('-n', '--dry-run', 'Enable dry-run mode') { @dry_run = true }
125
+ opts.on('-v', '--verbose', 'Enable verbose logging') { @verbose = true }
126
+ end
127
+ end
128
+ end
129
+
94
130
  class Oneshot
95
131
  def run(argv)
96
132
  parse!(argv)
@@ -29,6 +29,15 @@ module Hako
29
29
  nil
30
30
  end
31
31
 
32
+ # @param [Boolean] dry_run
33
+ # @return [nil]
34
+ def rollback(dry_run: false)
35
+ scripts = @app.yaml.fetch('scripts', []).map { |config| load_script(config, dry_run: dry_run) }
36
+ scheduler = load_scheduler(@app.yaml['scheduler'], scripts, dry_run: dry_run)
37
+
38
+ scheduler.rollback
39
+ end
40
+
32
41
  # @param [Array<String>] commands
33
42
  # @param [String] tag
34
43
  # @param [Hash<String, String>] env
@@ -30,6 +30,10 @@ module Hako
30
30
  raise NotImplementedError
31
31
  end
32
32
 
33
+ def rollback
34
+ raise NotImplementedError
35
+ end
36
+
33
37
  def status
34
38
  raise NotImplementedError
35
39
  end
@@ -57,6 +57,32 @@ module Hako
57
57
  end
58
58
  end
59
59
 
60
+ def rollback
61
+ current_service = describe_service
62
+ unless current_service
63
+ Hako.logger.error 'Unable to find service'
64
+ exit 1
65
+ end
66
+
67
+ task_definition = ecs_client.describe_task_definition(task_definition: current_service.task_definition).task_definition
68
+ current_definition = "#{task_definition.family}:#{task_definition.revision}"
69
+ target_definition = find_rollback_target(task_definition)
70
+ Hako.logger.info "Current task defintion is #{current_definition}. Rolling back to #{target_definition}"
71
+
72
+ if @dry_run
73
+ Hako.logger.info 'Deployment completed (dry-run)'
74
+ else
75
+ service = ecs_client.update_service(cluster: current_service.cluster_arn, service: current_service.service_arn, task_definition: target_definition).service
76
+ Hako.logger.info "Updated service: #{service.service_arn}"
77
+
78
+ deregistered_definition = ecs_client.deregister_task_definition(task_definition: current_definition).task_definition
79
+ Hako.logger.debug "Deregistered #{deregistered_definition.task_definition_arn}"
80
+
81
+ wait_for_ready(service)
82
+ Hako.logger.info 'Deployment completed'
83
+ end
84
+ end
85
+
60
86
  # @param [Hash<String, Container>] containers
61
87
  # @param [Array<String>] commands
62
88
  # @param [Hash<String, String>] env
@@ -543,6 +569,27 @@ module Hako
543
569
  events[0].id
544
570
  end
545
571
  end
572
+
573
+ # @param [Aws::ECS::Types::TaskDefinition]
574
+ # @return [String]
575
+ def find_rollback_target(task_definition)
576
+ if task_definition.status != 'ACTIVE'
577
+ raise 'Cannot find rollback target from INACTIVE task_definition!'
578
+ end
579
+
580
+ arn_found = false
581
+ ecs_client.list_task_definitions(family_prefix: task_definition.family, status: 'ACTIVE', sort: 'DESC').each do |page|
582
+ page.task_definition_arns.each do |arn|
583
+ if arn_found
584
+ return arn
585
+ elsif arn == task_definition.task_definition_arn
586
+ arn_found = true
587
+ end
588
+ end
589
+ end
590
+
591
+ raise "Unable to find rollback target. #{task_definition.task_definition_arn} is INACTIVE?"
592
+ end
546
593
  end
547
594
  end
548
595
  end
data/lib/hako/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Hako
3
- VERSION = '0.14.1'
3
+ VERSION = '0.15.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.14.1
4
+ version: 0.15.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-04-26 00:00:00.000000000 Z
11
+ date: 2016-05-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk