ufo 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/.rspec +3 -0
  4. data/CHANGELOG.md +12 -0
  5. data/Gemfile +6 -0
  6. data/Gemfile.lock +128 -0
  7. data/Guardfile +12 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +227 -0
  10. data/Rakefile +6 -0
  11. data/bin/ufo +10 -0
  12. data/lib/starter_project/.env.prod +3 -0
  13. data/lib/starter_project/Dockerfile +20 -0
  14. data/lib/starter_project/bin/deploy +12 -0
  15. data/lib/starter_project/ufo/settings.yml +7 -0
  16. data/lib/starter_project/ufo/task_definitions.rb +44 -0
  17. data/lib/starter_project/ufo/templates/main.json.erb +39 -0
  18. data/lib/ufo.rb +26 -0
  19. data/lib/ufo/aws_services.rb +21 -0
  20. data/lib/ufo/cli.rb +136 -0
  21. data/lib/ufo/cli/help.rb +164 -0
  22. data/lib/ufo/defaults.rb +46 -0
  23. data/lib/ufo/destroy.rb +60 -0
  24. data/lib/ufo/docker_builder.rb +120 -0
  25. data/lib/ufo/docker_cleaner.rb +52 -0
  26. data/lib/ufo/dockerfile_updater.rb +42 -0
  27. data/lib/ufo/dsl.rb +93 -0
  28. data/lib/ufo/dsl/helper.rb +47 -0
  29. data/lib/ufo/dsl/outputter.rb +40 -0
  30. data/lib/ufo/dsl/task_definition.rb +65 -0
  31. data/lib/ufo/ecr_auth.rb +35 -0
  32. data/lib/ufo/ecr_cleaner.rb +66 -0
  33. data/lib/ufo/execute.rb +19 -0
  34. data/lib/ufo/init.rb +83 -0
  35. data/lib/ufo/pretty_time.rb +14 -0
  36. data/lib/ufo/scale.rb +34 -0
  37. data/lib/ufo/settings.rb +33 -0
  38. data/lib/ufo/ship.rb +436 -0
  39. data/lib/ufo/tasks_builder.rb +30 -0
  40. data/lib/ufo/tasks_register.rb +51 -0
  41. data/lib/ufo/templates/default.json.erb +39 -0
  42. data/lib/ufo/version.rb +3 -0
  43. data/spec/fixtures/home_existing/.docker/config.json +10 -0
  44. data/spec/lib/cli_spec.rb +50 -0
  45. data/spec/lib/ecr_auth_spec.rb +39 -0
  46. data/spec/lib/ecr_cleaner_spec.rb +32 -0
  47. data/spec/lib/ship_spec.rb +77 -0
  48. data/spec/spec_helper.rb +28 -0
  49. data/ufo.gemspec +34 -0
  50. metadata +267 -0
