hako 0.14.1 → 0.15.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: 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