builderator 1.2.2 → 1.2.3.pre.beta.1

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
  SHA1:
3
- metadata.gz: 6783dc56369ee7edcd63e06afb7b6a0cf07e0c4b
4
- data.tar.gz: e2aa20916ffd711e7a4231fe1b27276670241b91
3
+ metadata.gz: 83b75ce26deeb6612ec531be9a548b2b5c43f412
4
+ data.tar.gz: 1622ca8922bb3596167b1341d3f170ec3feba4e5
5
5
  SHA512:
6
- metadata.gz: dc6a8c4e53d14f73a828d43c1cd254fc4d00579b974e60e658bac84915a6dcddb3eaff7038b51702bfa5860bdd757e1c7e821f5f7cddad6339b6f8d5965ff85b
7
- data.tar.gz: 75b80cbbac9da94f87285b8c4056cd8bb3d8f7aa62a69aa6b8cd40aa89e340d08b31e8e04152e859499366a69af9c2eef32886bcd1df603c666c8e7b6a458a97
6
+ metadata.gz: 16cc1d59457a54b2b86e6ae401b1d870fbb768ae3d61aae10a024a1da7927ef444d7721f1423edef5fa6fe9099ef2159c317766340f02a23d827bc7bf6783203
7
+ data.tar.gz: 6d1e30012ec43092c5cd1c3bdab195b1fdc4f6776840367c4b97dbdd7e2630dac6e4a3bc35467f18f25a19c53a6b3b8440e156184fe417619819c0f593b327c0
@@ -23,7 +23,10 @@ module Builderator
23
23
  ## Instantiate List if it doesn't exist yet. `||=` will always return a new Rash.
24
24
  @attributes[attribute_name] = Config::List.new(run_options) unless @attributes.has?(attribute_name, Config::List)
25
25
 
26
- @attributes[attribute_name].set(*arg.flatten) unless arg.empty?
26
+ unless arg.empty?
27
+ @attributes[attribute_name].set(*arg.flatten)
28
+ @attributes[attribute_name].set(*arg) if options[:flatten] == false
29
+ end
27
30
  @attributes[attribute_name]
28
31
  end
29
32
 
@@ -80,6 +80,16 @@ module Builderator
80
80
  end
81
81
  end
82
82
 
83
+ profile :docker do |profile|
84
+ profile.log_level :info
85
+
86
+ profile.packer do |packer|
87
+ packer.build :docker do |build|
88
+ build.type 'docker'
89
+ end
90
+ end
91
+ end
92
+
83
93
  cleaner do |cleaner|
84
94
  cleaner.commit false
85
95
  cleaner.force false
@@ -191,15 +191,46 @@ module Builderator
191
191
  attribute :binary_env
192
192
  end
193
193
 
194
+ collection :provisioner do
195
+ attribute :inline, :type => :list
196
+ attribute :environment_vars, :type => :list
197
+ end
198
+
194
199
  ##
195
200
  # Packerfile
196
201
  #
197
- # This currently supports the AWS/EC2 builder.
202
+ # This currently supports the AWS/EC2 and Docker builders.
198
203
  ##
199
204
  namespace :packer do
200
205
  collection :build do
201
206
  attribute :type
202
207
 
208
+ ## Docker-specific attributes
209
+ # Required
210
+ attribute :image
211
+ # One (and only one) of the following is required
212
+ attribute :commit
213
+ attribute :discard
214
+ attribute :export_path
215
+
216
+ # Optional attributes
217
+ attribute :author
218
+ attribute :aws_access_key
219
+ attribute :aws_secret_key
220
+ attribute :aws_token
221
+ attribute :changes, :type => :list
222
+ attribute :ecr_login
223
+ attribute :login
224
+ attribute :login_email
225
+ attribute :login_username
226
+ attribute :login_password
227
+ attribute :login_server
228
+ attribute :message
229
+ attribute :privileged
230
+ attribute :pull
231
+ attribute :run_command, :type => :list
232
+ attribute :volumes, :type => :hash
233
+
203
234
  ## EC2 Placement and Virtualization parameters
204
235
  attribute :region
205
236
  attribute :availability_zone
@@ -234,6 +265,8 @@ module Builderator
234
265
  ## Assumable role for tagging AMIs in remote accounts
235
266
  attribute :tagging_role
236
267
  end
268
+
269
+ attribute :post_processors, :type => :list, :flatten => false
237
270
  end
238
271
 
239
272
  ##
@@ -14,3 +14,4 @@ module Builderator
14
14
  end
15
15
 
16
16
  require_relative './data/image'
