Initial work on new analyzer pipeline

This commit is contained in:
Charles Care
2019-08-08 10:40:29 +01:00
parent beeea4b83e
commit d91f2033a7
9 changed files with 242 additions and 0 deletions

2
.gitignore vendored
View File

@@ -1,2 +1,4 @@
*.swp
.DS_Store
tmp/*
opt/

7
Gemfile Normal file
View File

@@ -0,0 +1,7 @@
source :rubygems
gem "activesupport"
gem "mandate"
gem "propono"
gem "rugged"
gem 'aws-sdk-ecr'

52
Gemfile.lock Normal file
View File

@@ -0,0 +1,52 @@
GEM
remote: http://rubygems.org/
specs:
activesupport (5.2.3)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
aws-eventstream (1.0.3)
aws-partitions (1.196.0)
aws-sdk-core (3.62.0)
aws-eventstream (~> 1.0, >= 1.0.2)
aws-partitions (~> 1.0)
aws-sigv4 (~> 1.1)
jmespath (~> 1.0)
aws-sdk-ecr (1.20.0)
aws-sdk-core (~> 3, >= 3.61.1)
aws-sigv4 (~> 1.1)
aws-sdk-sns (1.19.0)
aws-sdk-core (~> 3, >= 3.61.1)
aws-sigv4 (~> 1.1)
aws-sdk-sqs (1.20.0)
aws-sdk-core (~> 3, >= 3.61.1)
aws-sigv4 (~> 1.1)
aws-sigv4 (1.1.0)
aws-eventstream (~> 1.0, >= 1.0.2)
concurrent-ruby (1.1.5)
i18n (1.6.0)
concurrent-ruby (~> 1.0)
jmespath (1.4.0)
mandate (0.2.0)
minitest (5.11.3)
propono (2.1.0)
aws-sdk-sns
aws-sdk-sqs
rugged (0.28.2)
thread_safe (0.3.6)
tzinfo (1.2.5)
thread_safe (~> 0.1)
PLATFORMS
ruby
DEPENDENCIES
activesupport
aws-sdk-ecr
mandate
propono
rugged
BUNDLED WITH
1.17.2

0
README Normal file
View File

3
bin/builderd Executable file
View File

@@ -0,0 +1,3 @@
#!/usr/bin/env ruby
puts "OK"

7
bin/spike Executable file
View File

@@ -0,0 +1,7 @@
#!/usr/bin/env ruby
require "bundler/setup"
$LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
require "pipeline"
Pipeline.spike

21
lib/pipeline.rb Normal file
View File

@@ -0,0 +1,21 @@
require "mandate"
require "propono"
require "active_support"
require 'securerandom'
require 'rugged'
require 'aws-sdk-ecr'
Aws.config.update({
credentials: Aws::Credentials.new('AKIAZ5OU5BBSQDMMFQ7J', '+Q2fMSju+dJljn6G2XFZOt6vUHgSF56P736yPQhj')
})
module Pipeline
def self.spike
puts "OK"
AnalyzerBuild.("ruby")
puts "DONE"
end
end
require "pipeline/analyzer_repo"
require "pipeline/analyzer_build"

View File

@@ -0,0 +1,88 @@
class Pipeline::AnalyzerBuild
include Mandate
attr_accessor :img
initialize_with :track_slug
def call
@img = File.expand_path "./opt/img"
repo.fetch!
checkout
build
puts "login"
login_to_repository
tag_build
push_build
logout
end
def checkout
repo.checkout("master")
end
def build
opt_dir = File.expand_path "./opt"
Dir.chdir(repo.workdir) do
cmd = "#{build_cmd} -t #{current_tag} ."
exec_cmd cmd
end
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}"
end
def logout
exec_cmd "#{img} logout #{registry_endpoint}"
end
def tag_build
# exec_cmd "#{img} tag #{current_tag} #{registry_endpoint}/#{current_tag}"
# exec_cmd "#{img} tag #{current_tag} #{registry_endpoint}/#{slug}:latest"
end
def push_build
exec_cmd "#{push_cmd} #{current_tag}"
# exec_cmd "#{img} push #{registry_endpoint}/#{slug}:latest"
end
def push_cmd
"#{img} push -state /tmp/state-img"
end
def build_cmd
"#{img} build -state /tmp/state-img"
end
def exec_cmd(cmd)
puts "> #{cmd}"
puts "------------------------------------------------------------"
success = system({}, cmd)
raise "Failed #{cmd}" unless success
end
def current_tag
"#{registry_endpoint}/#{slug}:abc"
end
def registry_endpoint
"681735686245.dkr.ecr.eu-west-1.amazonaws.com"
end
def slug
"#{track_slug}-analyzer-dev"
end
memoize
def repo
repo_url = "https://github.com/exercism/#{track_slug}-analyzer"
Pipeline::AnalyzerRepo.new(repo_url)
end
end

View File

@@ -0,0 +1,62 @@
class Pipeline::AnalyzerRepo
BASE_DIR = ENV.fetch("ANALYZER_REPO_BASE_DIR", "./tmp/repos")
attr_reader :repo_url
def initialize(repo_url)
@repo_url = repo_url
puts repo_dir
end
def fetch!
repo.fetch('origin')
end
def head
head_commit.oid
end
def checkout(ref)
repo.checkout(ref)
end
def workdir
repo.workdir
end
private
def repo
@repo ||= if repo_dir_exists?
Rugged::Repository.new(repo_dir)
else
Rugged::Repository.clone_at(repo_url, repo_dir)
end
rescue => e
puts "Failed to clone repo #{repo_url}"
puts e.message
raise
end
def main_branch_ref
"origin/master"
end
def repo_dir_exists?
File.directory?(repo_dir)
end
def repo_dir
"#{BASE_DIR}/#{url_hash}-#{local_name}"
end
def url_hash
Digest::SHA1.hexdigest(repo_url)
end
def local_name
repo_url.split("/").last
end
end