ufo 3.4.3 → 3.4.4
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 +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +4 -0
- data/lib/template/.ufo/templates/fargate.json.erb +1 -1
- data/lib/template/.ufo/templates/main.json.erb +1 -1
- data/lib/ufo/docker/builder.rb +31 -1
- data/lib/ufo/docker/pusher.rb +3 -1
- data/lib/ufo/ecr/auth.rb +3 -0
- data/lib/ufo/param.rb +17 -0
- data/lib/ufo/ship.rb +28 -21
- data/lib/ufo/tasks/register.rb +8 -1
- data/lib/ufo/upgrade/params.yml +1 -1
- data/lib/ufo/version.rb +1 -1
- data/spec/fixtures/dockerfiles/dockerhub/Dockerfile +1 -0
- data/spec/fixtures/dockerfiles/ecr/Dockerfile +1 -0
- data/spec/lib/builder_spec.rb +23 -0
- metadata +8 -3
- data/lib/ufo/deploy.rb +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53201d5487d8074486f75afc6e14e3078240714b721e84f32405c41a8fe64b16
|
4
|
+
data.tar.gz: 546cfdd56445e30f6c2791970fa9ad04921075895ba1bee7601f7570d2b06873
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 030546c273054b55929bf1d0f22ff4602a122985dd90757ee45dabc1cf2dbaca605236231c9fd195172121b49364d38efd44a730be65e00379341b718ddda24d
|
7
|
+
data.tar.gz: 4a072047fa10c03bafae95f8f8eb9e3d73197c924615fbe77058906e9480b7e60cc1d492ed645c9eb132e78a2812491f0cfbc822d744c5b29ba32dec6acf512f
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,12 @@
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
This project *tries* to adhere to [Semantic Versioning](http://semver.org/), even before v1.0.
|
5
5
|
|
6
|
+
## [3.4.4]
|
7
|
+
- Merge pull request #34 from tongueroo/show-aws-cli-commands
|
8
|
+
- Show equivalent cli commands when possible
|
9
|
+
- Automatically auth ECR when Dockerfiles has ECR image in FROM instruction
|
10
|
+
- Fix upgrade task and provide user with warning message for 3.4.x version.
|
11
|
+
|
6
12
|
## [3.4.3]
|
7
13
|
- remove debugging puts
|
8
14
|
|
data/README.md
CHANGED
@@ -56,3 +56,7 @@ Congratulations, you have successfully used ufo to deploy to an ECS service.
|
|
56
56
|
## Contributing
|
57
57
|
|
58
58
|
Bug reports and pull requests are welcome on GitHub at [https://github.com/tongueroo/ufo/issues](https://github.com/tongueroo/ufo/issues).
|
59
|
+
|
60
|
+
### QA Checklist
|
61
|
+
|
62
|
+
[QA Checklist](https://github.com/tongueroo/ufo/wiki/QA-Checklist) is a good list of things to check.
|
data/lib/ufo/docker/builder.rb
CHANGED
@@ -23,6 +23,8 @@ class Ufo::Docker
|
|
23
23
|
start_time = Time.now
|
24
24
|
store_full_image_name
|
25
25
|
|
26
|
+
update_auth_token
|
27
|
+
|
26
28
|
command = "docker build -t #{full_image_name} -f #{@dockerfile} ."
|
27
29
|
say "Building docker image with:".green
|
28
30
|
say " #{command}".green
|
@@ -38,6 +40,32 @@ class Ufo::Docker
|
|
38
40
|
say "Docker image #{full_image_name} built. " + "Took #{pretty_time(took)}.".green
|
39
41
|
end
|
40
42
|
|
43
|
+
# Parse Dockerfile for FROM instruction. If the starting image is from an ECR
|
44
|
+
# repository, it's likely an private image so we authorize ECR for pulling.
|
45
|
+
def update_auth_token
|
46
|
+
ecr_image_names = ecr_image_names("#{Ufo.root}/#{@dockerfile}")
|
47
|
+
return if ecr_image_names.empty?
|
48
|
+
|
49
|
+
ecr_image_names.each do |ecr_image_name|
|
50
|
+
auth = Ufo::Ecr::Auth.new(ecr_image_name)
|
51
|
+
# wont update auth token unless the image being pushed in the ECR image format
|
52
|
+
auth.update
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def ecr_image_names(path)
|
57
|
+
from_image_names(path).select { |i| i =~ /\.amazonaws\.com/ }
|
58
|
+
end
|
59
|
+
|
60
|
+
def from_image_names(path)
|
61
|
+
lines = IO.readlines(path)
|
62
|
+
froms = lines.select { |l| l =~ /^FROM/ }
|
63
|
+
froms.map do |l|
|
64
|
+
md = l.match(/^FROM (.*)/)
|
65
|
+
md[1]
|
66
|
+
end.compact
|
67
|
+
end
|
68
|
+
|
41
69
|
def pusher
|
42
70
|
@pusher ||= Pusher.new(full_image_name, @options)
|
43
71
|
end
|
@@ -54,7 +82,9 @@ class Ufo::Docker
|
|
54
82
|
settings["image"]
|
55
83
|
end
|
56
84
|
|
57
|
-
# full_image -
|
85
|
+
# full_image - Includes the tag. Examples:
|
86
|
+
# 123456789.dkr.ecr.us-west-2.amazonaws.com/myapp:ufo-2018-04-20T09-29-08-b7d51df
|
87
|
+
# tongueroo/hi:ufo-2018-04-20T09-29-08-b7d51df
|
58
88
|
def full_image_name
|
59
89
|
return generate_name if @options[:generate]
|
60
90
|
return "tongueroo/hi:ufo-12345678" if ENV['TEST']
|
data/lib/ufo/docker/pusher.rb
CHANGED
@@ -8,6 +8,8 @@ class Ufo::Docker
|
|
8
8
|
attr_reader :last_image_name
|
9
9
|
def initialize(image, options)
|
10
10
|
@options = options
|
11
|
+
# full_image_name ultimately uses @options, so @last_image_name assignment
|
12
|
+
# line must be defined after setting @options.
|
11
13
|
@last_image_name = image || full_image_name
|
12
14
|
end
|
13
15
|
|
@@ -38,7 +40,7 @@ class Ufo::Docker
|
|
38
40
|
def update_auth_token
|
39
41
|
auth = Ufo::Ecr::Auth.new(last_image_name)
|
40
42
|
# wont update auth token unless the image being pushed in the ECR image format
|
41
|
-
auth.update
|
43
|
+
auth.update
|
42
44
|
end
|
43
45
|
|
44
46
|
# full_image - does not include the tag
|
data/lib/ufo/ecr/auth.rb
CHANGED
data/lib/ufo/param.rb
CHANGED
@@ -15,10 +15,27 @@ module Ufo
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def data
|
18
|
+
upgrade_message!
|
19
|
+
|
18
20
|
vars = Ufo::TemplateScope.new(helper).assign_instance_variables
|
19
21
|
result = RenderMePretty.result(@params_path, vars)
|
20
22
|
YAML.load(result)
|
21
23
|
end
|
22
24
|
memoize :data
|
25
|
+
|
26
|
+
# Ufo version 3.3 to 3.4 added a concept of a .ufo/params.yml file to support
|
27
|
+
# fargate: https://github.com/tongueroo/ufo/pull/31
|
28
|
+
#
|
29
|
+
# Warn user and tell them to run the `ufo upgrade3_3_to_3_4` command to upgrade.
|
30
|
+
def upgrade_message!
|
31
|
+
return if File.exist?(@params_path)
|
32
|
+
|
33
|
+
puts "ERROR: Your project is missing the .ufo/params.yml.".colorize(:red)
|
34
|
+
puts "This was added in ufo version 3.4 for Fargate support: https://github.com/tongueroo/ufo/pull/31"
|
35
|
+
puts "You can find more info about the params file here: http://ufoships.com/docs/params/"
|
36
|
+
puts "To upgrade run:"
|
37
|
+
puts " ufo upgrade3_3_to_3_4"
|
38
|
+
exit 1
|
39
|
+
end
|
23
40
|
end
|
24
41
|
end
|
data/lib/ufo/ship.rb
CHANGED
@@ -125,25 +125,6 @@ module Ufo
|
|
125
125
|
[deployed_service.service_name, took]
|
126
126
|
end
|
127
127
|
|
128
|
-
def wait_for_all_deployments(deployed_services)
|
129
|
-
start_time = Time.now
|
130
|
-
threads = deployed_services.map do |deployed_service|
|
131
|
-
Thread.new do
|
132
|
-
# http://stackoverflow.com/questions/1383390/how-can-i-return-a-value-from-a-thread-in-ruby
|
133
|
-
Thread.current[:output] = wait_for_deployment(deployed_service, quiet=true)
|
134
|
-
end
|
135
|
-
end
|
136
|
-
threads.each { |t| t.join }
|
137
|
-
total_took = Time.now - start_time
|
138
|
-
puts ""
|
139
|
-
puts "Shipments for all #{deployed_service.size} services took a total of #{pretty_time(total_took).green}."
|
140
|
-
puts "Each deployment took:"
|
141
|
-
threads.each do |t|
|
142
|
-
service_name, took = t[:output]
|
143
|
-
puts " #{service_name}: #{pretty_time(took)}"
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
128
|
# used for polling
|
148
129
|
# must pass in a service and cannot use @service for the case of multi_services mode
|
149
130
|
def find_updated_service(service)
|
@@ -214,15 +195,35 @@ module Ufo
|
|
214
195
|
unless target_group.nil? || target_group.empty?
|
215
196
|
add_load_balancer!(container, options, target_group)
|
216
197
|
end
|
198
|
+
|
217
199
|
puts "Creating ECS service with params:"
|
218
200
|
display_params(options)
|
201
|
+
show_aws_cli_command(:create, options)
|
219
202
|
response = ecs.create_service(options)
|
220
203
|
service = response.service # must set service here since this might never be called if @wait_for_deployment is false
|
221
204
|
end
|
205
|
+
|
222
206
|
puts message unless @options[:mute]
|
223
207
|
service
|
224
208
|
end
|
225
209
|
|
210
|
+
def show_aws_cli_command(action, params)
|
211
|
+
puts "Equivalent aws cli command:"
|
212
|
+
# Use .ufo/data instead of .ufo/output because output files all get looped
|
213
|
+
# through as part of `ufo tasks register`
|
214
|
+
rel_path = ".ufo/data/#{action}-params.json"
|
215
|
+
output_path = "#{Ufo.root}/#{rel_path}"
|
216
|
+
FileUtils.rm_f(output_path)
|
217
|
+
|
218
|
+
# Thanks: https://www.mnishiguchi.com/2017/11/29/rails-hash-camelize-and-underscore-keys/
|
219
|
+
params = params.deep_transform_keys { |key| key.to_s.camelize(:lower) }
|
220
|
+
json = JSON.pretty_generate(params)
|
221
|
+
IO.write(output_path, json)
|
222
|
+
|
223
|
+
file_path = "file://#{rel_path}"
|
224
|
+
puts " aws ecs #{action}-service --cli-input-json #{file_path}".colorize(:green)
|
225
|
+
end
|
226
|
+
|
226
227
|
# $ aws ecs update-service --generate-cli-skeleton
|
227
228
|
# {
|
228
229
|
# "cluster": "",
|
@@ -248,9 +249,14 @@ module Ufo
|
|
248
249
|
params = params.merge(default_params[:update_service] || {})
|
249
250
|
puts "Updating ECS service with params:"
|
250
251
|
display_params(params)
|
251
|
-
|
252
|
-
|
252
|
+
show_aws_cli_command(:update, params)
|
253
|
+
|
254
|
+
unless @options[:noop]
|
255
|
+
response = ecs.update_service(params)
|
256
|
+
service = response.service # must set service here since this might never be called if @wait_for_deployment is false
|
257
|
+
end
|
253
258
|
end
|
259
|
+
|
254
260
|
puts message unless @options[:mute]
|
255
261
|
service
|
256
262
|
end
|
@@ -366,6 +372,7 @@ module Ufo
|
|
366
372
|
# TODO: Aad Waiter logic, sometimes the cluster does not exist by the time
|
367
373
|
# we create the service
|
368
374
|
end
|
375
|
+
|
369
376
|
puts message unless @options[:mute]
|
370
377
|
end
|
371
378
|
end
|
data/lib/ufo/tasks/register.rb
CHANGED
@@ -24,13 +24,20 @@ module Ufo
|
|
24
24
|
def register
|
25
25
|
data = JSON.parse(IO.read(@template_definition_path))
|
26
26
|
data = rubyize_format(data)
|
27
|
+
|
27
28
|
message = "#{data[:family]} task definition registered."
|
28
29
|
if @options[:noop]
|
29
30
|
message = "NOOP: #{message}"
|
30
31
|
else
|
31
32
|
register_task_definition(data)
|
32
33
|
end
|
33
|
-
|
34
|
+
|
35
|
+
unless @options[:mute]
|
36
|
+
puts "Equivalent aws cli command:"
|
37
|
+
file_path = "file://#{@template_definition_path.sub(/^\.\//,'')}"
|
38
|
+
puts " aws ecs register-task-definition --cli-input-json #{file_path}".colorize(:green)
|
39
|
+
puts message
|
40
|
+
end
|
34
41
|
end
|
35
42
|
|
36
43
|
def register_task_definition(data)
|
data/lib/ufo/upgrade/params.yml
CHANGED
data/lib/ufo/version.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
FROM ruby:2.5.0
|
@@ -0,0 +1 @@
|
|
1
|
+
FROM 123456789.dkr.ecr.us-west-2.amazonaws.com/myapp:ufo-2018-04-20T09-29-08-b7d51df
|
@@ -0,0 +1,23 @@
|
|
1
|
+
describe Ufo::Docker::Builder do
|
2
|
+
before(:all) do
|
3
|
+
create_ufo_project
|
4
|
+
end
|
5
|
+
|
6
|
+
let(:builder) { Ufo::Docker::Builder.new }
|
7
|
+
|
8
|
+
context "dockerfile uses ecr image for FROM instruction" do
|
9
|
+
it "updates the auth token before building the image" do
|
10
|
+
# builder.from_ecr_image?("spec/fixtures/dockerfiles/dockerhub/Dockerfile")
|
11
|
+
names = builder.ecr_image_names("spec/fixtures/dockerfiles/ecr/Dockerfile")
|
12
|
+
expect(names).not_to be_empty
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "dockerfile uses dockerhub image for FROM instruction" do
|
17
|
+
it "does not update the auth token before building the image" do
|
18
|
+
# builder.from_ecr_image?("spec/fixtures/dockerfiles/dockerhub/Dockerfile")
|
19
|
+
names = builder.ecr_image_names("spec/fixtures/dockerfiles/dockerhub/Dockerfile")
|
20
|
+
expect(names).to be_empty
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ufo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.4.
|
4
|
+
version: 3.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tung Nguyen
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04-
|
11
|
+
date: 2018-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-cloudwatchlogs
|
@@ -393,7 +393,6 @@ files:
|
|
393
393
|
- lib/ufo/core.rb
|
394
394
|
- lib/ufo/default/settings.yml
|
395
395
|
- lib/ufo/default/templates/main.json.erb
|
396
|
-
- lib/ufo/deploy.rb
|
397
396
|
- lib/ufo/destroy.rb
|
398
397
|
- lib/ufo/docker.rb
|
399
398
|
- lib/ufo/docker/builder.rb
|
@@ -448,9 +447,12 @@ files:
|
|
448
447
|
- lib/ufo/upgrade33_to_34.rb
|
449
448
|
- lib/ufo/util.rb
|
450
449
|
- lib/ufo/version.rb
|
450
|
+
- spec/fixtures/dockerfiles/dockerhub/Dockerfile
|
451
|
+
- spec/fixtures/dockerfiles/ecr/Dockerfile
|
451
452
|
- spec/fixtures/home_existing/.aws/config
|
452
453
|
- spec/fixtures/home_existing/.docker/config.json
|
453
454
|
- spec/fixtures/settings.yml
|
455
|
+
- spec/lib/builder_spec.rb
|
454
456
|
- spec/lib/cli_spec.rb
|
455
457
|
- spec/lib/completion_spec.rb
|
456
458
|
- spec/lib/core_spec.rb
|
@@ -487,9 +489,12 @@ signing_key:
|
|
487
489
|
specification_version: 4
|
488
490
|
summary: Build Docker Containers and Ship Them to AWS ECS
|
489
491
|
test_files:
|
492
|
+
- spec/fixtures/dockerfiles/dockerhub/Dockerfile
|
493
|
+
- spec/fixtures/dockerfiles/ecr/Dockerfile
|
490
494
|
- spec/fixtures/home_existing/.aws/config
|
491
495
|
- spec/fixtures/home_existing/.docker/config.json
|
492
496
|
- spec/fixtures/settings.yml
|
497
|
+
- spec/lib/builder_spec.rb
|
493
498
|
- spec/lib/cli_spec.rb
|
494
499
|
- spec/lib/completion_spec.rb
|
495
500
|
- spec/lib/core_spec.rb
|
data/lib/ufo/deploy.rb
DELETED
File without changes
|