Refactor to tag builds correctly

This commit is contained in:
Charles Care
2019-08-15 14:00:52 +01:00
parent 85978063bb
commit 8d9431859e
17 changed files with 186 additions and 111 deletions

View File

@@ -12,9 +12,9 @@ Aws.config.update({
module Pipeline
def self.spike
puts "OK"
# AnalyzerBuild.("ruby")
repo = Pipeline::AnalyzerRepo.new("/home/ccare/code/exercism/sample-analyzer")
repo.fetch!
AnalyzerBuild.("ruby")
# repo = Pipeline::AnalyzerRepo.new("/home/ccare/code/exercism/sample-analyzer")
# repo.fetch!
puts "DONE"
end
end
@@ -24,9 +24,11 @@ require "pipeline/analyzer_build"
require "pipeline/validation/check_invokable"
require "pipeline/validation/check_environment_invariants"
require "pipeline/validation/check_fixtures"
require "pipeline/validation/fixture_check_error.rb"
require "pipeline/validate_build"
require "pipeline/util/container_driver"
require "pipeline/util/runc_configurator"
require "pipeline/util/img_wrapper"
require "pipeline/util/runc_wrapper"
require "pipeline/build_image"
require "pipeline/publish_image"

View File

@@ -1,104 +1,35 @@
class Pipeline::AnalyzerBuild
include Mandate
attr_accessor :img, :target_sha, :build_tag
attr_accessor :img, :runc, :target_sha, :build_tag, :image_tag
initialize_with :track_slug
def call
@build_tag = "master"
@img = File.expand_path "./opt/img"
repo.fetch!
checkout
setup_utiliies
build
validate
return
puts "login"
login_to_repository
tag_build
push_build
logout
publish
end
def checkout
@target_sha = repo.checkout(build_tag)
def setup_utiliies
@img = Pipeline::Util::ImgWrapper.new
end
def build
Dir.chdir(repo.workdir) do
cmd = "#{build_cmd} -t #{local_tag} ."
exec_cmd cmd
end
@build_tag = "master"
@image_tag = Pipeline::BuildImage.(build_tag, image_name, repo, img)
end
def validate
Pipeline::ValidateBuild.(track_slug, local_tag)
Pipeline::ValidateBuild.(image_tag, "fixtures/#{track_slug}")
end
def login_to_repository
ecr = Aws::ECR::Client.new(region: 'eu-west-1')
authorization_token = ecr.get_authorization_token.authorization_data[0].authorization_token
plain = Base64.decode64(authorization_token)
user,password = plain.split(":")
exec_cmd "#{img} login -u AWS -p \"#{password}\" #{registry_endpoint}"
def publish
Pipeline::PublishImage.(img, image_name, image_tag, build_tag)
end
def logout
exec_cmd "#{img} logout #{registry_endpoint}"
end
def tag_build
exec_cmd "#{tag_cmd} #{local_tag} #{remote_tag}"
exec_cmd "#{tag_cmd} #{local_tag} #{remote_human_tag}"
exec_cmd "#{tag_cmd} #{local_tag} #{remote_latest_tag}"
end
def push_build
exec_cmd "#{push_cmd} #{remote_tag}"
exec_cmd "#{push_cmd} #{remote_human_tag}"
exec_cmd "#{push_cmd} #{remote_latest_tag}"
end
def push_cmd
"#{img} push -state /tmp/state-img"
end
def build_cmd
"#{img} build -state /tmp/state-img"
end
def tag_cmd
"#{img} tag -state /tmp/state-img"
end
def exec_cmd(cmd)
puts "> #{cmd}"
puts "------------------------------------------------------------"
success = system({}, cmd)
raise "Failed #{cmd}" unless success
end
def local_tag
"#{slug}:#{target_sha}"
end
def remote_tag
"#{registry_endpoint}/#{slug}:#{target_sha}"
end
def remote_human_tag
"#{registry_endpoint}/#{slug}:#{build_tag}"
end
def remote_latest_tag
"#{registry_endpoint}/#{slug}:latest"
end
def registry_endpoint
"681735686245.dkr.ecr.eu-west-1.amazonaws.com"
end
def slug
def image_name
"#{track_slug}-analyzer-dev"
end

View File

@@ -1,12 +1,11 @@
class Pipeline::BuildImage
include Mandate
attr_accessor :target_sha, :build_tag
attr_accessor :target_sha
initialize_with :track_slug, :repo, :img
initialize_with :build_tag, :image_slug, :repo, :img
def call
@build_tag = "master"
repo.fetch!
checkout
build
@@ -24,10 +23,6 @@ class Pipeline::BuildImage
end
def local_tag
"#{slug}:#{target_sha}"
end
def slug
"#{track_slug}-analyzer-dev"
"#{image_slug}:#{target_sha}"
end
end

View File

@@ -0,0 +1,64 @@
class Pipeline::PublishImage
include Mandate
initialize_with :img, :image_name, :image_tag, :build_tag
def call
puts "PUBLISHING #{image_tag}"
puts "Login to repo"
login_to_repository
tag_build
push_build
logout
end
def login_to_repository
ecr = Aws::ECR::Client.new(region: 'eu-west-1')
authorization_token = ecr.get_authorization_token.authorization_data[0].authorization_token
plain = Base64.decode64(authorization_token)
user,password = plain.split(":")
img.login("AWS", password, registry_endpoint)
end
def logout
img.logout(registry_endpoint)
end
def registry_endpoint
"681735686245.dkr.ecr.eu-west-1.amazonaws.com"
end
def tag_build
img.tag(image_tag, remote_tag)
img.tag(image_tag, remote_human_tag) unless build_tag.nil?
img.tag(image_tag, remote_latest_tag)
end
def push_build
img.push(remote_tag)
img.push(remote_human_tag) unless build_tag.nil?
img.push(remote_latest_tag)
end
def remote_tag
"#{registry_endpoint}/#{image_tag}"
end
def remote_human_tag
"#{registry_endpoint}/#{image_name}:#{build_tag}"
end
def remote_latest_tag
"#{registry_endpoint}/#{image_name}:latest"
end
def registry_endpoint
"681735686245.dkr.ecr.eu-west-1.amazonaws.com"
end
def slug
image_tag
end
end

View File

@@ -1,5 +1,6 @@
module Pipeline::Util
class ImgWrapper
attr_accessor :binary_path, :state_location, :suppress_output
def initialize
@@ -17,6 +18,22 @@ module Pipeline::Util
exec_cmd "#{binary_path} unpack -state #{state_location} #{local_tag}"
end
def login(user, password, registry_endpoint)
exec_cmd "#{binary_path} login -u #{user} -p \"#{password}\" #{registry_endpoint}"
end
def logout(registry_endpoint)
exec_cmd "#{binary_path} logout #{registry_endpoint}"
end
def tag(image, new_tag)
exec_cmd "#{tag_cmd} #{image} #{new_tag}"
end
def push(remote_tag)
exec_cmd "#{push_cmd} #{remote_tag}"
end
def push_cmd
"#{binary_path} push -state #{state_location}"
end

View File

@@ -5,7 +5,6 @@ module Pipeline::Validation
initialize_with :container_driver, :fixtures_folder
def call
clean_and_setup
exercise_folders = Dir.glob("#{fixtures_folder}/*")
exercise_folders.each do |exercise_folder|
exercise_slug = exercise_folder.split("/").last
@@ -15,11 +14,8 @@ module Pipeline::Validation
end
end
def clean_and_setup
FileUtils.rm_rf("#{workdir}/iteration/")
end
def validate_status(exercise, fixture_folder)
FileUtils.rm_rf("#{workdir}/iteration/")
FileUtils.cp_r "#{fixture_folder}/iteration", "#{workdir}/iteration"
container_driver.run_analyzer_for(exercise)
@@ -28,10 +24,20 @@ module Pipeline::Validation
expected = JSON.parse(File.read("#{fixture_folder}/expected_analysis.json"))
raise "Incorrect expected_status" if expected["status"].nil?
raise "Incorrect status when validating #{fixture_folder}" if expected["status"] != analysis["status"]
if expected["status"] != analysis["status"]
mismatch = "<#{analysis["status"]}> not <#{expected["status"]}>"
msg = "Incorrect status (#{mismatch}) when validating #{fixture_folder}"
err = FixtureCheckError.new(msg)
raise err
end
expected["comments"] ||= []
analysis["comments"] ||= []
raise "Incorrect comments when validating #{fixture_folder}" if expected["comments"].sort != analysis["comments"].sort
if expected["comments"].sort != analysis["comments"].sort
msg = "Incorrect comments when validating #{fixture_folder}."
msg += " Got: " + analysis["comments"].to_json
raise FixtureCheckError.new(msg)
end
end
def workdir

View File

@@ -0,0 +1,7 @@
class FixtureCheckError < StandardError
def initialize(*args)
super
end
end