bento-ya 0.1.4 → 1.0.0

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: 6e04c6c78424c7c84671934d4a8c136e8b541a84
4
- data.tar.gz: 06a45a721b281df3715d595f81608331f1644795
3
+ metadata.gz: d80f43a61098c9b321b679f1518f54a033fcd3eb
4
+ data.tar.gz: fe4d410bb82744e2757d5717072019b222782daa
5
5
  SHA512:
6
- metadata.gz: 8fecf29f4e438211731618e669552a1cd2084aa28f949c44ca784f412c6414aac94a0fda73918910e18f50d651cc78dad2f1a0b9cb10a79ab60990ce5c2ed462
7
- data.tar.gz: 4d6f3fa0b79dd0c640fe989c66aeec40b3304e49c6aa4bdcedfb445d8d039dc746651e32ba154ee5c7759de885f8ee567942afc8fcbbd7be703d9dfa97da5a53
6
+ metadata.gz: db56b1404c177c23ca3229c08b3281b5d524a7e01c3f82a8c76a331798a21ea1d86058312637250881c5fbdd8aba141a9479846abc1dbd86bf4885ea00b6e9c1
7
+ data.tar.gz: 3d004b6eb6e7fcd13f1a36ed86d991bbb24d5c9f678fbe5024d323e73f34aa27e1cf9e7b8ddd4c6be5643571748ff68b6065a81d0e50b4f08ad185625ba7b4a2
@@ -0,0 +1,19 @@
1
+ sudo: false
2
+ dist: trusty
3
+
4
+ language: ruby
5
+ cache: bundler
6
+ rvm:
7
+ - 2.4.1
8
+ - ruby-head
9
+
10
+ matrix:
11
+ allow_failures:
12
+ - rvm: ruby-head
13
+
14
+ branches:
15
+ only:
16
+ - master
17
+
18
+ script:
19
+ - bundle exec chefstyle
@@ -1,5 +1,24 @@
1
1
  # Change Log
2
2
 
