03b262319f
This commit applies @smaftoul patch from https://gist.github.com/smaftoul/2d6fcf43b7c6545aa588/revisions
179 lines
4.7 KiB
Ruby
179 lines
4.7 KiB
Ruby
require 'time'
|
|
require 'pathname'
|
|
require 'rake/tasklib'
|
|
|
|
class BuildGenericBoxTask < ::Rake::TaskLib
|
|
include ::Rake::DSL
|
|
|
|
attr_reader :name
|
|
|
|
def initialize(name, distrib, release, arch, cfg_engines)
|
|
@name = name
|
|
@distrib = distrib
|
|
@release = release.to_s
|
|
@arch = arch.to_s
|
|
@cfg_engines = cfg_engines
|
|
@file = "lxc-#{@release}-#{@arch}-#{Date.today}.box"
|
|
@scripts_path = Pathname(Dir.pwd).join('boxes')
|
|
|
|
task name do
|
|
RakeFileUtils.send(:verbose, true) do
|
|
build
|
|
end
|
|
end
|
|
end
|
|
|
|
def run(script_name, *args)
|
|
script = @scripts_path.join('common', script_name)
|
|
if script.readable?
|
|
sh "sudo #{script} #{args.join(' ')}"
|
|
else
|
|
STDERR.puts "cannot execute #{script_name} (not found?)"
|
|
exit 1
|
|
end
|
|
end
|
|
|
|
def build
|
|
check_if_box_has_been_built!
|
|
|
|
FileUtils.mkdir_p 'boxes/temp' unless File.exist? 'base/temp'
|
|
check_for_partially_built_box!
|
|
|
|
import_template do |template|
|
|
create_base_container(template) do |rootfs|
|
|
install_cfg_engines(rootfs)
|
|
cleanup(rootfs)
|
|
prepare_package_contents(rootfs)
|
|
compress_box(rootfs)
|
|
end
|
|
end
|
|
end
|
|
|
|
def check_if_box_has_been_built!
|
|
return unless File.exists?("./boxes/output/#{@file}")
|
|
|
|
puts 'Box has been built already!'
|
|
exit 1
|
|
end
|
|
|
|
def check_for_partially_built_box!
|
|
return unless Dir.entries('boxes/temp').size > 2
|
|
|
|
puts 'There is a partially built box under ' +
|
|
File.expand_path('./boxes/temp') +
|
|
', please remove it before building a new box'
|
|
exit 1
|
|
end
|
|
|
|
def create_base_container(template)
|
|
container_name = 'vagrant-base-box-tmp'
|
|
sh "sudo lxc-create -n #{container_name} -t vagrant-base-box-template -- --arch #{@arch} --release #{@release}"
|
|
yield "/var/lib/lxc/#{container_name}/rootfs"
|
|
ensure
|
|
sh "sudo lxc-destroy -n #{container_name}"
|
|
end
|
|
|
|
def install_cfg_engines(rootfs)
|
|
puts "TODO: Install cfg engines under #{rootfs}"
|
|
end
|
|
|
|
def prepare_package_contents(rootfs)
|
|
puts "TODO: Prepare pkg contents under #{rootfs}"
|
|
end
|
|
|
|
def compress_box(rootfs)
|
|
puts "TODO: Compress base box under #{rootfs}"
|
|
end
|
|
|
|
def cleanup(rootfs)
|
|
puts "TODO: Cleanup under #{rootfs}"
|
|
end
|
|
|
|
def import_template
|
|
template_name = "vagrant-base-box-template"
|
|
tmp_template_path = templates_path.join("lxc-#{template_name}")
|
|
src = "./boxes/templates/#{@distrib}"
|
|
|
|
sh "sudo cp #{src} #{tmp_template_path}"
|
|
|
|
yield template_name
|
|
ensure
|
|
sh "sudo rm #{tmp_template_path}" if tmp_template_path.file?
|
|
end
|
|
|
|
TEMPLATES_PATH_LOOKUP = %w(
|
|
/usr/share/lxc/templates
|
|
/usr/lib/lxc/templates
|
|
/usr/lib64/lxc/templates
|
|
/usr/local/lib/lxc/templates
|
|
)
|
|
def templates_path
|
|
return @templates_path if @templates_path
|
|
|
|
path = TEMPLATES_PATH_LOOKUP.find { |candidate| File.directory?(candidate) }
|
|
raise 'Unable to identify lxc templates path!' unless path
|
|
|
|
@templates_path = Pathname(path)
|
|
end
|
|
end
|
|
|
|
class BuildDebianBoxTask < BuildGenericBoxTask
|
|
def initialize(name, release, arch, opts = {})
|
|
super(name, 'debian', release, arch, opts)
|
|
end
|
|
end
|
|
|
|
class BuildUbuntuBoxTask < BuildGenericBoxTask
|
|
def initialize(name, release, arch, opts = {})
|
|
super(name, 'ubuntu', release, arch, opts)
|
|
end
|
|
end
|
|
|
|
cfg_engines = {
|
|
puppet: ENV['PUPPET'] == '1',
|
|
babushka: ENV['BABUSHKA'] == '1',
|
|
salt: ENV['SALT'] == '1',
|
|
chef: ENV['CHEF'] == '1'
|
|
}
|
|
|
|
namespace :boxes do
|
|
namespace :ubuntu do
|
|
namespace :build do
|
|
|
|
desc 'Build an Ubuntu Precise 64 bits box'
|
|
BuildUbuntuBoxTask.new(:precise64, :precise, 'amd64', cfg_engines)
|
|
|
|
desc 'Build an Ubuntu Quantal 64 bits box'
|
|
BuildUbuntuBoxTask.new(:quantal64, :quantal, 'amd64', cfg_engines)
|
|
|
|
desc 'Build an Ubuntu Raring 64 bits box'
|
|
BuildUbuntuBoxTask.new(:raring64, :raring, 'amd64', cfg_engines)
|
|
|
|
desc 'Build an Ubuntu Saucy 64 bits box'
|
|
BuildUbuntuBoxTask.new(:saucy64, :saucy, 'amd64', cfg_engines)
|
|
|
|
desc 'Build all Ubuntu boxes'
|
|
task :all => %w( precise64 quantal64 raring64 saucy64 )
|
|
end
|
|
end
|
|
|
|
namespace :debian do
|
|
%w( chef salt).each { |cfg| cfg_engines.delete(cfg.to_sym) }
|
|
namespace :build do
|
|
desc 'Build an Debian Squeeze 64 bits box'
|
|
BuildDebianBoxTask.new(:squeeze64, :squeeze, 'amd64', cfg_engines)
|
|
|
|
desc 'Build an Debian Wheezy 64 bits box'
|
|
BuildDebianBoxTask.new(:wheezy64, :wheezy, 'amd64', cfg_engines)
|
|
|
|
desc 'Build an Debian Sid/unstable 64 bits box'
|
|
BuildDebianBoxTask.new(:sid64, :sid, 'amd64', cfg_engines)
|
|
|
|
desc 'Build all Debian boxes'
|
|
task :all => %w( squeeze64 wheezy64 sid64 )
|
|
end
|
|
end
|
|
|
|
desc 'Build all base boxes for release'
|
|
task :build_all => %w( ubuntu:build:all debian:build:all )
|
|
end
|