lib/jenkinsfile_runner/commands/build.rb (52 lines of code) (raw):

# frozen_string_literal: true require 'pathname' require 'shellwords' require 'mkmf' require_relative 'build/configuration' module JenkinsfileRunner module Commands class Build attr_reader :configuration def initialize(argv) @configuration = Configuration.new(argv.dup) end def run puts "Running build with #{configuration.inspect}" @configuration.validate! find_docker_binary! validate_docker_version! puts "Logging in to #{configuration.registry}" docker('login', configuration.registry) docker('image', 'build', context_dir ,'--pull', '--tag', image_tag) docker('push', image_tag) docker('logout', configuration.registry) end private def find_docker_binary! @docker = MakeMakefile.find_executable('docker') abort('Could not find docker') unless @docker end def validate_docker_version! minimal_docker_version = Gem::Version.new('19.0') client_version = `#{@docker} version --format '{{.Client.Version}}'` client_version = Gem::Version.new(client_version) sever_version = `#{@docker} version --format '{{.Server.Version}}'` sever_version = Gem::Version.new(sever_version) return if client_version >= minimal_docker_version && sever_version >= minimal_docker_version abort("Docker #{minimal_docker_version} or above is required") end def context_dir Pathname(configuration.build_output).expand_path end def image_tag "#{configuration.registry}/#{configuration.image}".downcase end def docker(*args) system!(@docker, *args) end def system!(*args) args = args.map { |arg| Shellwords.escape(arg) } system(*args) || abort("\n== Command #{args} failed ==") end end end end