class BuildRunner

Attributes

build_timestamp[R]
config[R]
cpus[R]
debug[R]
dry_run[R]
except[R]
headed[R]
mem[R]
mirror[R]
only[R]
override_version[R]
single[R]
template_files[R]

Public Class Methods

new(opts) click to toggle source
# File lib/bento/build.rb, line 13
def initialize(opts)
  @template_files = opts.template_files
  @config = opts.config ||= false
  @dry_run = opts.dry_run
  @debug = opts.debug
  @only = opts.only ||= "parallels-iso,virtualbox-iso,vmware-iso"
  @except = opts.except
  @mirror = opts.mirror
  @headed = opts.headed ||= false
  @single = opts.single ||= false
  @override_version = opts.override_version
  @build_timestamp = Time.now.gmtime.strftime("%Y%m%d%H%M%S")
  @cpus = opts.cpus
  @mem = opts.mem
end

Public Instance Methods

start() click to toggle source
# File lib/bento/build.rb, line 29
def start
  templates = config ? build_list : template_files
  banner("Starting build for templates:")
  templates.each { |t| puts "- #{t}" }
  time = Benchmark.measure do
    templates.each { |template| build(template) }
  end
  banner("Build finished in #{duration(time.real)}.")
end

Private Instance Methods

build(file) click to toggle source
# File lib/bento/build.rb, line 41
def build(file)
  dir = file.split("/")[0]
  template = file.split("/")[1]
  Dir.chdir dir
  for_packer_run_with(template) do |md_file, _var_file|
    cmd = packer_build_cmd(template, md_file.path)
    banner("[#{template}] Building: '#{cmd.join(' ')}'")
    time = Benchmark.measure do
      system(*cmd) || raise("[#{template}] Error building, exited #{$CHILD_STATUS}")
    end
    write_final_metadata(template, time.real.ceil)
    banner("[#{template}] Finished building in #{duration(time.real)}.")
  end
  Dir.chdir("..")
end
packer_build_cmd(template, var_file) click to toggle source
# File lib/bento/build.rb, line 57
def packer_build_cmd(template, var_file)
  vars = "#{template}.variables.json"
  cmd = %W{packer build -var-file=#{var_file} #{template}.json}
  cmd.insert(2, "-var-file=#{vars}") if File.exist?(vars)
  cmd.insert(2, "-only=#{only}")
  cmd.insert(2, "-except=#{except}") if except
  # Build the command line in the correct order and without spaces as future input for the splat operator.
  cmd.insert(2, "cpus=#{cpus}") if cpus
  cmd.insert(2, "-var") if cpus
  cmd.insert(2, "memory=#{mem}") if mem
  cmd.insert(2, "-var") if mem
  cmd.insert(2, "mirror=#{mirror}") if mirror
  cmd.insert(2, "-var") if mirror
  cmd.insert(2, "headless=true") unless headed
  cmd.insert(2, "-var") unless headed
  cmd.insert(2, "-parallel=false") if single
  cmd.insert(2, "-debug") if debug
  cmd.insert(0, "echo") if dry_run
  cmd
end
write_final_metadata(template, buildtime) click to toggle source
# File lib/bento/build.rb, line 78
def write_final_metadata(template, buildtime)
  md = BuildMetadata.new(template, build_timestamp, override_version).read
  path = File.join("../builds")
  filename = File.join(path, "#{md[:box_basename]}.metadata.json")
  md[:providers] = ProviderMetadata.new(path, md[:box_basename]).read
  md[:providers].each do |p|
    p[:build_time] = buildtime
    p[:build_cpus] = cpus unless cpus.nil?
    p[:build_mem] = mem unless mem.nil?
  end

  if dry_run
    banner("(Dry run) Metadata file contents would be something similar to:")
    puts JSON.pretty_generate(md)
  else
    File.open(filename, "wb") { |file| file.write(JSON.pretty_generate(md)) }
  end
end