ecs_helper 0.0.2
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 +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: []
|