3
+ ## [v1.0.0](https://github.com/cheeseplus/bento-ya/tree/v1.0.0) (2017-09-05)
4
+ [Full Changelog](https://github.com/cheeseplus/bento-ya/compare/v0.1.4...v1.0.0)
5
+
6
+ ### IMPROVEMENTS
7
+
8
+ * Use `vagrant_cloud` gem
9
+ * Refactor all Vagrant Cloud related code
10
+ * cleanup deps, options, style
11
+ * drop remote build support
12
+ * add Chefstyle
13
+ * configure TravisCI
14
+ * moved more things out of bento and into bento-ya
15
+ * support for loading `builds.yml`
16
+ * support folder re-organzation in bento project
17
+
18
+ ### BUG FIXES
19
+
20
+ * Fix provider being set incorrectly for VMware builds
21
+
3
22
  ## [v0.1.4](https://github.com/cheeseplus/bento-ya/tree/v0.1.4) (2017-07-05)
4
23
  [Full Changelog](https://github.com/cheeseplus/bento-ya/compare/v0.1.3...v0.1.4)
5
24
 
@@ -76,4 +95,4 @@
76
95
 
77
96
 
78
97
 
79
- \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
98
+ \* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
data/Gemfile CHANGED
@@ -1,3 +1,12 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
- gemspec
3
+ gemspec
4
+
5
+ group :development do
6
+ gem "chefstyle"
7
+ gem "rake", ">= 10.1.0"
8
+ gem "rspec-core", "~> 3.0"
9
+ gem "rspec-expectations", "~> 3.0"
10
+ gem "rspec-mocks", "~> 3.0"
11
+ gem "rspec-collection_matchers", "~> 1.0"
12
+ end
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- [![Gem Version](https://badge.fury.io/rb/bento-ya.svg)](http://badge.fury.io/rb/bento-ya)
1
+ [![Gem Version](https://badge.fury.io/rb/bento-ya.svg)](http://badge.fury.io/rb/bento-ya) [![Build Status Master](https://travis-ci.org/cheeseplus/bento-ya.svg?branch=master)](https://travis-ci.org/cheeseplus/bento-ya)
2
2
 
3
3
  # bento-ya
4
4
  A RubyGem for managing chef/bento builds
data/Rakefile CHANGED
@@ -1 +1,22 @@
1
- require 'bundler/gem_tasks'
1
+ require "bundler/gem_tasks"
2
+
3
+ begin
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new do |t|
7
+ t.pattern = "spec/**/*_spec.rb"
8
+ end
9
+ rescue LoadError
10
+ desc "rspec is not installed, this task is disabled"
11
+ task :spec do
12
+ abort "rspec is not installed. `(sudo) gem install rspec` to run unit tests"
13
+ end
14
+ end
15
+
16
+ task :default => :spec
17
+
18
+ require "chefstyle"
19
+ require "rubocop/rake_task"
20
+ RuboCop::RakeTask.new(:style) do |task|
21
+ task.options += ["--display-cop-names", "--no-color"]
22
+ end
@@ -14,14 +14,13 @@ Gem::Specification.new do |gem|
14
14
  gem.homepage = "https://github.com/cheeseplus/bento-ya"
15
15
 
16
16
  gem.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
17
- gem.bindir = "bin"
18
- gem.executables = %w[bento]
17
+ gem.bindir = "bin"
18
+ gem.executables = %w{bento}
19
19
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
20
20
  gem.require_paths = ["lib"]
21
21
 
22
22
  gem.required_ruby_version = ">= 2.3.1"
23
23
 
24
- gem.add_dependency 'rake', '~> 11.2'
25
- gem.add_dependency 'mixlib-shellout', '~> 2.2'
26
- gem.add_dependency 'buildkit', '~> 0.4'
24
+ gem.add_dependency "mixlib-shellout", ">= 2.3.2"
25
+ gem.add_dependency "vagrant_cloud", "~> 1.0"
27
26
  end
data/bin/bento CHANGED
@@ -6,7 +6,7 @@ Signal.trap("INT") { exit 1 }
6
6
  $stdout.sync = true
7
7
  $stderr.sync = true
8
8
 
9
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), %w[.. lib])
9
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), %w{.. lib})
10
10
  require "bento/cli"
11
11
 
12
12
  begin
@@ -1,2 +1,2 @@
1
- require 'bento/common'
2
- require 'bento/version'
1
+ require "bento/common"
2
+ require "bento/version"
@@ -1,20 +1,21 @@
1
- require 'bento/common'
2
- require 'bento/buildmetadata'
3
- require 'bento/providermetadata'
4
- require 'bento/packerexec'
1
+ require "bento/common"
2
+ require "bento/buildmetadata"
3
+ require "bento/providermetadata"
4
+ require "bento/packerexec"
5
5
 
6
6
  class BuildRunner
7
7
  include Common
8
8
  include PackerExec
9
9
 
10
- attr_reader :templates, :dry_run, :debug, :builds, :except, :mirror, :headed,
10
+ attr_reader :template_files, :config, :dry_run, :debug, :only, :except, :mirror, :headed,
11
11
  :override_version, :build_timestamp, :cpus, :mem
12
12
 
13
13
  def initialize(opts)
14
- @templates = opts.templates
14
+ @template_files = opts.template_files
15
+ @config = opts.config ||= false
15
16
  @dry_run = opts.dry_run
16
17
  @debug = opts.debug
17
- @builds = opts.builds ||= "parallels-iso,virtualbox-iso,vmware-iso"
18
+ @only = opts.only ||= "parallels-iso,virtualbox-iso,vmware-iso"
18
19
  @except = opts.except
19
20
  @mirror = opts.mirror
20
21
  @headed = opts.headed ||= false
@@ -25,7 +26,9 @@ class BuildRunner
25
26
  end
26
27
 
27
28
  def start
28
- banner("Starting build for templates: #{templates}")
29
+ templates = config ? build_list : template_files
30
+ banner("Starting build for templates:")
31
+ templates.each { |t| puts "- #{t}" }
29
32
  time = Benchmark.measure do
30
33
  templates.each { |template| build(template) }
31
34
  end
@@ -34,23 +37,26 @@ class BuildRunner
34
37
 
35
38
  private
36
39
 
37
- def build(template)
40
+ def build(file)
41
+ dir, template = file.split("/")[0], file.split("/")[1]
42
+ Dir.chdir dir
38
43
  for_packer_run_with(template) do |md_file, var_file|
39
44
  cmd = packer_build_cmd(template, md_file.path)
40
45
  banner("[#{template}] Building: '#{cmd.join(' ')}'")
41
46
  time = Benchmark.measure do
42
- system(*cmd) or raise "[#{template}] Error building, exited #{$?}"
47
+ system(*cmd) || raise("[#{template}] Error building, exited #{$?}")
43
48
  end
44
49
  write_final_metadata(template, time.real.ceil)
45
50
  banner("[#{template}] Finished building in #{duration(time.real)}.")
46
51
  end
52
+ Dir.chdir("..")
47
53
  end
48
54
 
49
55
  def packer_build_cmd(template, var_file)
50
56
  vars = "#{template}.variables.json"
51
- cmd = %W[packer build -var-file=#{var_file} #{template}.json]
57
+ cmd = %W{packer build -var-file=#{var_file} #{template}.json}
52
58
  cmd.insert(2, "-var-file=#{vars}") if File.exist?(vars)
53
- cmd.insert(2, "-only=#{builds}") if builds
59
+ cmd.insert(2, "-only=#{only}")
54
60
  cmd.insert(2, "-except=#{except}") if except
55
61
  # Build the command line in the correct order and without spaces as future input for the splat operator.
56
62
  cmd.insert(2, "cpus=#{cpus}") if cpus
@@ -68,7 +74,7 @@ class BuildRunner
68
74
 
69
75
  def write_final_metadata(template, buildtime)
70
76
  md = BuildMetadata.new(template, build_timestamp, override_version).read
71
- path = File.join("#{Dir.pwd}/builds")
77
+ path = File.join("../builds")
72
78
  filename = File.join(path, "#{md[:box_basename]}.metadata.json")
73
79
  md[:providers] = ProviderMetadata.new(path, md[:box_basename]).read
74
80
  md[:providers].each do |p|
@@ -1,5 +1,5 @@
1
- require 'bento/common'
2
- require 'mixlib/shellout'
1
+ require "bento/common"
2
+ require "mixlib/shellout"
3
3
 
4
4
  class BuildMetadata
5
5
  include Common
@@ -35,11 +35,11 @@ class BuildMetadata
35
35
  end
36
36
 
37
37
  def git_revision
38
- sha = %x{git rev-parse HEAD}.strip
38
+ sha = `git rev-parse HEAD`.strip
39
39
  end
40
40
 
41
41
  def git_clean?
42
- %x{git status --porcelain}.strip.empty?
42
+ `git status --porcelain`.strip.empty?
43
43
  end
44
44
 
45
45
  def merged_vars
@@ -62,10 +62,10 @@ class BuildMetadata
62
62
 
63
63
  def version
64
64
  if override_version
65
- override_version
65
+ override_version
66
66
  else
67
- merged_vars.fetch("version", "#{UNKNOWN}.TIMESTAMP").
68
- rpartition(".").first.concat(".#{build_timestamp}")
67
+ merged_vars.fetch("version", "#{UNKNOWN}.TIMESTAMP").
68
+ rpartition(".").first.concat(".#{build_timestamp}")
69
69
  end
70
70
  end
71
71
 
@@ -76,12 +76,12 @@ class BuildMetadata
76
76
  end
77
77
 
78
78
  def vagrant_ver
79
- if ENV['TRAVIS']
80
- 'travis'
79
+ if ENV["TRAVIS"]
80
+ "travis"
81
81
  else
82
82
  cmd = Mixlib::ShellOut.new("vagrant --version")
83
83
  cmd.run_command
84
- cmd.stdout.split(' ')[1]
84
+ cmd.stdout.split(" ")[1]
85
85
  end
86
86
  end
87
87
  end
@@ -1,31 +1,27 @@
1
- require 'optparse'
2
- require 'ostruct'
3
-
4
- require 'bento/common'
5
- require 'bento/build'
6
- require 'bento/build_remote'
7
- require 'bento/delete'
8
- require 'bento/normalize'
9
- require 'bento/release'
10
- require 'bento/revoke'
11
- require 'bento/test'
12
- require 'bento/upload'
13
-
1
+ require "optparse"
2
+ require "ostruct"
3
+
4
+ require "bento/common"
5
+ require "bento/build"
6
+ require "bento/delete"
7
+ require "bento/normalize"
8
+ require "bento/release"
9
+ require "bento/revoke"
10
+ require "bento/test"
11
+ require "bento/upload"
14
12
 
15
13
  class Options
16
-
17
14
  NAME = File.basename($0).freeze
18
15
 
19
16
  def self.parse(args)
20
17
  options = OpenStruct.new
21
- options.templates = calculate_templates("*.json")
18
+ options.template_files = calculate_templates("**/*.json")
22
19
 
23
20
  global = OptionParser.new do |opts|
24
21
  opts.banner = "Usage: #{NAME} [SUBCOMMAND [options]]"
25
22
  opts.separator ""
26
23
  opts.separator <<-COMMANDS.gsub(/^ {8}/, "")
27
24
  build : build one or more templates
28
- build_remote : build one or more templates via buildkite
29
25
  help : prints this help message
30
26
  list : list all templates in project
31
27
  normalize : normalize one or more templates
@@ -38,13 +34,13 @@ class Options
38
34
  end
39
35
 
40
36
  platforms_argv_proc = proc { |options|
41
- options.platforms = builds['public'] unless args.empty?
37
+ options.platforms = builds["public"] unless args.empty?
42
38
  }
43
39
 
44
40
  templates_argv_proc = proc { |options|
45
41
  options.templates = calculate_templates(args) unless args.empty?
46
42
 
47
- options.templates.each do |t|
43
+ options.template_files.each do |t|
48
44
  if !File.exists?("#{t}.json")
49
45
  $stderr.puts "File #{t}.json does not exist for template '#{t}'"
50
46
  exit(1)
@@ -67,23 +63,27 @@ class Options
67
63
  argv: proc { |options|
68
64
  puts global
69
65
  exit(0)
70
- }
66
+ },
71
67
  },
72
68
  build: {
73
69
  class: BuildRunner,
74
- parser: OptionParser.new { |opts|
70
+ parser: OptionParser.new do |opts|
75
71
  opts.banner = "Usage: #{NAME} build [options] TEMPLATE[ TEMPLATE ...]"
76
72
 
77
73
  opts.on("-n", "--dry-run", "Dry run (what would happen)") do |opt|
78
74
  options.dry_run = opt
79
75
  end
80
76
 
77
+ opts.on("-c BUILD_YML", "--config BUILD_YML", "Use a configuration file") do |opt|
78
+ options.config = opt
79
+ end
80
+
81
81
  opts.on("-d", "--[no-]debug", "Run packer with debug output") do |opt|
82
82
  options.debug = opt
83
83
  end
84
84
 
85
85
  opts.on("-o BUILDS", "--only BUILDS", "Only build some Packer builds") do |opt|
86
- options.builds = opt
86
+ options.only = opt
87
87
  end
88
88
 
89
89
  opts.on("-e BUILDS", "--except BUILDS", "Build all Packer builds except these") do |opt|
@@ -109,45 +109,30 @@ class Options
109
109
  opts.on("-v VERSION", "--version VERSION", "Override the version set in the template") do |opt|
110
110
  options.override_version = opt
111
111
  end
112
- },
113
- argv: templates_argv_proc
114
- },
115
- build_remote: {
116
- class: BuildRemoteRunner,
117
- parser: OptionParser.new { |opts|
118
- opts.banner = "Usage: #{NAME} build_remote [options] [PLATFORM ...]"
119
-
120
- opts.on("-v VERSION", "--version VERSION", "Override the version set in the template") do |opt|
121
- options.override_version = opt
122
- end
123
-
124
- opts.on("--dry-run", "Show me what you got") do |opt|
125
- options.dry_run = opt
126
- end
127
- },
128
- argv: platforms_argv_proc
112
+ end,
113
+ argv: templates_argv_proc,
129
114
  },
130
115
  list: {
131
116
  class: ListRunner,
132
- parser: OptionParser.new { |opts|
117
+ parser: OptionParser.new do |opts|
133
118
  opts.banner = "Usage: #{NAME} list [TEMPLATE ...]"
134
- },
135
- argv: templates_argv_proc
119
+ end,
120
+ argv: templates_argv_proc,
136
121
  },
137
122
  normalize: {
138
123
  class: NormalizeRunner,
139
- parser: OptionParser.new { |opts|
124
+ parser: OptionParser.new do |opts|
140
125
  opts.banner = "Usage: #{NAME} normalize TEMPLATE[ TEMPLATE ...]"
141
126
 
142
127
  opts.on("-d", "--[no-]debug", "Run packer with debug output") do |opt|
143
128
  options.debug = opt
144
129
  end
145
- },
146
- argv: templates_argv_proc
130
+ end,
131
+ argv: templates_argv_proc,
147
132
  },
148
133
  test: {
149
134
  class: TestRunner,
150
- parser: OptionParser.new { |opts|
135
+ parser: OptionParser.new do |opts|
151
136
  opts.banner = "Usage: #{NAME} test [options]"
152
137
 
153
138
  opts.on("--no-shared-folder", "Disable shared folder testing") do |opt|
@@ -157,37 +142,37 @@ class Options
157
142
  opts.on("-p", "--provisioner PROVISIONER", "Use a specfic provisioner") do |opt|
158
143
  options.provisioner = opt
159
144
  end
160
- },
161
- argv: Proc.new {}
145
+ end,
146
+ argv: Proc.new {},
162
147
  },
163
148
  upload: {
164
149
  class: UploadRunner,
165
- parser: OptionParser.new { |opts|
150
+ parser: OptionParser.new do |opts|
166
151
  opts.banner = "Usage: #{NAME} upload"
167
- },
168
- argv: md_json_argv_proc
152
+ end,
153
+ argv: md_json_argv_proc,
169
154
  },
170
155
  release: {
171
156
  class: ReleaseRunner,
172
- parser: OptionParser.new { |opts|
157
+ parser: OptionParser.new do |opts|
173
158
  opts.banner = "Usage: #{NAME} release BOX VERSION"
174
- },
175
- argv: box_version_argv_proc
159
+ end,
160
+ argv: box_version_argv_proc,
176
161
  },
177
162
  revoke: {
178
163
  class: RevokeRunner,
179
- parser: OptionParser.new { |opts|
164
+ parser: OptionParser.new do |opts|
180
165
  opts.banner = "Usage: #{NAME} revoke BOX VERSION"
181
- },
182
- argv: box_version_argv_proc
166
+ end,
167
+ argv: box_version_argv_proc,
183
168
  },
184
169
  delete: {
185
170
  class: DeleteRunner,
186
- parser: OptionParser.new { |opts|
171
+ parser: OptionParser.new do |opts|
187
172
  opts.banner = "Usage: #{NAME} delete BOX VERSION"
188
- },
189
- argv: box_version_argv_proc
190
- }
173
+ end,
174
+ argv: box_version_argv_proc,
175
+ },
191
176
  }
192
177
 
193
178
  global.order!
@@ -206,13 +191,12 @@ class Options
206
191
  map { |glob| result = Dir.glob(glob); result.empty? ? glob : result }.
207
192
  flatten.
208
193
  sort.
209
- delete_if { |file| file =~ /\.variables\./ }.
210
- map { |template| template.sub(/\.json$/, '') }
194
+ delete_if { |file| file =~ /\.(variables||metadata)\./ }.
195
+ map { |template| template.sub(/\.json$/, "") }
211
196
  end
212
197
  end
213
198
 
214
199
  class ListRunner
215
-
216
200
  include Common
217
201
 
218
202
  attr_reader :templates
@@ -227,7 +211,6 @@ class ListRunner
227
211
  end
228
212
 
229
213
  class Runner
230
-
231
214
  attr_reader :options
232
215
 
233
216
  def initialize(options)