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 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,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'ecs_helper'
4
+
5
+ helper = ECSHelper.new
6
+ helper.run
@@ -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,16 @@
1
+ module ECSHelper::Logging
2
+ def log(title, message = nil, color = "light_white")
3
+ if message
4
+ puts title.send(color)
5
+ puts message
6
+ else
7
+ puts title
8
+ end
9
+ end
10
+
11
+ def error(message)
12
+ puts "Error".red
13
+ puts message
14
+ exit
15
+ end
16
+ 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: []