ecs_deployer 0.1.5 → 0.1.7
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/README.md +5 -5
- data/ecs_deployer.gemspec +5 -2
- data/example/fixtures/task.yml +4 -4
- data/example/sample.rb +2 -3
- data/exe/ecs_deployer +3 -0
- data/lib/ecs_deployer/cli.rb +10 -0
- data/lib/ecs_deployer/client.rb +63 -44
- data/lib/ecs_deployer/version.rb +1 -1
- data/lib/ecs_deployer.rb +1 -1
- metadata +48 -4
- data/lib/ecs_deployer/commander.rb +0 -87
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5fd6d6f9f5273217eda74eb3591b68d995756699
|
4
|
+
data.tar.gz: b8c28e3077e600f1819af1c5962b72932304a83f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7cf7d00b7a60e0f4adeab84e64195c7461ac652c94589a60c0258ae1a8dd279b06e82f172370314e88f7e0c89e19f714b0c9e73f3f6f4294385dd95cb397627c
|
7
|
+
data.tar.gz: a827047b284fb20d6c1418b774b4bb624e309e33b7a63f7cd4dab61c331f3b9bd0cbd111cfae6d2fe7453b45c045acbdf939611b6bfb8f158881f1b8649d44f8
|
data/README.md
CHANGED
@@ -25,14 +25,14 @@ For available parameters see [Task Definition Parameters](http://docs.aws.amazon
|
|
25
25
|
The sample file is in `example/fixtures/task.yml`.
|
26
26
|
|
27
27
|
```
|
28
|
-
|
28
|
+
container_definitions:
|
29
29
|
- name: wordpress
|
30
30
|
links:
|
31
31
|
- mysql
|
32
32
|
image: wordpress
|
33
33
|
essential: true
|
34
|
-
|
35
|
-
-
|
34
|
+
port_mappings:
|
35
|
+
- container_port: 80
|
36
36
|
hostPort: 80
|
37
37
|
memory: 500
|
38
38
|
cpu: 10
|
@@ -50,7 +50,7 @@ family: hello_world
|
|
50
50
|
## Usage
|
51
51
|
|
52
52
|
```
|
53
|
-
ecs_deployer = EcsDeployer::Client.new
|
53
|
+
ecs_deployer = EcsDeployer::Client.new
|
54
54
|
ecs_deployer.register_task('development.yml')
|
55
|
-
ecs_deployer.update_service('cluster', '
|
55
|
+
ecs_deployer.update_service('cluster', 'development')
|
56
56
|
```
|
data/ecs_deployer.gemspec
CHANGED
@@ -29,8 +29,11 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
30
30
|
spec.require_paths = ["lib"]
|
31
31
|
|
32
|
-
spec.add_dependency
|
33
|
-
spec.add_dependency
|
32
|
+
spec.add_dependency "runtime_command"
|
33
|
+
spec.add_dependency "oj"
|
34
|
+
spec.add_dependency "thor"
|
35
|
+
spec.add_dependency "aws-sdk"
|
36
|
+
spec.add_dependency "aws_config"
|
34
37
|
spec.add_development_dependency "bundler", "~> 1.14"
|
35
38
|
spec.add_development_dependency "rake", "~> 10.0"
|
36
39
|
spec.add_development_dependency "rspec", "~> 3.0"
|
data/example/fixtures/task.yml
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
|
1
|
+
container_definitions:
|
2
2
|
- name: wordpress
|
3
3
|
links:
|
4
4
|
- mysql
|
5
5
|
image: wordpress
|
6
6
|
essential: true
|
7
|
-
|
8
|
-
-
|
9
|
-
|
7
|
+
port_mappings:
|
8
|
+
- container_port: 80
|
9
|
+
host_port: 80
|
10
10
|
memory: 500
|
11
11
|
cpu: 10
|
12
12
|
- environment:
|
data/example/sample.rb
CHANGED
@@ -3,7 +3,6 @@ require 'ecs_deployer'
|
|
3
3
|
|
4
4
|
task_path = File.expand_path('./fixtures/task.yml', File.dirname(File.realpath(__FILE__)))
|
5
5
|
|
6
|
-
ecs_deployer = EcsDeployer::Client.new
|
6
|
+
ecs_deployer = EcsDeployer::Client.new
|
7
7
|
ecs_deployer.register_task(task_path)
|
8
|
-
ecs_deployer.update_service('
|
9
|
-
#ecs_deployer.log
|
8
|
+
# ecs_deployer.update_service('sandbox', 'production')
|
data/exe/ecs_deployer
ADDED
data/lib/ecs_deployer/client.rb
CHANGED
@@ -1,21 +1,24 @@
|
|
1
1
|
require 'yaml'
|
2
|
+
require 'oj'
|
3
|
+
require 'aws-sdk'
|
2
4
|
require 'runtime_command'
|
3
|
-
require 'ecs_deployer/commander'
|
4
5
|
|
5
6
|
module EcsDeployer
|
6
7
|
class Client
|
7
8
|
PAULING_INTERVAL = 20
|
8
9
|
|
10
|
+
attr_reader :commander
|
11
|
+
|
9
12
|
# @param [Hash] options
|
10
13
|
# @option options [String] :profile
|
11
14
|
# @option options [String] :region
|
12
15
|
# @return [EcsDeployer::Client]
|
13
16
|
def initialize(options = {})
|
14
|
-
@
|
15
|
-
@ecs_command = Commander.new(@runtime, options)
|
17
|
+
@command = RuntimeCommand::Builder.new
|
16
18
|
@family = ''
|
17
19
|
@revision = ''
|
18
20
|
@new_task_definition_arn = ''
|
21
|
+
@commander = Aws::ECS::Client.new(options)
|
19
22
|
end
|
20
23
|
|
21
24
|
# @param [String] task_path
|
@@ -28,11 +31,17 @@ module EcsDeployer
|
|
28
31
|
# @param [Hash] task_hash
|
29
32
|
# @return [String]
|
30
33
|
def register_task_hash(task_hash)
|
31
|
-
|
34
|
+
task_hash = Oj.load(Oj.dump(task_hash), symbol_keys: true)
|
35
|
+
|
36
|
+
result = @commander.register_task_definition({
|
37
|
+
container_definitions: task_hash[:container_definitions],
|
38
|
+
family: task_hash[:family],
|
39
|
+
task_role_arn: task_hash[:task_role_arn]
|
40
|
+
})
|
32
41
|
|
33
|
-
@family = result[
|
34
|
-
@revision = result[
|
35
|
-
@new_task_definition_arn = result[
|
42
|
+
@family = result[:task_definition][:family]
|
43
|
+
@revision = result[:task_definition][:revision]
|
44
|
+
@new_task_definition_arn = result[:task_definition][:task_definition_arn]
|
36
45
|
end
|
37
46
|
|
38
47
|
# @param [String] cluster
|
@@ -41,11 +50,17 @@ module EcsDeployer
|
|
41
50
|
def register_clone_task(cluster, service)
|
42
51
|
detected_service = false
|
43
52
|
|
44
|
-
result = @
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
53
|
+
result = @commander.describe_services({
|
54
|
+
cluster: cluster,
|
55
|
+
services: [service]
|
56
|
+
})
|
57
|
+
|
58
|
+
result[:services].each do |svc|
|
59
|
+
if svc[:service_name] == service
|
60
|
+
result = @commander.describe_task_definition({
|
61
|
+
task_definition: svc[:task_definition]
|
62
|
+
})
|
63
|
+
@new_task_definition_arn = register_task_hash(result[:task_definition])
|
49
64
|
detected_service = true
|
50
65
|
break
|
51
66
|
end
|
@@ -61,17 +76,13 @@ module EcsDeployer
|
|
61
76
|
# @param [Fixnum] timeout
|
62
77
|
def update_service(cluster, service, wait = true, timeout = 600)
|
63
78
|
register_clone_task(service) if @new_task_definition_arn.empty?
|
64
|
-
options = {
|
65
|
-
'cluster': cluster,
|
66
|
-
'task-definition': @family + ':' + @revision.to_s
|
67
|
-
}
|
68
|
-
@ecs_command.update_service(service, options)
|
69
|
-
wait_for_deploy(cluster, service, timeout) if wait
|
70
|
-
end
|
71
79
|
|
72
|
-
|
73
|
-
|
74
|
-
|
80
|
+
@commander.update_service({
|
81
|
+
cluster: cluster,
|
82
|
+
service: service,
|
83
|
+
task_definition: @family + ':' + @revision.to_s
|
84
|
+
})
|
85
|
+
wait_for_deploy(cluster, service, timeout) if wait
|
75
86
|
end
|
76
87
|
|
77
88
|
private
|
@@ -81,53 +92,61 @@ module EcsDeployer
|
|
81
92
|
def wait_for_deploy(cluster, service, timeout)
|
82
93
|
detected_service = false
|
83
94
|
|
84
|
-
result = @
|
85
|
-
|
86
|
-
|
95
|
+
result = @commander.describe_services({
|
96
|
+
cluster: cluster,
|
97
|
+
services: [service]
|
98
|
+
})
|
99
|
+
result[:services].each do |svc|
|
100
|
+
next unless svc[:service_name] == service
|
87
101
|
detected_service = true
|
88
102
|
|
89
|
-
result = @
|
103
|
+
result = @commander.describe_task_definition({
|
104
|
+
task_definition: svc[:task_definition]
|
105
|
+
})
|
90
106
|
|
91
|
-
if svc[
|
107
|
+
if svc[:desired_count] > 0
|
92
108
|
running_new_task = false
|
93
109
|
wait_time = 0
|
94
|
-
@
|
110
|
+
@command.puts 'Start deploing...'
|
95
111
|
|
96
112
|
begin
|
97
113
|
sleep(PAULING_INTERVAL)
|
98
114
|
wait_time += PAULING_INTERVAL
|
99
115
|
|
100
116
|
# Get current tasks
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
}
|
106
|
-
result = @ecs_command.list_tasks(options)
|
117
|
+
result = @commander.list_tasks({
|
118
|
+
cluster: cluster,
|
119
|
+
service_name: service,
|
120
|
+
desired_status: 'RUNNING'
|
121
|
+
})
|
107
122
|
|
108
|
-
raise TaskNotFoundError.new('Desired count is 0.') if result[
|
123
|
+
raise TaskNotFoundError.new('Desired count is 0.') if result[:task_arns].size == 0
|
109
124
|
|
110
125
|
new_running_count = 0
|
111
|
-
result = @
|
126
|
+
result = @commander.describe_tasks({
|
127
|
+
tasks: result[:task_arns],
|
128
|
+
cluster: cluster
|
129
|
+
})
|
112
130
|
|
113
|
-
result[
|
114
|
-
new_running_count += 1 if @new_task_definition_arn == task[
|
131
|
+
result[:tasks].each do |task|
|
132
|
+
new_running_count += 1 if @new_task_definition_arn == task[:task_definition_arn]
|
115
133
|
end
|
116
134
|
|
117
|
-
current_running_count = result[
|
135
|
+
current_running_count = result[:tasks].size
|
118
136
|
|
119
137
|
if current_running_count == new_running_count
|
120
|
-
@
|
121
|
-
@
|
138
|
+
@command.puts "Service update succeeded. [#{new_running_count}/#{current_running_count}]"
|
139
|
+
@command.puts "New task definition: #{@new_task_definition_arn}"
|
122
140
|
|
123
141
|
running_new_task = true
|
124
142
|
|
125
143
|
else
|
126
|
-
@
|
127
|
-
@
|
144
|
+
@command.puts "Deploying... [#{new_running_count}/#{current_running_count}] (#{wait_time} seconds elapsed)"
|
145
|
+
@command.puts "New task: #{@new_task_definition_arn}"
|
146
|
+
@command.puts 'You can stop process with Ctrl+C. Deployment will continue.'
|
128
147
|
|
129
148
|
if wait_time > timeout
|
130
|
-
@
|
149
|
+
@command.puts "New task definition: #{@new_task_definition_arn}"
|
131
150
|
raise DeployTimeoutError.new('Service is being updating, but process is timed out.')
|
132
151
|
end
|
133
152
|
end
|
data/lib/ecs_deployer/version.rb
CHANGED
data/lib/ecs_deployer.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'ecs_deployer/version'
|
2
2
|
require 'ecs_deployer/client'
|
3
3
|
require 'ecs_deployer/error'
|
4
|
+
require 'ecs_deployer/cli'
|
4
5
|
|
5
6
|
module EcsDeployer
|
6
7
|
class ServiceNotFoundError < EcsDeployer::Error; end
|
7
8
|
class TaskNotFoundError < EcsDeployer::Error; end
|
8
9
|
class DeployTimeoutError < EcsDeployer::Error; end
|
9
|
-
class CommandError < EcsDeployer::Error; end
|
10
10
|
end
|
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: 0.1.
|
4
|
+
version: 0.1.7
|
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-03-
|
11
|
+
date: 2017-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: runtime_command
|
@@ -38,6 +38,48 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: thor
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: aws-sdk
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: aws_config
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
41
83
|
- !ruby/object:Gem::Dependency
|
42
84
|
name: bundler
|
43
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -83,7 +125,8 @@ dependencies:
|
|
83
125
|
description: This package provides the service deployment function of ECS.
|
84
126
|
email:
|
85
127
|
- n.yamakita@gmail.com
|
86
|
-
executables:
|
128
|
+
executables:
|
129
|
+
- ecs_deployer
|
87
130
|
extensions: []
|
88
131
|
extra_rdoc_files: []
|
89
132
|
files:
|
@@ -98,9 +141,10 @@ files:
|
|
98
141
|
- ecs_deployer.gemspec
|
99
142
|
- example/fixtures/task.yml
|
100
143
|
- example/sample.rb
|
144
|
+
- exe/ecs_deployer
|
101
145
|
- lib/ecs_deployer.rb
|
146
|
+
- lib/ecs_deployer/cli.rb
|
102
147
|
- lib/ecs_deployer/client.rb
|
103
|
-
- lib/ecs_deployer/commander.rb
|
104
148
|
- lib/ecs_deployer/error.rb
|
105
149
|
- lib/ecs_deployer/version.rb
|
106
150
|
homepage: https://github.com/naomichi-y/ecs_deployer
|
@@ -1,87 +0,0 @@
|
|
1
|
-
require 'oj'
|
2
|
-
|
3
|
-
module EcsDeployer
|
4
|
-
class Commander
|
5
|
-
# @param [RuntimeCommand::Builder] runtime
|
6
|
-
# @param [Hash] options
|
7
|
-
# @return EcsDeployer::Commander
|
8
|
-
def initialize(runtime, options = {})
|
9
|
-
@runtime = runtime
|
10
|
-
@options = options
|
11
|
-
end
|
12
|
-
|
13
|
-
# @param [String] service
|
14
|
-
# @param [Hash] options
|
15
|
-
# @return [Hash]
|
16
|
-
def update_service(service, options = {})
|
17
|
-
options['service'] = service
|
18
|
-
exec('update-service', options)
|
19
|
-
end
|
20
|
-
|
21
|
-
# @param [Hash] options
|
22
|
-
# @return [Hash]
|
23
|
-
def list_tasks(options = {})
|
24
|
-
exec('list-tasks', options)
|
25
|
-
end
|
26
|
-
|
27
|
-
# @param [Array] tasks
|
28
|
-
# @param [Hash] options
|
29
|
-
# @return [Hash]
|
30
|
-
def describe_tasks(tasks, options = {})
|
31
|
-
options['tasks'] = tasks.join(' ')
|
32
|
-
exec('describe-tasks', options)
|
33
|
-
end
|
34
|
-
|
35
|
-
# @param [String] task_definition
|
36
|
-
# @param [Hash] options
|
37
|
-
# @return [Hash]
|
38
|
-
def describe_task_definition(task_definition, options = {})
|
39
|
-
options['task-definition'] = task_definition
|
40
|
-
exec('describe-task-definition', options)
|
41
|
-
end
|
42
|
-
|
43
|
-
# @param [Array] services
|
44
|
-
# @param [Hash] options
|
45
|
-
# @return [Hash]
|
46
|
-
def describe_services(services, options = {})
|
47
|
-
options['services'] = services.join(' ')
|
48
|
-
exec('describe-services', options)
|
49
|
-
end
|
50
|
-
|
51
|
-
# @param [String] family
|
52
|
-
# @param [Hash] container_definitions
|
53
|
-
# @param [Hash] options
|
54
|
-
# @return [Hash]
|
55
|
-
def register_task_definition(family, container_definitions, options = {})
|
56
|
-
options['family'] = family
|
57
|
-
options['container-definitions'] = '"' + Oj.dump(container_definitions).gsub('"', '\\"') + '"'
|
58
|
-
exec('register-task-definition', options)
|
59
|
-
end
|
60
|
-
|
61
|
-
# @return [String]
|
62
|
-
def log
|
63
|
-
@runtime.buffered_log
|
64
|
-
end
|
65
|
-
|
66
|
-
private
|
67
|
-
# @param [String] command
|
68
|
-
# @param [Hash] params
|
69
|
-
# @return [Hash]
|
70
|
-
def exec(command, params)
|
71
|
-
arg = ''
|
72
|
-
params.each do |name, value|
|
73
|
-
arg << "--#{name} #{value} "
|
74
|
-
end
|
75
|
-
|
76
|
-
arg << "--profile #{params[:profile]} " if params.has_key?(:profile)
|
77
|
-
arg << "--region #{params[:region]} " if params.has_key?(:region)
|
78
|
-
|
79
|
-
command = "aws ecs #{command} #{arg}"
|
80
|
-
result = @runtime.exec(command)
|
81
|
-
|
82
|
-
raise CommandError.new unless result.buffered_stderr.empty?
|
83
|
-
|
84
|
-
Oj.load(result.buffered_stdout)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|