Extracting a class to represent a single run

This commit is contained in:
Charles Care
2019-09-03 10:41:48 +01:00
parent e3946d2c51
commit 4209ec3c5d
4 changed files with 109 additions and 38 deletions

View File

@@ -5,6 +5,6 @@ $LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
require "pipeline"
Pipeline.load_config(File.expand_path('../../config/pipeline.yml', __FILE__))
# Pipeline.build_analyzer(ARGV[0])
# Pipeline.scratch
# Pipeline.build_analyzer("ruby")
# Pipeline.release
Pipeline.analyzer

View File

@@ -21,15 +21,13 @@ module Pipeline
end
def self.build_analyzer(track_slug)
AnalyzerBuild.("master", track_slug)
end
def self.scratch
track_slug = "rust"
repo = Pipeline::AnalyzerRepo.for_track(track_slug)
latest_tag = repo.tags.keys.last
if (latest_tag.nil?)
latest_tag = "master"
end
puts latest_tag
AnalyzerBuild.(latest_tag, track_slug)
Pipeline::Build::AnalyzerBuild.(latest_tag, track_slug)
end
def self.release
@@ -45,11 +43,12 @@ module Pipeline
def self.analyzer
env_base = "/tmp/analyzer-env/1e9c733fd7502974c2a3fdd85da9c844"
environment = Runtime::RuntimeEnvironment.new(env_base)
solution_dir = environment.prepare_analysis("ruby", 42)
iteration_folder = "#{solution_dir}/iteration"
analysis_run = environment.new_analysis("ruby", "two-fer", 42)
analysis_run.prepare_iteration do |iteration_folder|
File.write("#{iteration_folder}/two_fer.rb", 'puts "hello"')
environment.run_analysis("ruby", solution_dir, "two_fer")
puts File.read("#{iteration_folder}/analysis.json")
end
analysis_run.analyze!
puts analysis_run.result
end
end
@@ -67,3 +66,4 @@ require "pipeline/build/build_image"
require "pipeline/build/publish_image"
require "pipeline/build/analyzer_build"
require "pipeline/runtime/runtime_environment"
require "pipeline/runtime/analysis_run"

View File

@@ -0,0 +1,62 @@
module Pipeline::Runtime
class AnalysisRun
attr_reader :track_dir, :exercise_slug, :runs_dir, :solution_dir,
:iteration_folder, :tmp_folder, :current_dir
def initialize(track_dir, exercise_slug, solution_slug)
@track_dir = track_dir
@exercise_slug = exercise_slug
@runs_dir = "#{track_dir}/runs"
@current_dir = "#{track_dir}/current"
@solution_dir = "#{runs_dir}/iteration_#{Time.now.to_i}-#{solution_slug}-#{SecureRandom.hex}"
@iteration_folder = "#{solution_dir}/iteration"
@tmp_folder = "#{solution_dir}/tmp"
end
def prepare_iteration
FileUtils.mkdir_p iteration_folder
FileUtils.mkdir_p tmp_folder
configurator.setup_for_terminal_access
File.write("#{solution_dir}/terminal_config.json", configurator.build.to_json)
yield iteration_folder
end
def analyze!
container_driver = Pipeline::Util::ContainerDriver.new(runc, img, configurator, solution_dir)
container_driver.run_analyzer_for(exercise_slug)
end
def result
File.read("#{iteration_folder}/analysis.json")
end
private
def configurator
@configurator ||= begin
configurator = Pipeline::Util::RuncConfigurator.new
configurator.seed_from_env
configurator.rootfs = rootfs_source
configurator
end
end
def img
@img ||= Pipeline::Util::ImgWrapper.new
end
def runc
@runc ||= Pipeline::Util::RuncWrapper.new
end
def rootfs_source
@rootfs_source ||= begin
release_folder = File.readlink(current_dir)
"#{release_folder}/rootfs"
end
end
end
end

View File

@@ -59,35 +59,44 @@ module Pipeline::Runtime
FileUtils.mkdir_p iterations
end
def prepare_analysis(track_slug, solution_id)
def new_analysis(track_slug, exercise_slug, solution_slug)
track_dir = "#{env_base}/#{track_slug}"
runs_dir = "#{track_dir}/runs"
current_dir = "#{track_dir}/current"
solution_dir = "#{runs_dir}/iteration_#{Time.now.to_i}-#{solution_id}-#{SecureRandom.hex}"
iteration_folder = "#{solution_dir}/iteration"
tmp_folder = "#{solution_dir}/tmp"
FileUtils.mkdir_p iteration_folder
FileUtils.mkdir_p tmp_folder
solution_dir
AnalysisRun.new(track_dir, exercise_slug, solution_slug)
end
def run_analysis(track_slug, solution_dir, exercise_slug)
track_dir = "#{env_base}/#{track_slug}"
runs_dir = "#{track_dir}/runs"
current_dir = "#{track_dir}/current"
img = Pipeline::Util::ImgWrapper.new
runc = Pipeline::Util::RuncWrapper.new
configurator = Pipeline::Util::RuncConfigurator.new
configurator.seed_from_env
rootfs_source = "#{File.readlink(current_dir)}/rootfs"
configurator.rootfs = rootfs_source
container_driver = Pipeline::Util::ContainerDriver.new(runc, img, configurator, solution_dir)
container_driver.run_analyzer_for("two-fer")
end
# def prepare_analysis(track_slug, solution_id)
# track_dir = "#{env_base}/#{track_slug}"
# runs_dir = "#{track_dir}/runs"
# current_dir = "#{track_dir}/current"
# solution_dir = "#{runs_dir}/iteration_#{Time.now.to_i}-#{solution_id}-#{SecureRandom.hex}"
#
# iteration_folder = "#{solution_dir}/iteration"
# tmp_folder = "#{solution_dir}/tmp"
#
#
# FileUtils.mkdir_p iteration_folder
# FileUtils.mkdir_p tmp_folder
# solution_dir
# end
#
# def run_analysis(track_slug, solution_dir, exercise_slug)
# track_dir = "#{env_base}/#{track_slug}"
# runs_dir = "#{track_dir}/runs"
# current_dir = "#{track_dir}/current"
# img = Pipeline::Util::ImgWrapper.new
# runc = Pipeline::Util::RuncWrapper.new
# configurator = Pipeline::Util::RuncConfigurator.new
# configurator.seed_from_env
#
# rootfs_source = "#{File.readlink(current_dir)}/rootfs"
# configurator.rootfs = rootfs_source
#
# configurator.setup_for_terminal_access
# File.write("#{solution_dir}/terminal_config.json", configurator.build.to_json)
#
# container_driver = Pipeline::Util::ContainerDriver.new(runc, img, configurator, solution_dir)
# container_driver.run_analyzer_for("two-fer")
# end
def analyze_solution(track_slug, solution_id, exercise_slug)
iteration_folder = prepare_analysis