17
+ require_relative './data/ecr'
@@ -0,0 +1,40 @@
1
+ require 'aws-sdk'
2
+ require 'date'
3
+
4
+ require_relative '../../util'
5
+
6
+ module Builderator
7
+ module Control
8
+ # :nodoc:
9
+ module Data
10
+ # Lookup ECR repository info
11
+ #
12
+ # NB. We want to embed the login_server info into the returned repo data for
13
+ # ease of use. Thus, instead of an AWS struct-type, we get a hash with the
14
+ # injected value.
15
+ def self.repository(query = {})
16
+ ECR.search(query).map do |repo|
17
+ repo.to_h.tap { |r| r[:login_server] = "https://#{repo.repository_uri.sub(repo.repository_name, '')}" }
18
+ end
19
+ end
20
+ end
21
+
22
+ ##
23
+ # Find ECR repositories for sources
24
+ ##
25
+ module ECR
26
+ class << self
27
+ def search(query = {})
28
+ options = {}
29
+
30
+ options['repository_names'] = Util.to_array(query.delete('name')) if query.include?('name')
31
+ options['registry_id'] = query.delete('owner') if query.include?('owner')
32
+
33
+ Util.ecr.describe_repositories(options)
34
+ .each_with_object([]) { |page, repositories| repositories.push(*page.repositories) }
35
+ .sort { |a, b| a.repository_name <=> b.repository_name }
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -19,13 +19,27 @@ module Builderator
19
19
  def initialize(*_)
20
20
  super
21
21
 
22
+ docker_builders = Config.profile.current.packer.build.select do |_, builder|
23
+ builder.to_h[:type] == 'docker'
24
+ end
25
+
22
26
  @packerfile ||= {
23
27
  :builders => [],
24
- :provisioners => []
28
+ :provisioners => [],
29
+ 'post-processors' => []
25
30
  }.tap do |json|
26
31
  Config.profile.current.packer.build.each do |_, build|
27
32
  build_hash = build.to_hash.tap do |b|
28
- b[:tags] = Config.profile.current.tags
33
+ b[:tags] = Config.profile.current.tags unless Config.profile.current.tags.empty?
34
+ end
35
+
36
+ if build_hash[:type] == 'docker'
37
+ raise 'The Docker builder requires a base image' unless build_hash.key?(:image)
38
+
39
+ # The Docker builder requires one and only one of 'commit', 'discard', or 'export_path' set
40
+ if build_hash.keys.select { |k| [:commit, :discard, :export_path].include?(k) }.length != 1
41
+ raise 'The Docker builder requires one and only one of `commit`, `discard`, or `export_path` attributes to be defined'
42
+ end
29
43
  end
30
44
 
31
45
  # If we specify encrypted boot, packer won't allow ami_users.
@@ -49,16 +63,41 @@ module Builderator
49
63
  json[:builders] << build_hash
50
64
  end
51
65
 
52
- ## Initialize the staging directory
66
+ # post_processors must be a List of Rashes.
67
+ post_processors = Config.profile.current.packer.post_processors.to_a
68
+ json['post-processors'] = post_processors.first unless post_processors.empty?
69
+ json.delete('post-processors') if json['post-processors'].compact.empty?
70
+
71
+ ## Initialize the staging directory unless using the docker builder
53
72
  json[:provisioners] << {
54
73
  :type => 'shell',
55
74
  :inline => "sudo mkdir -p #{Config.chef.staging_directory}/cache && "\
56
75
  "sudo chown $(whoami) -R #{Config.chef.staging_directory}"
57
- }
58
- end
76
+ } if docker_builders.empty?
77
+
78
+ # Only add artifact provisioners if they're defined
79
+ Config.profile.current.artifact.each do |_, artifact|
80
+ json[:provisioners] << _artifact_provisioner(artifact)
81
+ end unless Config.profile.current.artifact.attributes.empty?
82
+
83
+ # Only add chef provisioners if they're defined
84
+ unless Config.profile.current.chef.attributes.empty?
85
+ # There are certain options (staging directory, run as sudo) that don't apply
86
+ # to the docker builder.
87
+ json[:provisioners] << if docker_builders.empty?
88
+ _chef_provisioner
89
+ else
90
+ _chef_provisioner_docker
91
+ end
92
+ end
93
+
94
+ # After adding the default provisioners, we add any additional ones to the provisioners array
95
+ Config.profile.current.provisioner.each do |name, provisioner|
96
+ json[:provisioners] << provisioner.attributes.tap { |p| p[:type] = name.to_s }
97
+ end
59
98
 
60
- _artifact_provisioners
61
- _chef_provisioner
99
+ json.delete(:provisioners) if json[:provisioners].empty?
100
+ end
62
101
  end
63
102
 
64
103
  def render
@@ -68,18 +107,30 @@ module Builderator
68
107
  private
69
108
 
70
109
  ## Upload artifacts to the build container
