class Dodebui::Build
Handles the build process of a package
Attributes
distribution[R]
Public Class Methods
new(distribution)
click to toggle source
# File lib/dodebui/build.rb, line 10 def initialize(distribution) @distribution = distribution @cli = distribution.cli end
Public Instance Methods
build()
click to toggle source
# File lib/dodebui/build.rb, line 120 def build build_container_create_start build_apt_proxy build_dependencies build_package build_chown @container.stop @container.remove true rescue RuntimeError => e build_error(e) end
build_apt_proxy()
click to toggle source
# File lib/dodebui/build.rb, line 79 def build_apt_proxy return if @cli.apt_proxy.nil? logger.info("Setting apt_proxy #{@distribution.codename}") stdout, stderr, ret_val = @container.exec([ 'bash', '-c', @distribution.apt_proxy ]) write_log('apt_proxy', stdout, stderr) logger.warn( "Failed setting apt proxy #{@distribution.codename}" ) if ret_val != 0 end
build_chown()
click to toggle source
# File lib/dodebui/build.rb, line 93 def build_chown uid = Process.uid gid = Process.gid logger.info( 'Changing owner of build dir to' \ " uid=#{uid} gid=#{gid} #{@distribution.codename}" ) stdout, stderr, ret_val = @container.exec([ 'chown', '-R', format('%d:%d', uid, gid), '/_build' ]) write_log('chown', stdout, stderr) logger.warn( "Failed changing owner of build dir #{@distribution.codename}" ) if ret_val != 0 end
build_container_create_start()
click to toggle source
# File lib/dodebui/build.rb, line 40 def build_container_create_start logger.info("Creating container #{@distribution.codename}") @container = Docker::Container.create( 'Image' => @distribution.image_name, 'Cmd' => %w(sleep 3600), 'WorkingDir' => '/_build/source' ) logger.info("Starting container #{@distribution.codename}") @container.start('Binds' => [ "#{build_dir}:/_build" ]) end
build_dependencies()
click to toggle source
# File lib/dodebui/build.rb, line 53 def build_dependencies logger.info("Installing dependencies #{@distribution.codename}") stdout, stderr, ret_val = @container.exec([ '/usr/lib/pbuilder/pbuilder-satisfydepends-aptitude' ]) write_log('apt_install_deps', stdout, stderr) if ret_val != 0 logger.warn("Failed installing dependencies #{@distribution.codename}") fail end logger.info("Finished installing dependencies #{@distribution.codename}") end
build_dir()
click to toggle source
# File lib/dodebui/build.rb, line 149 def build_dir File.expand_path( File.join( @cli.wd, '..', '_build', "#{distribution.os}_#{distribution.codename}" ) ) end
build_error(e)
click to toggle source
# File lib/dodebui/build.rb, line 112 def build_error(e) logger.warn("Error building #{@distribution.image_name}: #{e}") return false if @container.nil? logger.warn("Use container id=#{@container.id} to debug") @container.stop false end
build_package()
click to toggle source
# File lib/dodebui/build.rb, line 66 def build_package logger.info("Building package #{@distribution.codename}") stdout, stderr, ret_val = @container.exec([ 'dpkg-buildpackage' ]) write_log('build', stdout, stderr) if ret_val != 0 logger.warn("Failed building package #{@distribution.codename}") fail end logger.info("Finished building package #{@distribution.codename}") end
cache_dir()
click to toggle source
# File lib/dodebui/build.rb, line 140 def cache_dir File.expand_path( File.join( '/var/lib/dodebui', "#{distribution.os}_#{distribution.codename}" ) ) end
local_expect(desc, *args)
click to toggle source
# File lib/dodebui/build.rb, line 15 def local_expect(desc, *args) Open3.popen3(*args) do |_i, o, e, t| if args[0].is_a? Hash cmd = args[1] else cmd = args[0] end ret_val = t.value.exitstatus if ret_val == 0 logger.debug("#{desc} (cmd=#{cmd}): succeed") else output = "Exec failed cmd=#{cmd} ret_val=#{ret_val}" output += "stdout=#{o.read} stderr=#{e.read}" fail output end end end
logger()
click to toggle source
# File lib/dodebui/build.rb, line 166 def logger @cli.logger end
source()
click to toggle source
# File lib/dodebui/build.rb, line 160 def source source_copy source_changelog source_templates end
source_changelog()
click to toggle source
# File lib/dodebui/build.rb, line 224 def source_changelog path = File.join(source_dir, 'debian/changelog') logger.debug "Modify changelog file #{path}" local_expect( 'append distribution build to changelog', { 'DEBFULLNAME' => 'Jenkins Autobuilder', 'DEBEMAIL' => 'jenkins@former03.de' }, source_changelog_dch(path) ) end
source_changelog_dch(path)
click to toggle source
# File lib/dodebui/build.rb, line 212 def source_changelog_dch(path) output = 'dch --changelog %{path} -l "+%{cn_str}%{cn}" -D "%{cn}" ' output += '--force-distribution ' output += '"Build a changelog entry for %{cn} %{cn}"' output % { cn: @distribution.codename, cn_str: @distribution.codename_str, path: path } end
source_copy()
click to toggle source
# File lib/dodebui/build.rb, line 204 def source_copy logger.debug "Start copying sources to #{source_dir}" FileUtils.mkdir_p build_dir FileUtils.rm_rf source_dir FileUtils.cp_r @cli.wd, source_dir logger.debug "Finished copying sources to #{source_dir}" end
source_dir()
click to toggle source
# File lib/dodebui/build.rb, line 170 def source_dir File.join(build_dir, 'source') end
source_template_eval(path)
click to toggle source
# File lib/dodebui/build.rb, line 182 def source_template_eval(path) logger.debug "Evaluate template #{path}" erb = ERB.new( File.read(path), nil, '-' ) erb.result(source_template_namespace.priv_binding) end
source_template_namespace()
click to toggle source
# File lib/dodebui/build.rb, line 174 def source_template_namespace TemplateNamespace.new( os: @distribution.os, codename: @distribution.codename, codename_int: @distribution.codename_int ) end
source_templates()
click to toggle source
# File lib/dodebui/build.rb, line 192 def source_templates return if @cli.source_templates.nil? @cli.source_templates.each do |template| src = File.join(source_dir, template) dest = src[0...-4] File.open(dest, 'w') do |file| file.write(source_template_eval(src)) end sh "chmod +x #{template}" if template == 'debian/rules' end end
write_log(name, o, e)
click to toggle source
# File lib/dodebui/build.rb, line 33 def write_log(name, o, e) o_path = File.join(build_dir, "#{name}.stdout.log") e_path = File.join(build_dir, "#{name}.stderr.log") File.open(o_path, 'w') { |file| file.write(o.join '') } File.open(e_path, 'w') { |file| file.write(e.join '') } end