bento-ya 0.1.4 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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)