lib/percheron/actions/build.rb in percheron-0.7.11 vs lib/percheron/actions/build.rb in percheron-0.7.12

- old
+ new

@@ -10,35 +10,68 @@ @exec_scripts = exec_scripts end def execute! results = [] - results << build! if unit.buildable? + if unit.buildable? + results << write_out_temp_dockerfile! + results << build! + end results.compact.empty? ? nil : unit end private attr_reader :unit, :nocache, :exec_scripts alias_method :exec_scripts?, :exec_scripts def options { - 'dockerfile' => unit.dockerfile.basename.to_s, + 'dockerfile' => dockerfile, 't' => unit.image_name, 'forcerm' => true, 'nocache' => nocache } end + def dockerfile + temp_dockerfile.basename.to_s + end + + def temp_dockerfile + @temp_dockerfile ||= Pathname.new(temp_dockerfile_name) + end + + 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 + + def write_out_temp_dockerfile! + options = { 'secrets' => Config.secrets } + content = Liquid::Template.parse(unit.dockerfile.read).render(options) + File.open(temp_dockerfile, 'w') { |f| f.write(content) } + end + + def remove_temp_dockerfile! + temp_dockerfile.delete + end + 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.debug '%s' % [ out.strip ] end end + ensure + remove_temp_dockerfile! end 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!