71
- def _artifact_provisioners
72
- Config.profile.current.artifact.each do |_, artifact|
73
- packerfile[:provisioners] << {
110
+ def _artifact_provisioner(artifact)
111
+ {
74
112
  :type => 'file',
75
113
  :source => artifact.path,
76
114
  :destination => artifact.destination
77
- }
78
- end
115
+ }
79
116
  end
80
117
 
81
118
  def _chef_provisioner
82
- packerfile[:provisioners] << {
119
+ _chef_provisioner_base.merge(
120
+ :staging_directory => Config.chef.staging_directory,
121
+ :install_command => _chef_install_command
122
+ )
123
+ end
124
+
125
+ def _chef_provisioner_docker
126
+ _chef_provisioner_base.merge(
127
+ :prevent_sudo => true,
128
+ :install_command => _chef_install_command(false)
129
+ )
130
+ end
131
+
132
+ def _chef_provisioner_base
133
+ {
83
134
  :type => 'chef-solo',
84
135
  :run_list => Config.profile.current.chef.run_list,
85
136
  :cookbook_paths => Config.local.cookbook_path,
@@ -87,10 +138,13 @@ module Builderator
87
138
  :environments_path => Config.local.environment_path,
88
139
  :chef_environment => Config.profile.current.chef.environment,
89
140
  :json => Config.profile.current.chef.node_attrs,
90
- :staging_directory => Config.chef.staging_directory,
91
- :install_command => "curl -L https://www.chef.io/chef/install.sh | sudo bash -s -- -v #{Config.chef.version}"
92
141
  }
93
142
  end
143
+
144
+ def _chef_install_command(sudo = true)
145
+ template = sudo ? 'sudo' : ''
146
+ format("curl -L https://www.chef.io/chef/install.sh | %s bash -s -- -v #{Config.chef.version}", template)
147
+ end
94
148
  end
95
149
  end
96
150
  end
@@ -82,6 +82,14 @@ module Builderator
82
82
  invoke Tasks::Packer, :remote_tag, [profile], options if options['remote_tag']
83
83
  end
84
84
 
85
+ desc 'container [PROFILE = docker]', 'Build a container of PROFILE'
86
+ method_option :debug, :type => :boolean
87
+ def container(profile = :docker)
88
+ prepare
89
+
90
+ invoke Tasks::Packer, :build, [profile], options
91
+ end
92
+
85
93
  # desc 'cookbook SUBCOMMAND', 'Cookbook tasks'
86
94
  # subcommand 'cookbook', Tasks::Cookbook
87
95
 
@@ -71,6 +71,10 @@ module Builderator
71
71
  end
72
72
  end
73
73
 
74
+ def ecr(region = Config.aws.region)
75
+ clients["ecr-#{region}"] ||= Aws::ECR::Client.new(:region => region)
76
+ end
77
+
74
78
  def asg(region = Config.aws.region)
75
79
  clients["asg-#{region}"] ||= Aws::AutoScaling::Client.new(:region => region)
76
80
  end
@@ -94,4 +94,16 @@ Vagrant.configure('2') do |config|
94
94
  ## Tell Chef that this is a Vagrant build
95
95
  chef.json[:vagrant] = true
96
96
  end
97
+
98
+ <%- profile.current.provisioner.each do |name, provisioner| -%>
99
+ <%- provisioner.each do |func, val| -%>
100
+ <%- if val.is_a?(Array) -%>
101
+ <%- val.each do |v| -%>
102
+ config.vm.provision "<%= name %>", <%= func %>: "<%= v %>"
103
+ <%- end -%>
104
+ <%- else -%>
105
+ config.vm.provision "<%= name %>", <%= func %>: "<%= val %>"
106
+ <%- end -%>
107
+ <%- end -%>
108
+ <%- end -%>
97
109
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: builderator
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.2.3.pre.beta.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Manero
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-14 00:00:00.000000000 Z
11
+ date: 2017-02-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -205,6 +205,7 @@ files:
205
205
  - lib/builderator/control/cleaner.rb
206
206
  - lib/builderator/control/cookbook.rb
207
207
  - lib/builderator/control/data.rb
208
+ - lib/builderator/control/data/ecr.rb
208
209
  - lib/builderator/control/data/image.rb
209
210
  - lib/builderator/control/version.rb
210
211
  - lib/builderator/control/version/auto.rb
@@ -259,12 +260,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
259
260
  version: '0'
260
261
  required_rubygems_version: !ruby/object:Gem::Requirement
261
262
  requirements:
262
- - - ">="
263
+ - - ">"
263
264
  - !ruby/object:Gem::Version
264
- version: '0'
265
+ version: 1.3.1
265
266
  requirements: []
266
267
  rubyforge_project:
267
- rubygems_version: 2.4.3
268
+ rubygems_version: 2.5.2
268
269
  signing_key:
269
270
  specification_version: 4
270
271
  summary: Tools to make CI Packer builds awesome