@@ -0,0 +1,30 @@
1
+ module Ufo
2
+ autoload :DSL, 'ufo/dsl'
3
+
4
+ class TasksBuilder
5
+ def initialize(options={})
6
+ @options = options
7
+ @project_root = options[:project_root] || '.'
8
+ end
9
+
10
+ def build
11
+ puts "Building Task Definitions...".green unless @options[:mute]
12
+ check_templates_definitions_path
13
+ dsl = DSL.new(template_definitions_path, @options.merge(quiet: true, mute: true))
14
+ dsl.run
15
+ puts "Task Definitions built in ufo/output." unless @options[:mute]
16
+ end
17
+
18
+ def check_templates_definitions_path
19
+ unless File.exist?(template_definitions_path)
20
+ pretty_path = template_definitions_path.sub("#{@project_root}/", '')
21
+ puts "ERROR: #{pretty_path} does not exist. Run: `ufo init` to create a starter file" unless @options[:mute]
22
+ exit 1
23
+ end
24
+ end
25
+
26
+ def template_definitions_path
27
+ "#{@project_root}/ufo/task_definitions.rb"
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,51 @@
1
+ require 'plissken' # Hash#to_snake_keys
2
+ require 'json'
3
+
4
+ module Ufo
5
+ class TasksRegister
6
+ include AwsServices
7
+
8
+ def self.register(task_name, options={})
9
+ project_root = options[:project_root] || '.'
10
+ Dir.glob("#{project_root}/ufo/output/*").each do |path|
11
+ if task_name == :all or path.include?(task_name)
12
+ task_register = TasksRegister.new(path, options)
13
+ task_register.register
14
+ end
15
+ end
16
+ end
17
+
18
+ def initialize(template_definition_path, options={})
19
+ @template_definition_path = template_definition_path
20
+ @options = options
21
+ end
22
+
23
+ # aws ecs register-task-definition --cli-input-json file://ufo/output/hi-web-prod.json
24
+ def register
25
+ data = JSON.parse(IO.read(@template_definition_path), symbolize_names: true)
26
+ data = data.to_snake_keys
27
+ data = fix_log_configuation_option(data)
28
+ message = "#{data[:family]} task definition registered."
29
+ if @options[:noop]
30
+ message = "NOOP: #{message}"
31
+ else
32
+ ecs.register_task_definition(data)
33
+ end
34
+ puts message unless @options[:mute]
35
+ end
36
+
37
+ # LogConfiguration requires a string with dashes as the keys
38
+ # https://docs.aws.amazon.com/sdkforruby/api/Aws/ECS/Client.html
39
+ def fix_log_configuation_option(data)
40
+ definitions = data[:container_definitions]
41
+ definitions.each do |definition|
42
+ next unless definition[:log_configuration]
43
+ options = definition[:log_configuration][:options]
44
+ options["awslogs-group"] = options.delete(:awslogs_group)
45
+ options["awslogs-region"] = options.delete(:awslogs_region)
46
+ options["awslogs-stream-prefix"] = options.delete(:awslogs_stream_prefix)
47
+ end
48
+ data
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,39 @@
1
+ {
2
+ "family": "<%= @family %>",
3
+ "containerDefinitions": [
4
+ {
5
+ "name": "<%= @name %>",
6
+ "image": "<%= @image %>",
7
+ "cpu": <%= @cpu %>,
8
+ <% if @memory %>
9
+ "memory": <%= @memory %>,
10
+ <% end %>
11
+ <% if @memory_reservation %>
12
+ "memoryReservation": <%= @memory_reservation %>,
13
+ <% end %>
14
+ <% if @container_port %>
15
+ "portMappings": [
16
+ {
17
+ "containerPort": <%= @container_port %>,
18
+ "protocol": "tcp"
19
+ }
20
+ ],
21
+ <% end %>
22
+ "command": <%= @command.to_json %>,
23
+ <% if @environment %>
24
+ "environment": <%= @environment.to_json %>,
25
+ <% end %>
26
+ <% if @awslogs_group %>
27
+ "logConfiguration": {
28
+ "logDriver": "awslogs",
29
+ "options": {
30
+ "awslogs-group": "<%= @awslogs_group %>",
31
+ "awslogs-region": "<%= @awslogs_region || 'us-east-1' %>",
32
+ "awslogs-stream-prefix": "<%= @awslogs_stream_prefix %>"
33
+ }
34
+ },
35
+ <% end %>
36
+ "essential": true
37
+ }
38
+ ]
39
+ }
@@ -0,0 +1,3 @@
1
+ module Ufo
2
+ VERSION = "0.0.6"
3
+ end
@@ -0,0 +1,10 @@
1
+ {
2
+ "auths": {
3
+ "https://123456789.dkr.ecr.us-east-1.amazonaws.com": {
4
+ "auth": "crazylongawsecrtoken"
5
+ },
6
+ "https://index.docker.io/v1/": {
7
+ "auth": "dockerhubtoken"
8
+ }
9
+ }
10
+ }
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ # to run specs with what's remembered from vcr
4
+ # $ rake
5
+ #
6
+ # to run specs with new fresh data from aws api calls
7
+ # $ rake clean:vcr ; time rake
8
+ describe Ufo::CLI do
9
+ before(:all) do
10
+ create_starter_project_fixture
11
+ project_root = File.expand_path("../../fixtures/hi", __FILE__)
12
+ @args = "--noop --project-root=#{project_root}"
13
+ end
14
+
15
+ describe "ufo" do
16
+ context "docker" do
17
+ it "build builds image" do
18
+ out = execute("bin/ufo docker build #{@args}")
19
+ expect(out).to include("docker build -t tongueroo/hi")
20
+ end
21
+
22
+ it "tag shows the tag" do
23
+ out = execute("bin/ufo docker full_image_name #{@args}")
24
+ expect(out).to match(%r{tongueroo/hi:ufo-.{7}})
25
+ end
26
+ end
27
+
28
+ context "tasks" do
29
+ it "build builds task definition" do
30
+ out = execute("bin/ufo tasks build #{@args}")
31
+ expect(out).to include("Task Definitions built.")
32
+ end
33
+
34
+ it "register it registers all the output task definitions" do
35
+ out = execute("bin/ufo tasks register #{@args}")
36
+ expect(out).to include("register")
37
+ end
38
+ end
39
+
40
+ context "ship" do
41
+ it "deploys software" do
42
+ out = execute("bin/ufo ship hi-web-prod #{@args} --no-wait")
43
+ # cannot look for Software shipped! because
44
+ # ship.deploy unless ENV['TEST'] # to allow me to quickly test CLI portion only
45
+ # just testing the CLI portion. The ship class itself is tested via ship_spec.rb
46
+ expect(out).to include("Task Definitions built")
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ufo::EcrAuth do
4
+ let(:repo_domain) { "https://123456789.dkr.ecr.us-east-1.amazonaws.com" }
5
+ let(:auth) { Ufo::EcrAuth.new(repo_domain) }
6
+ before(:each) do
7
+ allow(auth).to receive(:fetch_auth_token).and_return("opensesame")
8
+ end
9
+
10
+ context("update") do
11
+ before(:each) do
12
+ clean_home
13
+ ENV['HOME'] = "spec/fixtures/home"
14
+ end
15
+
16
+ context("missing ~/.docker/config.json") do
17
+ it "should create the auth token" do
18
+ auth.update
19
+ data = JSON.load(IO.read("spec/fixtures/home/.docker/config.json"))
20
+ auth_token = data["auths"][repo_domain]["auth"]
21
+ expect(auth_token).to eq("opensesame")
22
+ end
23
+ end
24
+
25
+ context("existing ~/.docker/config.json") do
26
+ it "should update the auth token" do
27
+ FileUtils.cp_r("spec/fixtures/home_existing", "spec/fixtures/home")
28
+ auth.update
29
+ data = JSON.load(IO.read("spec/fixtures/home/.docker/config.json"))
30
+ auth_token = data["auths"][repo_domain]["auth"]
31
+ expect(auth_token).to eq("opensesame")
32
+ end
33
+ end
34
+ end
35
+
36
+ def clean_home
37
+ FileUtils.rm_rf("spec/fixtures/home")
38
+ end
39
+ end
@@ -0,0 +1,32 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ufo::EcrCleaner do
4
+ let(:docker_image_name) { "123456789.dkr.ecr.us-east-1.amazonaws.com/my-name" }
5
+ let(:repo_domain) { "https://123456789.dkr.ecr.us-east-1.amazonaws.com" }
6
+ let(:cleaner) { Ufo::EcrCleaner.new(docker_image_name, mute: true) }
7
+ before(:each) do
8
+ allow(cleaner).to receive(:update_auth_token).and_return(:whatever)
9
+ end
10
+
11
+ context("lots of old images") do
12
+ let(:image_tags) { 10.times.map {|i| "ufo-#{i}" }.reverse }
13
+ before(:each) do
14
+ allow(cleaner).to receive(:fetch_image_tags).and_return(image_tags)
15
+ end
16
+
17
+ it "should remove images and keep 3" do
18
+ allow(cleaner).to receive(:ecr).and_return(ecr_stub)
19
+ cleaner.cleanup
20
+ expect(cleaner.ecr).to have_received(:batch_delete_image).with(
21
+ repository_name: "my-name",
22
+ image_ids: [{image_tag: "ufo-6"}, {image_tag: "ufo-5"}, {image_tag: "ufo-4"}, {image_tag: "ufo-3"}, {image_tag: "ufo-2"}, {image_tag: "ufo-1"}, {image_tag: "ufo-0"}]
23
+ )
24
+ end
25
+ end
26
+
27
+ def ecr_stub
28
+ ecr = double("Ecr").as_null_object
29
+ allow(ecr).to receive(:batch_delete_image).and_return(:whatever)
30
+ ecr
31
+ end
32
+ end
@@ -0,0 +1,77 @@
1
+ require 'spec_helper'
2
+
3
+ describe Ufo::Ship do
4
+ let(:project_root) { File.expand_path("../../fixtures/hi", __FILE__) }
5
+ let(:options) do
6
+ {
7
+ noop: true,
8
+ project_root: project_root,
9
+ mute: true,
10
+ wait: false,
11
+ stop_old_tasks: false,
12
+ }
13
+ end
14
+ let(:task_definition) { service }
15
+ let(:ship) { Ufo::Ship.new(service, task_definition, options) }
16
+
17
+ context "single service id" do
18
+ let(:service) { "hi-web-prod" }
19
+ it "should create or update single service" do
20
+ allow(ship).to receive(:process_single_service)
21
+ ship.deploy
22
+ expect(ship).to have_received(:process_single_service)
23
+ end
24
+
25
+ context "0 services found" do
26
+ it "should create service on first cluster" do
27
+ allow(ship).to receive(:find_ecs_service)
28
+ allow(ship).to receive(:create_service)
29
+ ship.deploy
30
+ expect(ship).to have_received(:create_service)
31
+ end
32
+ end
33
+
34
+ context "1 services found" do
35
+ it "should call update service 3 times" do
36
+ allow(ship).to receive(:find_ecs_service).and_return(ecs_service("hi-web-prod"))
37
+ allow(ship).to receive(:update_service)
38
+ ship.deploy
39
+ expect(ship).to have_received(:update_service).exactly(1).times
40
+ end
41
+ end
42
+ end
43
+
44
+ context "multiple service pattern" do
45
+ let(:service) { "hi-.*-prod" }
46
+ it "should update multiple service that are found" do
47
+ allow(ship).to receive(:process_multiple_services)
48
+ ship.deploy
49
+ expect(ship).to have_received(:process_multiple_services)
50
+ end
51
+
52
+ context "0 services found" do
53
+ it "should not call update_service" do
54
+ allow(ship).to receive(:find_all_ecs_services)
55
+ allow(ship).to receive(:update_service)
56
+ ship.deploy
57
+ expect(ship).to_not have_received(:update_service)
58
+ end
59
+ end
60
+
61
+ context "3 services found" do
62
+ it "should call update service 3 times" do
63
+ allow(ship).to receive(:find_all_ecs_services).
64
+ and_yield(ecs_service("hi-web-prod")).
65
+ and_yield(ecs_service("hi-worker-prod")).
66
+ and_yield(ecs_service("hi-clock-prod"))
67
+ allow(ship).to receive(:update_service)
68
+ ship.deploy
69
+ expect(ship).to have_received(:update_service).exactly(3).times
70
+ end
71
+ end
72
+ end
73
+
74
+ def ecs_service(name)
75
+ OpenStruct.new(service_name: name)
76
+ end
77
+ end
@@ -0,0 +1,28 @@
1
+ ENV['TEST'] = '1'
2
+
3
+ require "codeclimate-test-reporter"
4
+ CodeClimate::TestReporter.start
5
+
6
+ require "pp"
7
+ require "byebug"
8
+
9
+ root = File.expand_path('../../', __FILE__)
10
+ require "#{root}/lib/ufo"
11
+
12
+ module Helpers
13
+ def execute(cmd)
14
+ puts "Running: #{cmd}" if ENV['DEBUG']
15
+ out = `#{cmd}`
16
+ puts out if ENV['DEBUG']
17
+ out
18
+ end
19
+
20
+ def create_starter_project_fixture
21
+ FileUtils.rm_rf("spec/fixtures/hi")
22
+ execute("bin/ufo init --cluster prod --image tongueroo/hi --project-root spec/fixtures/hi --app hi")
23
+ end
24
+ end
25
+
26
+ RSpec.configure do |c|
27
+ c.include Helpers
28
+ end
data/ufo.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'ufo/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "ufo"
8
+ spec.version = Ufo::VERSION
9
+ spec.authors = ["Tung Nguyen"]
10
+ spec.email = ["tongueroo@gmail.com"]
11
+ spec.description = %q{Build docker containers and ship them to AWS ECS}
12
+ spec.summary = %q{Build docker containers and ship them to AWS ECS}
13
+ spec.homepage = "https://github.com/tongueroo/ufo"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency "thor"
22
+ spec.add_dependency "hashie"
23
+ spec.add_dependency "colorize"
24
+ spec.add_dependency "byebug"
25
+ spec.add_dependency "deep_merge"
26
+ spec.add_dependency "aws-sdk"
27
+ spec.add_dependency "plissken"
28
+
29
+ spec.add_development_dependency "bundler", "~> 1.3"
30
+ spec.add_development_dependency "rake"
31
+ spec.add_development_dependency "guard"
32
+ spec.add_development_dependency "guard-bundler"
33
+ spec.add_development_dependency "guard-rspec"
34
+ end
metadata ADDED
@@ -0,0 +1,267 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ufo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.6
5
+ platform: ruby
6
+ authors:
7
+ - Tung Nguyen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-11-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: hashie
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: colorize
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: deep_merge
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: aws-sdk
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: plissken
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: bundler
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.3'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.3'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rake
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: guard
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: guard-bundler
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: guard-rspec
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ description: Build docker containers and ship them to AWS ECS
182
+ email:
183
+ - tongueroo@gmail.com
184
+ executables:
185
+ - ufo
186
+ extensions: []
187
+ extra_rdoc_files: []
188
+ files:
189
+ - ".gitignore"
190
+ - ".rspec"
191
+ - CHANGELOG.md
192
+ - Gemfile
193
+ - Gemfile.lock
194
+ - Guardfile
195
+ - LICENSE.txt
196
+ - README.md
197
+ - Rakefile
198
+ - bin/ufo
199
+ - lib/starter_project/.env.prod
200
+ - lib/starter_project/Dockerfile
201
+ - lib/starter_project/bin/deploy
202
+ - lib/starter_project/ufo/settings.yml
203
+ - lib/starter_project/ufo/task_definitions.rb
204
+ - lib/starter_project/ufo/templates/main.json.erb
205
+ - lib/ufo.rb
206
+ - lib/ufo/aws_services.rb
207
+ - lib/ufo/cli.rb
208
+ - lib/ufo/cli/help.rb
209
+ - lib/ufo/defaults.rb
210
+ - lib/ufo/destroy.rb
211
+ - lib/ufo/docker_builder.rb
212
+ - lib/ufo/docker_cleaner.rb
213
+ - lib/ufo/dockerfile_updater.rb
214
+ - lib/ufo/dsl.rb
215
+ - lib/ufo/dsl/helper.rb
216
+ - lib/ufo/dsl/outputter.rb
217
+ - lib/ufo/dsl/task_definition.rb
218
+ - lib/ufo/ecr_auth.rb
219
+ - lib/ufo/ecr_cleaner.rb
220
+ - lib/ufo/execute.rb
221
+ - lib/ufo/init.rb
222
+ - lib/ufo/pretty_time.rb
223
+ - lib/ufo/scale.rb
224
+ - lib/ufo/settings.rb
225
+ - lib/ufo/ship.rb
226
+ - lib/ufo/tasks_builder.rb
227
+ - lib/ufo/tasks_register.rb
228
+ - lib/ufo/templates/default.json.erb
229
+ - lib/ufo/version.rb
230
+ - spec/fixtures/home_existing/.docker/config.json
231
+ - spec/lib/cli_spec.rb
232
+ - spec/lib/ecr_auth_spec.rb
233
+ - spec/lib/ecr_cleaner_spec.rb
234
+ - spec/lib/ship_spec.rb
235
+ - spec/spec_helper.rb
236
+ - ufo.gemspec
237
+ homepage: https://github.com/tongueroo/ufo
238
+ licenses:
239
+ - MIT
240
+ metadata: {}
241
+ post_install_message:
242
+ rdoc_options: []
243
+ require_paths:
244
+ - lib
245
+ required_ruby_version: !ruby/object:Gem::Requirement
246
+ requirements:
247
+ - - ">="
248
+ - !ruby/object:Gem::Version
249
+ version: '0'
250
+ required_rubygems_version: !ruby/object:Gem::Requirement
251
+ requirements:
252
+ - - ">="
253
+ - !ruby/object:Gem::Version
254
+ version: '0'
255
+ requirements: []
256
+ rubyforge_project:
257
+ rubygems_version: 2.5.2
258
+ signing_key:
259
+ specification_version: 4
260
+ summary: Build docker containers and ship them to AWS ECS
261
+ test_files:
262
+ - spec/fixtures/home_existing/.docker/config.json
263
+ - spec/lib/cli_spec.rb
264
+ - spec/lib/ecr_auth_spec.rb
265
+ - spec/lib/ecr_cleaner_spec.rb
266
+ - spec/lib/ship_spec.rb
267
+ - spec/spec_helper.rb