ecs_helper 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/ecs_helper +6 -0
- data/lib/ecs_helper/client.rb +57 -0
- data/lib/ecs_helper/cluster_helper.rb +31 -0
- data/lib/ecs_helper/command/base.rb +41 -0
- data/lib/ecs_helper/command/build_and_push.rb +87 -0
- data/lib/ecs_helper/command/deploy.rb +145 -0
- data/lib/ecs_helper/command.rb +66 -0
- data/lib/ecs_helper/common_helper.rb +33 -0
- data/lib/ecs_helper/logging.rb +16 -0
- data/lib/ecs_helper/service_helper.rb +41 -0
- data/lib/ecs_helper.rb +28 -0
- metadata +194 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 6e8be79974f9b2a283b5534324966c2d0911bf82fc10082e81099b453ddbf108
|
4
|
+
data.tar.gz: '04283f48874519795e2a9ccbf76974c7aaca9076be1baa3031d044736477d72b'
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: eaff219c5e0e59dd24c3645dca404a8df80a20bc5edf31947ab545970721223ee07dd8a57e4b49c93706dd0ed163173f33ca2a3f0c3dcab9e1e2c096f7afe891
|
7
|
+
data.tar.gz: bab7042458321e8118b121fdb2e05bf061d9cf669902a653021e68358ded2d1fc389ec0b6cc4f7b36dd442f5bdfa1a4ca266bbd8564b96c2a59b718688f31162
|
data/bin/ecs_helper
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'aws-sdk-ecs'
|
2
|
+
require 'aws-sdk-ecr'
|
3
|
+
|
4
|
+
class ECSHelper::Client
|
5
|
+
attr_accessor :ecs, :ecr
|
6
|
+
def initialize
|
7
|
+
@ecs = Aws::ECS::Client.new
|
8
|
+
@ecr = Aws::ECR::Client.new
|
9
|
+
end
|
10
|
+
|
11
|
+
# ECS
|
12
|
+
def task_definitions
|
13
|
+
@task_definitions ||= ecs.list_task_definitions.task_definition_arns
|
14
|
+
end
|
15
|
+
|
16
|
+
def clusters
|
17
|
+
@clusters ||= ecs.list_clusters.cluster_arns
|
18
|
+
end
|
19
|
+
|
20
|
+
def services(cluster)
|
21
|
+
@services ||= ecs.list_services(cluster: cluster).service_arns
|
22
|
+
end
|
23
|
+
|
24
|
+
def tasks(cluster, service)
|
25
|
+
arns = ecs.list_tasks(cluster: cluster, service_name: service).task_arns
|
26
|
+
ecs.describe_tasks({ tasks: arns, cluster: cluster }).tasks
|
27
|
+
end
|
28
|
+
|
29
|
+
def describe_service(cluster, service)
|
30
|
+
ecs.describe_services(cluster: cluster, services: [service]).services[0]
|
31
|
+
end
|
32
|
+
|
33
|
+
def describe_task_definition(task_definition)
|
34
|
+
ecs.describe_task_definition(task_definition: task_definition).task_definition
|
35
|
+
end
|
36
|
+
|
37
|
+
def register_task_definition(params = {})
|
38
|
+
ecs.register_task_definition(params).task_definition
|
39
|
+
end
|
40
|
+
|
41
|
+
def deregister_task_definition(params = {})
|
42
|
+
ecs.deregister_task_definition(params).task_definition
|
43
|
+
end
|
44
|
+
|
45
|
+
def update_service(params = {})
|
46
|
+
ecs.update_service(params)
|
47
|
+
end
|
48
|
+
|
49
|
+
# ECR
|
50
|
+
def repositories(params = {})
|
51
|
+
ecr.describe_repositories(params).repositories
|
52
|
+
end
|
53
|
+
|
54
|
+
def describe_images(params = {})
|
55
|
+
ecr.describe_images(params).image_details[0]
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'aws-sdk-ecs'
|
2
|
+
|
3
|
+
class ECSHelper::ClusterHelper
|
4
|
+
attr_accessor :helper, :client, :clusters, :options, :project, :environment, :current_cluster
|
5
|
+
def initialize(helper)
|
6
|
+
@helper = helper
|
7
|
+
end
|
8
|
+
|
9
|
+
def clusters
|
10
|
+
@clusters ||= helper.client.clusters
|
11
|
+
end
|
12
|
+
|
13
|
+
def current_cluster
|
14
|
+
@current_cluster ||= from_options || only_one || from_env || raise(StandardError.new("Cluster not detected"))
|
15
|
+
end
|
16
|
+
|
17
|
+
def from_options
|
18
|
+
value = helper.options[:cluster]
|
19
|
+
return nil unless value
|
20
|
+
return value if clusters.include?(value)
|
21
|
+
raise(StandardError.new("Cluster specified in cli not exists, clusters you have: #{clusters}")) unless clusters.find {|r| r == value}
|
22
|
+
end
|
23
|
+
|
24
|
+
def from_env
|
25
|
+
clusters.find {|c| c.include?(helper.project) && c.include?(helper.environment)}
|
26
|
+
end
|
27
|
+
|
28
|
+
def only_one
|
29
|
+
return clusters[0] if clusters.length == 1
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'terrapin'
|
3
|
+
require 'ecs_helper/logging'
|
4
|
+
|
5
|
+
class ECSHelper::Command::Base
|
6
|
+
include ECSHelper::Logging
|
7
|
+
attr_accessor :type, :options, :helper, :client, :option_parser
|
8
|
+
|
9
|
+
def initialize(helper)
|
10
|
+
@client = helper.client
|
11
|
+
@helper = helper
|
12
|
+
@option_parser, @options = cmd_option_parser
|
13
|
+
@option_parser.parse!(into: @options)
|
14
|
+
end
|
15
|
+
|
16
|
+
def type
|
17
|
+
helper.type
|
18
|
+
end
|
19
|
+
|
20
|
+
def validate
|
21
|
+
required.each do |r|
|
22
|
+
value = options[r]
|
23
|
+
unless value
|
24
|
+
puts "'#{r}' required for command '#{command}'".light_white
|
25
|
+
puts option_parser.help
|
26
|
+
exit
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def required
|
34
|
+
[]
|
35
|
+
end
|
36
|
+
|
37
|
+
def processEqual(value)
|
38
|
+
value.start_with?('=') ? value[1..-1] : value
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'terrapin'
|
2
|
+
|
3
|
+
class ECSHelper::Command::BuildAndPush < ECSHelper::Command::Base
|
4
|
+
# attr_accessor :type, :client, :project, :application, :version
|
5
|
+
|
6
|
+
def cmd_option_parser
|
7
|
+
options = {}
|
8
|
+
parser = ::OptionParser.new do |opts|
|
9
|
+
opts.banner = "Usage: ecs_helper build_and_push [options]]"
|
10
|
+
opts.on("-v", "--verbose", "Show debug information") { o[:verbose] = true }
|
11
|
+
opts.on("-i VALUE", "--image VALUE", "Set image name, will be used to detect ecr repo where to push image, for example web/nginx/toolbox (required)") { |c| options[:image] = processEqual(c) }
|
12
|
+
opts.on("-d VALUE", "--directory VALUE", "Set directory for dockerfile and context, default = './'") { |c| options[:directory] = processEqual(c) }
|
13
|
+
opts.on("-p VALUE", "--project VALUE", "Set project name, if not specified will look at ENV['PROJECT'], will be used to detect cluster") { |p| options[:project] = processEqual(p) }
|
14
|
+
opts.on("-a VALUE", "--application VALUE", "Set application name, if not specified will look at ENV['APPLICATION'], will be used to detect service and task definition") { |a| options[:application] = processEqual(a) }
|
15
|
+
end
|
16
|
+
[parser, options]
|
17
|
+
end
|
18
|
+
|
19
|
+
def required
|
20
|
+
[:image]
|
21
|
+
end
|
22
|
+
|
23
|
+
def run
|
24
|
+
log("Command", type)
|
25
|
+
log("Options", options)
|
26
|
+
log("Repository", repository)
|
27
|
+
log("Auth", auth)
|
28
|
+
log("Pull", pull)
|
29
|
+
log("Build", build)
|
30
|
+
log("Push", push)
|
31
|
+
end
|
32
|
+
|
33
|
+
def auth
|
34
|
+
auth_cmd = Terrapin::CommandLine.new("aws ecr get-login --no-include-email | sh")
|
35
|
+
auth_cmd.run
|
36
|
+
end
|
37
|
+
|
38
|
+
def pull
|
39
|
+
pull_cmd = Terrapin::CommandLine.new("docker pull #{latest_tag}")
|
40
|
+
pull_cmd.run
|
41
|
+
rescue Terrapin::ExitStatusError => e
|
42
|
+
puts e.message
|
43
|
+
end
|
44
|
+
|
45
|
+
def build
|
46
|
+
build_cmd = Terrapin::CommandLine.new("docker build #{directory} --cache-from #{latest_tag} --tag #{latest_tag} --tag #{version_tag}")
|
47
|
+
puts "Building with two tags: #{latest_tag} & #{version_tag}"
|
48
|
+
build_cmd.run
|
49
|
+
end
|
50
|
+
|
51
|
+
def push
|
52
|
+
pull_cmd = Terrapin::CommandLine.new("docker push #{latest_tag} && docker push #{version_tag}")
|
53
|
+
pull_cmd.run
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def image_name
|
59
|
+
options[:image]
|
60
|
+
end
|
61
|
+
|
62
|
+
def directory
|
63
|
+
options[:directory] || "./"
|
64
|
+
end
|
65
|
+
|
66
|
+
def latest_tag
|
67
|
+
"#{repository}:latest"
|
68
|
+
end
|
69
|
+
|
70
|
+
def version_tag
|
71
|
+
"#{repository}:#{helper.version}"
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
def repository
|
76
|
+
@repository ||= begin
|
77
|
+
all = client.repositories
|
78
|
+
with_name = all.select { |r| r.repository_arn.include?(image_name) }
|
79
|
+
return with_name[0].repository_uri if with_name.length === 1
|
80
|
+
|
81
|
+
exact = with_name.select { |r| r.repository_arn.include?(project) && r.repository_arn.include?(application) }
|
82
|
+
return exact[0].repository_uri if exact.length === 1
|
83
|
+
|
84
|
+
raise "Can't detect ECR repository"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
require 'terrapin'
|
2
|
+
|
3
|
+
class ECSHelper::Command::Deploy < ECSHelper::Command::Base
|
4
|
+
attr_accessor :repositories, :task_definition, :new_task_definition, :service
|
5
|
+
TIMEOUT = 300
|
6
|
+
STEP = 5
|
7
|
+
|
8
|
+
def cmd_option_parser
|
9
|
+
options = {}
|
10
|
+
parser = ::OptionParser.new do |opts|
|
11
|
+
opts.banner = "Usage: ecs_helper deploy [options]]"
|
12
|
+
opts.on("-v", "--verbose", "Show debug information") { o[:verbose] = true }
|
13
|
+
opts.on("-p VALUE", "--project VALUE", "Set project name, if not specified will look at ENV['PROJECT'], will be used to detect cluster") { |p| options[:project] = processEqual(p) }
|
14
|
+
opts.on("-a VALUE", "--application VALUE", "Set application name, if not specified will look at ENV['APPLICATION'], will be used to detect service and task definition") { |a| options[:application] = processEqual(a) }
|
15
|
+
opts.on("-e VALUE", "--environment VALUE", "Set environment, if not specified will look at ENV['ENVIRONMENT'], it there is empty will try to detect based on the branch") { |e| options[:environment] = processEqual(e) }
|
16
|
+
opts.on("-t VALUE", "--tag VALUE", "Set tag which will be applied to all containers in the task if tag is present in the repo") { |t| options[:tag] = processEqual(t) }
|
17
|
+
opts.on("-c VALUE", "--cluster VALUE", "Set cluster name, could be autodetected if project and environment are specified") { |c| options[:cluster] = processEqual(c) }
|
18
|
+
opts.on("-s VALUE", "--service VALUE", "Set service, could be autodetected if application and environment are specified") { |s| options[:service] = processEqual(s) }
|
19
|
+
end
|
20
|
+
[parser, options]
|
21
|
+
end
|
22
|
+
|
23
|
+
def run
|
24
|
+
log("Command", type)
|
25
|
+
log("Options", options)
|
26
|
+
log("Environment", environment)
|
27
|
+
log("Cluster", cluster_arn)
|
28
|
+
log("Service", service_arn)
|
29
|
+
log("Tag", tag)
|
30
|
+
log("Service task definition", task_definition_arn)
|
31
|
+
log("Containers", pretty_container_definitions)
|
32
|
+
log("New task definition", new_task_definition.task_definition_arn)
|
33
|
+
update_service && log("Update service", "Service task definition was updated")
|
34
|
+
log("Waiting for deployment...")
|
35
|
+
wait_for_deployment && log("Success", "Application was succesfully deployed", :cyan)
|
36
|
+
end
|
37
|
+
|
38
|
+
def wait_for_deployment(time = 0)
|
39
|
+
service = helper.client.describe_service(cluster_arn, service_arn)
|
40
|
+
return true if service.deployments.count == 1
|
41
|
+
error("Deployment timeout (#{TIMEOUT})") if time > TIMEOUT
|
42
|
+
sleep STEP
|
43
|
+
wait_for_deployment(time + STEP)
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def environment
|
49
|
+
helper.environment
|
50
|
+
end
|
51
|
+
|
52
|
+
def cluster_arn
|
53
|
+
helper.current_cluster
|
54
|
+
end
|
55
|
+
|
56
|
+
def service_arn
|
57
|
+
helper.current_service
|
58
|
+
end
|
59
|
+
|
60
|
+
def tag
|
61
|
+
options[:tag] || helper.version
|
62
|
+
end
|
63
|
+
|
64
|
+
def service
|
65
|
+
@service ||= helper.client.describe_service(cluster_arn, service_arn)
|
66
|
+
end
|
67
|
+
|
68
|
+
def task_definition_arn
|
69
|
+
service.task_definition
|
70
|
+
end
|
71
|
+
|
72
|
+
def task_definition
|
73
|
+
@task_definition ||= helper.client.describe_task_definition(task_definition_arn)
|
74
|
+
end
|
75
|
+
|
76
|
+
def container_definitions
|
77
|
+
task_definition.container_definitions
|
78
|
+
end
|
79
|
+
|
80
|
+
def repositories
|
81
|
+
@repositories ||= client.repositories
|
82
|
+
end
|
83
|
+
|
84
|
+
def tag_image(repo)
|
85
|
+
client.describe_images({repository_name: repo.repository_name, image_ids: [image_tag: tag]})
|
86
|
+
rescue
|
87
|
+
nil
|
88
|
+
end
|
89
|
+
|
90
|
+
def new_task_definition
|
91
|
+
@new_task_definition ||= begin
|
92
|
+
attributes_to_remove = list = [:task_definition_arn, :revision, :status, :requires_attributes, :compatibilities, :registered_at, :registered_by]
|
93
|
+
new_task_definition_attributes = task_definition.to_hash
|
94
|
+
.reject { |k,v| attributes_to_remove.include?(k.to_sym) }
|
95
|
+
.merge(container_definitions: new_container_definitions)
|
96
|
+
helper.client.register_task_definition(new_task_definition_attributes)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def container_definition_to_ecr(cd)
|
101
|
+
repo = repo_for(cd.name)
|
102
|
+
is_ecr = cd.image.include?(ecr_base)
|
103
|
+
image = repo && tag_image(repo)
|
104
|
+
should_update = is_ecr && repo && image
|
105
|
+
[repo, is_ecr, image, should_update]
|
106
|
+
end
|
107
|
+
|
108
|
+
def new_container_definitions
|
109
|
+
container_definitions.map do |cd|
|
110
|
+
repo, is_ecr, image, should_be_updated = container_definition_to_ecr(cd)
|
111
|
+
cd.image = "#{repo.repository_uri}:#{tag}" if should_be_updated
|
112
|
+
cd.to_hash
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def pretty_container_definitions
|
117
|
+
container_definitions.map do |cd|
|
118
|
+
repo, is_ecr, image, should_be_updated = container_definition_to_ecr(cd)
|
119
|
+
[
|
120
|
+
cd.name,
|
121
|
+
cd.image,
|
122
|
+
is_ecr ? "ECR image" : "Not a ECR image",
|
123
|
+
repo ? "Repo #{repo.repository_name}" : "Repo not found",
|
124
|
+
image ? "Image tag #{tag}" : "Image tag #{tag} not found",
|
125
|
+
should_be_updated ? "Will be updated" : "Not applicable"
|
126
|
+
].join(' | ')
|
127
|
+
end.join("\n")
|
128
|
+
end
|
129
|
+
|
130
|
+
def repo_for(name)
|
131
|
+
repositories.find do |r|
|
132
|
+
uri = r.repository_uri
|
133
|
+
uri.include?(helper.application) && uri.include?(helper.project) && uri.include?(name)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def ecr_base
|
138
|
+
repositories.first.repository_uri.split('/').first
|
139
|
+
end
|
140
|
+
|
141
|
+
def update_service
|
142
|
+
helper.update_service(cluster_arn, service_arn, new_task_definition.task_definition_arn)
|
143
|
+
helper.client.deregister_task_definition(task_definition: task_definition.task_definition_arn)
|
144
|
+
end
|
145
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
|
2
|
+
class ECSHelper::Command
|
3
|
+
autoload :Base, 'ecs_helper/command/base'
|
4
|
+
autoload :BuildAndPush, 'ecs_helper/command/build_and_push'
|
5
|
+
autoload :Deploy, 'ecs_helper/command/deploy'
|
6
|
+
|
7
|
+
CMD_MAPPING = {
|
8
|
+
"build_and_push" => BuildAndPush,
|
9
|
+
"deploy" => Deploy
|
10
|
+
}
|
11
|
+
AVAILABLE_COMMANDS = CMD_MAPPING.keys
|
12
|
+
|
13
|
+
attr_accessor :type, :helper, :command
|
14
|
+
|
15
|
+
def initialize(helper)
|
16
|
+
@helper = helper
|
17
|
+
@type = ARGV.shift
|
18
|
+
@command = klass.new(helper)
|
19
|
+
end
|
20
|
+
|
21
|
+
def klass
|
22
|
+
CMD_MAPPING[type] || begin
|
23
|
+
puts "Command not found".light_white
|
24
|
+
puts "Available commands are #{AVAILABLE_COMMANDS}".light_white
|
25
|
+
puts global_option_parser
|
26
|
+
exit
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def options
|
31
|
+
command.options
|
32
|
+
end
|
33
|
+
|
34
|
+
def run
|
35
|
+
command.validate
|
36
|
+
command.run
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def global_option_parser
|
41
|
+
::OptionParser.new do |opts|
|
42
|
+
opts.banner = "Usage: ecs_helper command [options]"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
def self.parse
|
48
|
+
options = {}
|
49
|
+
command = ARGV.shift
|
50
|
+
|
51
|
+
unless command && Command::AVAILABLE_COMMANDS.include?(command)
|
52
|
+
puts "Command not found".light_white
|
53
|
+
puts "Available commands are #{Command::AVAILABLE_COMMANDS}".light_white
|
54
|
+
puts global
|
55
|
+
exit
|
56
|
+
end
|
57
|
+
|
58
|
+
subcommands_parser, required = subcommands(command, options)
|
59
|
+
subcommands_parser.permute!(into: options)
|
60
|
+
|
61
|
+
validate(command, options, required, subcommands_parser)
|
62
|
+
|
63
|
+
[command, options]
|
64
|
+
end
|
65
|
+
|
66
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
BRANCH_TO_ENV_MAPPING = {
|
2
|
+
master: 'production',
|
3
|
+
qa: 'qa',
|
4
|
+
staging: 'staging',
|
5
|
+
demo: 'demo',
|
6
|
+
}
|
7
|
+
|
8
|
+
class ECSHelper::CommonHelper
|
9
|
+
attr_accessor :helper, :branch, :version, :env
|
10
|
+
def initialize(helper)
|
11
|
+
@helper = helper
|
12
|
+
end
|
13
|
+
|
14
|
+
def branch
|
15
|
+
@branch ||= ENV["CI_COMMIT_BRANCH"] || `git rev-parse --abbrev-ref HEAD`.strip
|
16
|
+
end
|
17
|
+
|
18
|
+
def version
|
19
|
+
@version ||= ENV["CI_COMMIT_SHA"] || `git rev-parse HEAD`.strip
|
20
|
+
end
|
21
|
+
|
22
|
+
def environment
|
23
|
+
@env ||= helper.options[:environment] || ENV["ENVIRONMENT"] || BRANCH_TO_ENV_MAPPING[branch.to_sym] || raise(StandardError.new("Environment not detected"))
|
24
|
+
end
|
25
|
+
|
26
|
+
def project
|
27
|
+
ENV["PROJECT"]
|
28
|
+
end
|
29
|
+
|
30
|
+
def application
|
31
|
+
ENV["APPLICATION"]
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'aws-sdk-ecs'
|
2
|
+
|
3
|
+
class ECSHelper::ServiceHelper
|
4
|
+
attr_accessor :helper, :services, :cluster, :current_service
|
5
|
+
|
6
|
+
def initialize(helper)
|
7
|
+
@helper = helper
|
8
|
+
end
|
9
|
+
|
10
|
+
def services
|
11
|
+
@services ||= helper.client.services(helper.current_cluster)
|
12
|
+
end
|
13
|
+
|
14
|
+
def current_service
|
15
|
+
@current_service ||= from_options || only_one || from_env || raise(StandardError.new("Service not detected"))
|
16
|
+
end
|
17
|
+
|
18
|
+
def from_options
|
19
|
+
value = helper.options[:service]
|
20
|
+
return nil unless value
|
21
|
+
return value if services.include?(value)
|
22
|
+
raise(StandardError.new("Service specified in cli not exists, services you have: #{services}")) unless services.find {|r| r == value}
|
23
|
+
end
|
24
|
+
|
25
|
+
def from_env
|
26
|
+
services.find {|s| s.include?(helper.application) && s.include?(helper.environment)}
|
27
|
+
end
|
28
|
+
|
29
|
+
def only_one
|
30
|
+
return services[0] if services.length == 1
|
31
|
+
end
|
32
|
+
|
33
|
+
def update_service(cluster, service, task_definition)
|
34
|
+
helper.client.update_service({
|
35
|
+
cluster: cluster,
|
36
|
+
service: service,
|
37
|
+
task_definition: task_definition
|
38
|
+
})
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
data/lib/ecs_helper.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'colorize'
|
3
|
+
require 'forwardable'
|
4
|
+
|
5
|
+
class ECSHelper
|
6
|
+
extend Forwardable
|
7
|
+
attr_accessor :options, :client, :command, :parser, :cluster_helper, :service_helper, :common_helper
|
8
|
+
|
9
|
+
autoload :Client, 'ecs_helper/client'
|
10
|
+
autoload :CommonHelper, 'ecs_helper/common_helper'
|
11
|
+
autoload :ClusterHelper, 'ecs_helper/cluster_helper'
|
12
|
+
autoload :ServiceHelper, 'ecs_helper/service_helper'
|
13
|
+
autoload :Command, 'ecs_helper/command'
|
14
|
+
|
15
|
+
def_delegators :client, :task_definitions, :clusters, :services, :tasks, :repositories, :repositories, :task_definition
|
16
|
+
def_delegators :common_helper, :version, :branch, :environment, :project, :application
|
17
|
+
def_delegators :cluster_helper, :current_cluster, :clusters
|
18
|
+
def_delegators :service_helper, :current_service, :services, :update_service
|
19
|
+
def_delegators :command, :run, :options, :type
|
20
|
+
|
21
|
+
def initialize
|
22
|
+
@client = Client.new
|
23
|
+
@common_helper = CommonHelper.new(self)
|
24
|
+
@cluster_helper = ClusterHelper.new(self)
|
25
|
+
@service_helper = ServiceHelper.new(self)
|
26
|
+
@command = Command.new(self)
|
27
|
+
end
|
28
|
+
end
|
metadata
ADDED
@@ -0,0 +1,194 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ecs_helper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Artem Petrov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-06-13 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: aws-sdk-ecs
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.80'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '1.80'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.80'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '1.80'
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: aws-sdk-ecr
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '1.42'
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '1.42'
|
43
|
+
type: :runtime
|
44
|
+
prerelease: false
|
45
|
+
version_requirements: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '1.42'
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '1.42'
|
53
|
+
- !ruby/object:Gem::Dependency
|
54
|
+
name: json
|
55
|
+
requirement: !ruby/object:Gem::Requirement
|
56
|
+
requirements:
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '2.5'
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '2.5'
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '2.5'
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '2.5'
|
73
|
+
- !ruby/object:Gem::Dependency
|
74
|
+
name: thor
|
75
|
+
requirement: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - "~>"
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '1.1'
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.1'
|
83
|
+
type: :runtime
|
84
|
+
prerelease: false
|
85
|
+
version_requirements: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1.1'
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '1.1'
|
93
|
+
- !ruby/object:Gem::Dependency
|
94
|
+
name: colorize
|
95
|
+
requirement: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - "~>"
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0.8'
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0.8'
|
103
|
+
type: :runtime
|
104
|
+
prerelease: false
|
105
|
+
version_requirements: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - "~>"
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0.8'
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0.8'
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: docker-api
|
115
|
+
requirement: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - "~>"
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '2.1'
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '2.1'
|
123
|
+
type: :runtime
|
124
|
+
prerelease: false
|
125
|
+
version_requirements: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - "~>"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: '2.1'
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '2.1'
|
133
|
+
- !ruby/object:Gem::Dependency
|
134
|
+
name: terrapin
|
135
|
+
requirement: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - "~>"
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '0.6'
|
140
|
+
- - ">="
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0.6'
|
143
|
+
type: :runtime
|
144
|
+
prerelease: false
|
145
|
+
version_requirements: !ruby/object:Gem::Requirement
|
146
|
+
requirements:
|
147
|
+
- - "~>"
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0.6'
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0.6'
|
153
|
+
description: A simple gem which make CI CD process easier for AWS ECS service
|
154
|
+
email: artem.petrov@dualbootpartners.com
|
155
|
+
executables:
|
156
|
+
- ecs_helper
|
157
|
+
extensions: []
|
158
|
+
extra_rdoc_files: []
|
159
|
+
files:
|
160
|
+
- bin/ecs_helper
|
161
|
+
- lib/ecs_helper.rb
|
162
|
+
- lib/ecs_helper/client.rb
|
163
|
+
- lib/ecs_helper/cluster_helper.rb
|
164
|
+
- lib/ecs_helper/command.rb
|
165
|
+
- lib/ecs_helper/command/base.rb
|
166
|
+
- lib/ecs_helper/command/build_and_push.rb
|
167
|
+
- lib/ecs_helper/command/deploy.rb
|
168
|
+
- lib/ecs_helper/common_helper.rb
|
169
|
+
- lib/ecs_helper/logging.rb
|
170
|
+
- lib/ecs_helper/service_helper.rb
|
171
|
+
homepage: https://rubygems.org/gems/ecs_helper
|
172
|
+
licenses:
|
173
|
+
- MIT
|
174
|
+
metadata: {}
|
175
|
+
post_install_message:
|
176
|
+
rdoc_options: []
|
177
|
+
require_paths:
|
178
|
+
- lib
|
179
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
180
|
+
requirements:
|
181
|
+
- - ">="
|
182
|
+
- !ruby/object:Gem::Version
|
183
|
+
version: '0'
|
184
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
185
|
+
requirements:
|
186
|
+
- - ">="
|
187
|
+
- !ruby/object:Gem::Version
|
188
|
+
version: '0'
|
189
|
+
requirements: []
|
190
|
+
rubygems_version: 3.1.6
|
191
|
+
signing_key:
|
192
|
+
specification_version: 4
|
193
|
+
summary: ECSHelper
|
194
|
+
test_files: []
|