class Percheron::Actions::Build

Attributes

exec_scripts[R]
exec_scripts?[R]
forcerm[R]
forcerm?[R]
unit[R]
usecache[R]
usecache?[R]

Public Class Methods

new(unit, usecache: true, forcerm: false, exec_scripts: true) click to toggle source
# File lib/percheron/actions/build.rb, line 6
def initialize(unit, usecache: true, forcerm: false, exec_scripts: true)
  @unit = unit
  @usecache = usecache
  @forcerm = forcerm
  @exec_scripts = exec_scripts
end

Public Instance Methods

execute!() click to toggle source
# File lib/percheron/actions/build.rb, line 13
def execute!
  results = []
  if unit.buildable?
    results << write_out_temp_dockerfile!
    results << build!
  end
  results.compact.empty? ? nil : unit
end

Private Instance Methods

build!() click to toggle source
# File lib/percheron/actions/build.rb, line 66
def build!
  in_working_directory(base_dir) do
    execute_pre_build_scripts!
    $logger.info "Building '#{unit.image_name}' image"
    Connection.perform(Docker::Image, :build_from_dir, base_dir, options) do |out|
      $logger.info '%s' % [ extract_content(out) ]
    end
  end
ensure
  remove_temp_dockerfile!
end
dockerfile() click to toggle source
# File lib/percheron/actions/build.rb, line 38
def dockerfile
  temp_dockerfile.basename.to_s
end
execute_pre_build_scripts!() click to toggle source
# File lib/percheron/actions/build.rb, line 84
def execute_pre_build_scripts!
  return nil if !exec_scripts? && unit.pre_build_scripts.empty?
  ExecLocal.new(unit, unit.pre_build_scripts, 'PRE build').execute!
end
extract_content(out) click to toggle source
# File lib/percheron/actions/build.rb, line 78
def extract_content(out)
  json = JSON.parse(out)
  return '' unless json['stream']
  json['stream'].strip
end
options() click to toggle source
# File lib/percheron/actions/build.rb, line 29
def options
  {
    'dockerfile'  => dockerfile,
    't'           => unit.image_name,
    'forcerm'     => forcerm?,
    'nocache'     => !usecache?
  }
end
remove_temp_dockerfile!() click to toggle source
# File lib/percheron/actions/build.rb, line 62
def remove_temp_dockerfile!
  temp_dockerfile.delete
end
temp_dockerfile() click to toggle source
# File lib/percheron/actions/build.rb, line 42
def temp_dockerfile
  @temp_dockerfile ||= Pathname.new(temp_dockerfile_name)
end
temp_dockerfile_name() click to toggle source
# File lib/percheron/actions/build.rb, line 46
def temp_dockerfile_name
  @temp_dockerfile_name ||= begin
    '%s/%s.%s' % [
      unit.dockerfile.expand_path.dirname.to_s,
      unit.dockerfile.basename.to_s,
      SecureRandom.urlsafe_base64
    ]
  end
end
write_out_temp_dockerfile!() click to toggle source
# File lib/percheron/actions/build.rb, line 56
def write_out_temp_dockerfile!
  options = { 'secrets' => Config.secrets, 'userdata' => Config.userdata }
  content = Liquid::Template.parse(unit.dockerfile.read).render(options)
  File.open(temp_dockerfile, 'w') { |f| f.write(content) }
end