class Vanagon::Driver
Attributes
platform[RW]
preserve[RW]
project[RW]
remote_workdir[RW]
target[RW]
verbose[RW]
workdir[RW]
Public Class Methods
configdir()
click to toggle source
# File lib/vanagon/driver.rb, line 95 def self.configdir @@configdir end
logger()
click to toggle source
# File lib/vanagon/driver.rb, line 99 def self.logger @@logger end
new(platform, project, options = {})
click to toggle source
# File lib/vanagon/driver.rb, line 24 def initialize(platform, project, options = {}) # rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity @options = options @verbose = options[:verbose] || false @preserve = options[:preserve] || false @workdir = options[:workdir] || Dir.mktmpdir @@configdir = options[:configdir] || File.join(Dir.pwd, "configs") components = options[:components] || [] only_build = options[:only_build] @platform = Vanagon::Platform.load_platform(platform, File.join(@@configdir, "platforms")) @project = Vanagon::Project.load_project( project, File.join(@@configdir, "projects"), @platform, components ) @project.settings[:verbose] = options[:verbose] @project.settings[:skipcheck] = options[:skipcheck] || false if only_build && !only_build.empty? filter_out_components(only_build) end loginit('vanagon_hosts.log') @remote_workdir = options[:'remote-workdir'] engine = pick_engine(options) load_engine_object(engine, @platform, options[:target]) end
Public Instance Methods
build_host_info()
click to toggle source
# File lib/vanagon/driver.rb, line 103 def build_host_info { "name" => @engine.build_host_name, "engine" => @engine.name } end
camelize(string)
click to toggle source
# File lib/vanagon/driver.rb, line 85 def camelize(string) string.gsub(/(?:^|_)([a-z])?/) do |match| (Regexp.last_match[1] || '').capitalize end end
cleanup_workdir()
click to toggle source
# File lib/vanagon/driver.rb, line 91 def cleanup_workdir FileUtils.rm_rf(workdir) end
dependencies()
click to toggle source
# File lib/vanagon/driver.rb, line 187 def dependencies # Simple sanity check for the project if @project.version.nil? || @project.version.empty? raise Vanagon::Error, "Project requires a version set, all is lost." end VanagonLogger.info "creating dependencies list" @project.fetch_sources(workdir, retry_count, timeout) @project.cli_manifest_json(@platform) end
filter_out_components(only_build)
click to toggle source
# File lib/vanagon/driver.rb, line 51 def filter_out_components(only_build) # map each element in the only_build array to it's set of filtered components, then # flatten all the results in to one array and set project.components to that. @project.components = only_build.flat_map { |comp| @project.filter_component(comp) }.uniq if @verbose VanagonLogger.info "Only building:" @project.components.each { |comp| VanagonLogger.info comp.name } end end
install_build_dependencies()
click to toggle source
# File lib/vanagon/driver.rb, line 114 def install_build_dependencies # rubocop:disable Metrics/AbcSize unless list_build_dependencies.empty? if @platform.build_dependencies && @platform.build_dependencies.command && !@platform.build_dependencies.command.empty? @engine.dispatch("#{@platform.build_dependencies.command} #{list_build_dependencies.join(' ')} #{@platform.build_dependencies.suffix}") elsif @platform.respond_to?(:install_build_dependencies) @engine.dispatch(@platform.install_build_dependencies(list_build_dependencies)) else raise Vanagon::Error, "No method defined to install build dependencies for #{@platform.name}" end end end
list_build_dependencies()
click to toggle source
Returns the set difference between the build_requires and the components to get a list of external dependencies that need to be installed.
# File lib/vanagon/driver.rb, line 110 def list_build_dependencies @project.components.map(&:build_requires).flatten.uniq - @project.components.map(&:name) end
load_engine_object(engine_type, platform, target)
click to toggle source
# File lib/vanagon/driver.rb, line 77 def load_engine_object(engine_type, platform, target) require "vanagon/engine/#{engine_type}" @engine = Object::const_get("Vanagon::Engine::#{camelize(engine_type)}") .new(platform, target, remote_workdir: remote_workdir) rescue StandardError, ScriptError => e raise Vanagon::Error.wrap(e, "Could not load the desired engine '#{engine_type}'") end
pick_engine(options)
click to toggle source
# File lib/vanagon/driver.rb, line 61 def pick_engine(options) if options[:engine] && !options[:target] options[:engine] elsif @platform.build_hosts 'hardware' elsif @platform.aws_ami 'ec2' elsif @platform.docker_image 'docker' elsif options[:target] 'base' else 'always_be_scheduling' end end
render()
click to toggle source
# File lib/vanagon/driver.rb, line 174 def render # Simple sanity check for the project if @project.version.nil? || @project.version.empty? raise Vanagon::Error, "Project requires a version set, all is lost." end VanagonLogger.info "rendering Makefile" @project.fetch_sources(workdir, retry_count, timeout) @project.make_bill_of_materials(workdir) @project.generate_packaging_artifacts(workdir) @project.make_makefile(workdir) end
retry_count()
click to toggle source
# File lib/vanagon/driver.rb, line 20 def retry_count @retry_count ||= @project.retry_count || ENV["VANAGON_RETRY_COUNT"] || 1 end
run()
click to toggle source
# File lib/vanagon/driver.rb, line 126 def run # rubocop:disable Metrics/AbcSize, Metrics/PerceivedComplexity # Simple sanity check for the project if @project.version.nil? or @project.version.empty? raise Vanagon::Error, "Project requires a version set, all is lost." end # if no_packaging has been set in the project, don't execute the # whole makefile. Instead just perform the installation. make_target = '' if @project.no_packaging make_target = "#{@project.name}-project" end @engine.startup(workdir) VanagonLogger.info "Target is #{@engine.target}" Vanagon::Utilities.retry_with_timeout(retry_count, timeout) do install_build_dependencies end @project.fetch_sources(workdir, retry_count, timeout) @project.make_makefile(workdir) @project.make_bill_of_materials(workdir) # Don't generate packaging artifacts if no_packaging is set @project.generate_packaging_artifacts(workdir) unless @project.no_packaging @project.save_manifest_json(@platform, workdir) @engine.ship_workdir(workdir) @engine.dispatch("(cd #{@engine.remote_workdir}; #{@platform.make} #{make_target})") @engine.retrieve_built_artifact(@project.artifacts_to_fetch, @project.no_packaging) @project.publish_yaml_settings(@platform) if %i[never on-failure].include? @preserve @engine.teardown cleanup_workdir end rescue StandardError => e if [:never].include? @preserve @engine.teardown cleanup_workdir end VanagonLogger.error(e) VanagonLogger.error e.backtrace.join("\n") raise e ensure if ["hardware", "ec2"].include?(@engine.name) @engine.teardown end end
timeout()
click to toggle source
# File lib/vanagon/driver.rb, line 16 def timeout @timeout ||= @project.timeout || ENV["VANAGON_TIMEOUT"] || 7200 end
Private Instance Methods
loginit(logfile)
click to toggle source
Initialize the logging instance
# File lib/vanagon/driver.rb, line 199 def loginit(logfile) @@logger = Logger.new(logfile) @@logger.progname = 'vanagon' end