class J4zzcat::Utils::Rake::DockerizeTask

Attributes

build_cmd[RW]
build_triggers[RW]
dockerfile[RW]
name[RW]
run_cmd[RW]
tag[RW]
verbose[RW]

Public Class Methods

new( *args, &task_block ) click to toggle source
# File lib/j4zzcat/utils/rake/dockerize_task.rb, line 20
def initialize( *args, &task_block )
  gemspec = Dir.glob( '*.gemspec' ).first
  gemspec ||= 'unknown_gem'

  # Defaults
  @name           = args.shift || :dockerize
  @dockerfile     = 'Dockerfile'
  @tag            = "#{File.basename( gemspec, '.*' )}:#{@name}"
  @build_cmd      = ''
  @build_triggers = [ '*.gemspec', @dockerfile ]
  @run_cmd        = ''
  @verbose        = false

  rake_args = ARGV

  define_task( args, rake_args, &task_block )
  config_task( args, &task_block )
end

Public Instance Methods

config_task( args, &task_block ) click to toggle source
# File lib/j4zzcat/utils/rake/dockerize_task.rb, line 47
def config_task( args, &task_block )
  task_block.call( self ) if !task_block.nil?
end
define_task( args, rake_args, &task_block ) click to toggle source
# File lib/j4zzcat/utils/rake/dockerize_task.rb, line 39
def define_task( args, rake_args, &task_block )
  desc 'Run rake within a docker container' unless ::Rake.application.last_description

  task @name do
    run_task rake_args
  end
end
docker_build( image ) click to toggle source
# File lib/j4zzcat/utils/rake/dockerize_task.rb, line 101
def docker_build( image )
  system( "docker build --rm -t #{@tag} -f #{@dockerfile} . \
           && touch #{docker_last_build_sentinal_file}" )
end
docker_image_info( tag ) click to toggle source
# File lib/j4zzcat/utils/rake/dockerize_task.rb, line 82
def docker_image_info( tag )
  image = OpenStruct.new

  image.tag = tag
  image.id = %x[ docker images -q #{tag} ].chop

  if image.id.nil? || image.id.empty?
    image.last_build = 0
  else
    begin
      image.last_build = File.stat( docker_last_build_sentinal_file ).mtime.to_i
    rescue
      image.last_build = 0
    end
  end

  image
end
docker_last_build_sentinal_file() click to toggle source
# File lib/j4zzcat/utils/rake/dockerize_task.rb, line 106
def docker_last_build_sentinal_file
  ".#{@tag.sub ':', '-'}.last_build"
end
run_task( rake_args ) click to toggle source
# File lib/j4zzcat/utils/rake/dockerize_task.rb, line 51
def run_task( rake_args )
  image = docker_image_info @tag
  if image.id.nil?
    docker_build image
  else
    @build_triggers.each do | file |
      Dir.glob( file ).each do | f |
        modified = File.stat( f ).mtime.to_i
        if( modified > image.last_build )
          docker_build image
          break
        end
      end
    end
  end

  rake_args -= [ @name.to_s ]
  rake_command = "cd /app; rake #{rake_args.join( ' ' )}"
  docker_command = "docker run --rm -it -e 'DOCKER=YES' -v $(pwd):/app #{@tag} /bin/bash -c \'#{rake_command}\'"

  puts docker_command if verbose
  exec docker_command

  #  return if system(command)
  #  puts failure_message if failure_message
  #
  #  return unless fail_on_error
  #  $stderr.puts "#{command} failed" if verbose
  #  exit $?.exitstatus || 1
end