ecs_helper 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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: []