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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4331af9c4aba2f153ac4009465fdd904d50037036f8e22d9dc8eaf7bcc15207a
4
- data.tar.gz: 740a3c2bdcba00f1e225f3ccf42382aa487699f477c39f81ac48a100b2fe945e
3
+ metadata.gz: 53201d5487d8074486f75afc6e14e3078240714b721e84f32405c41a8fe64b16
4
+ data.tar.gz: 546cfdd56445e30f6c2791970fa9ad04921075895ba1bee7601f7570d2b06873
5
5
  SHA512:
6
- metadata.gz: 05dd46b7d5927bbc87112edcac6243ea58e97ba4adf7c0e1e1c7ca567bf141abbcc5d834d13b9f3552e5491ee5b2403ad4d8da62fc418c10977595e633a7f512
7
- data.tar.gz: 4fda387373a698325af11d1ba3b50d1aab61c901d7044248144f945436ae45c3361a96a16953f6d49e1f6c572abb05272caf90ae5711c17be856facb9b5d61b4
6
+ metadata.gz: 030546c273054b55929bf1d0f22ff4602a122985dd90757ee45dabc1cf2dbaca605236231c9fd195172121b49364d38efd44a730be65e00379341b718ddda24d
7
+ data.tar.gz: 4a072047fa10c03bafae95f8f8eb9e3d73197c924615fbe77058906e9480b7e60cc1d492ed645c9eb132e78a2812491f0cfbc822d744c5b29ba32dec6acf512f
@@ -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.
@@ -12,7 +12,7 @@
12
12
  <% if @container_port %>
13
13
  "portMappings": [
14
14
  {
15
- "containerPort": "<%= @container_port %>",
15
+ "containerPort": <%= @container_port %>,
16
16
  "protocol": "tcp"
17
17
  }
18
18
  ],
@@ -14,7 +14,7 @@
14
14
  <% if @container_port %>
15
15
  "portMappings": [
16
16
  {
17
- "containerPort": "<%= @container_port %>",
17
+ "containerPort": <%= @container_port %>,
18
18
  "protocol": "tcp"
19
19
  }
20
20
  ],
@@ -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 - includes the tag
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']
@@ -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 if auth.ecr_image?
43
+ auth.update
42
44
  end
43
45
 
44
46
  # full_image - does not include the tag
@@ -23,6 +23,9 @@ module Ufo
23
23
  end
24
24
 
25
25
  def update
26
+ # wont update auth token unless the image being pushed in the ECR image format
27
+ return unless ecr_image?
28
+
26
29
  auth_token = fetch_auth_token
27
30
  if File.exist?(docker_config)
28
31
  data = JSON.load(IO.read(docker_config))
@@ -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
@@ -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
- response = ecs.update_service(params)
252
- service = response.service # must set service here since this might never be called if @wait_for_deployment is false
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
@@ -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
- puts message unless @options[:mute]
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)
@@ -1,4 +1,4 @@
1
- <%%
1
+ <%
2
2
  # replace with actual values:
3
3
  @subnets = ["subnet-111","subnet-222"]
4
4
  @security_groups = ["sg-111"]
@@ -1,3 +1,3 @@
1
1
  module Ufo
2
- VERSION = "3.4.3"
2
+ VERSION = "3.4.4"
3
3
  end
@@ -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.3
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-18 00:00:00.000000000 Z
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
File without changes