class Buildizer::Docker

Attributes

builder[R]
cache[R]

Public Class Methods

new(builder, cache: nil) click to toggle source
# File lib/buildizer/docker.rb, line 6
def initialize(builder, cache: nil)
  @builder = builder
  @cache = cache
end

Public Instance Methods

_make_cmd(cmd) click to toggle source
# File lib/buildizer/docker.rb, line 205
def _make_cmd(cmd)
  Array(cmd).join('; ')
end
_prepare_container_params(image, env: {}) click to toggle source
# File lib/buildizer/docker.rb, line 177
def _prepare_container_params(image, env: {})
  image.extra_path.mkpath
  image.build_path.mkpath

  [*env.map {|k,v| "-e #{k}=#{v}"},
   "-v #{builder.buildizer.package_path}:#{container_package_mount_path}:ro",
   "-v #{image.extra_path}:#{container_extra_path}:ro",
   "-v #{image.build_path}:#{container_build_path}",
   image.name].compact
end
_prepare_docker_opts(docker_opts) click to toggle source
# File lib/buildizer/docker.rb, line 188
def _prepare_docker_opts(docker_opts)
  docker_opts.map do |k, v|
    next if v.nil?

    to_opt = ->(value) {"--#{k}=#{value}"}
    if v.is_a? Array
      v.map(&to_opt)
    else
      to_opt[v]
    end
  end.flatten.compact
end
_wrap_docker_command(cmd) click to toggle source
# File lib/buildizer/docker.rb, line 201
def _wrap_docker_command(cmd)
  "/bin/bash -lec '#{_make_cmd(cmd)}'"
end
cache_build_image(build_image, cache_image) click to toggle source
# File lib/buildizer/docker.rb, line 77
def cache_build_image(build_image, cache_image)
  builder.buildizer.command! "docker tag -f #{build_image.name} #{cache_image.name}",
                              desc: "Tag prepared build image #{build_image.name}" +
                                    " as cache image #{cache_image.name}"
  builder.buildizer.command! "docker push #{cache_image.name}",
                              desc: "Push cache image #{cache_image.name}"
end
cache_login!() click to toggle source
# File lib/buildizer/docker.rb, line 47
def cache_login!
  raise Error, error: :logical_error, message: "no docker cache account info" unless cache

  cmd = ["docker login"]
  cmd << "--email=#{cache[:email]}" if cache[:email]
  cmd << "--username=#{cache[:user]}" if cache[:user]
  cmd << "--password=#{cache[:password]}" if cache[:password]
  cmd << "--server=#{cache[:server]}" if cache[:server]
  builder.buildizer.command! cmd.join(' '), desc: "Docker cache account login"
end
cache_logout!() click to toggle source
# File lib/buildizer/docker.rb, line 58
def cache_logout!
  raise Error, error: :logical_error, message: "no docker cache account info" unless cache
  builder.buildizer.command! 'docker logout', desc: "Docker cache account logout"
end
container_build_path() click to toggle source
# File lib/buildizer/docker.rb, line 111
def container_build_path
  Pathname.new('/build')
end
container_extra_path() click to toggle source
# File lib/buildizer/docker.rb, line 115
def container_extra_path
  Pathname.new('/extra')
end
container_package_archive_path() click to toggle source
# File lib/buildizer/docker.rb, line 103
def container_package_archive_path
  Pathname.new('/package.tar.gz')
end
container_package_mount_path() click to toggle source
# File lib/buildizer/docker.rb, line 107
def container_package_mount_path
  Pathname.new('/.package')
end
container_package_path() click to toggle source
# File lib/buildizer/docker.rb, line 99
def container_package_path
  Pathname.new('/package')
end
make_build_image(target) click to toggle source
# File lib/buildizer/docker.rb, line 85
def make_build_image(target)
  pull_cache_image(target.build_image, target.cache_image) if target.cache_image

  target.build_image.dockerfile_write!

  builder.buildizer.command! "docker build " +
                             "-t #{target.build_image.name} " +
                             "-f #{target.build_image.dockerfile_path} " +
                             "#{target.build_image.dockerfile_path.dirname}",
                              desc: "Build docker image #{target.build_image.name}"

  cache_build_image(target.build_image, target.cache_image) if target.cache_image
end
new_os(name, version, **kwargs) click to toggle source
# File lib/buildizer/docker.rb, line 27
def new_os(name, version, **kwargs)
  klass = os_klass(name, version)
  raise Error, message: "unknown os '#{[name, version].compact.join('-')}'" unless klass
  klass.new(self, **kwargs)
end
os_klass(name, version) click to toggle source
# File lib/buildizer/docker.rb, line 11
def os_klass(name, version)
  ({
    'ubuntu' => {
      '12.04' => Os::Ubuntu1204,
      '14.04' => Os::Ubuntu1404,
      '16.04' => Os::Ubuntu1604,
      nil => Os::Ubuntu1404,
    },
    'centos' => {
      'centos6' => Os::Centos6,
      'centos7' => Os::Centos7,
      nil => Os::Centos7,
    },
  }[name] || {})[version]
end
pull_cache_image(build_image, cache_image) click to toggle source
# File lib/buildizer/docker.rb, line 63
def pull_cache_image(build_image, cache_image)
  pull_cache_res = builder.buildizer.command(
    "docker pull #{cache_image.name}",
     desc: "Try to pull docker cache image #{cache_image.name}"
  )
  if pull_cache_res.status.success?
    builder.buildizer.command! "docker tag -f #{cache_image.name} #{build_image.name}",
                                desc: "Tag cache image #{cache_image.name}" +
                                      " as prepared build image #{build_image.name}"
    builder.buildizer.command! "docker rmi #{cache_image.name}",
                                desc: "Remove cache image #{cache_image.name}"
  end
end
run_container!(name: nil, image:, env: {}, desc: nil, docker_opts: {}) click to toggle source
# File lib/buildizer/docker.rb, line 119
def run_container!(name: nil, image:, env: {}, desc: nil, docker_opts: {})
  (name || SecureRandom.uuid).tap do |name|
    builder.buildizer.command! [
      "docker run --detach --name #{name}",
      *Array(_prepare_docker_opts(docker_opts)),
      *Array(_prepare_container_params(image, env: env)),
      _wrap_docker_command("while true ; do sleep 1 ; done"),
    ].join(' '), desc: desc
  end
end
run_in_container(container:, cmd:, desc: nil, cmd_opts: {}, docker_opts: {}) click to toggle source
# File lib/buildizer/docker.rb, line 148
def run_in_container(container:, cmd:, desc: nil, cmd_opts: {}, docker_opts: {})
  builder.buildizer.command [
    "docker exec",
    *Array(_prepare_docker_opts(docker_opts)),
    container,
    _wrap_docker_command(cmd),
  ].join(' '), timeout: 24*60*60, desc: desc, **cmd_opts
end
run_in_container!(cmd_opts: {}, **kwargs) click to toggle source
# File lib/buildizer/docker.rb, line 157
def run_in_container!(cmd_opts: {}, **kwargs)
  cmd_opts[:do_raise] = true
  cmd_opts[:log_failure] = true
  run_in_container(cmd_opts: cmd_opts, **kwargs)
end
run_in_image(image:, cmd:, env: {}, desc: nil, cmd_opts: {}, docker_opts: {}) click to toggle source
# File lib/buildizer/docker.rb, line 163
def run_in_image(image:, cmd:, env: {}, desc: nil, cmd_opts: {}, docker_opts: {})
  builder.buildizer.command [
    "docker run --rm",
    *Array(_prepare_docker_opts(docker_opts)),
    *Array(_prepare_container_params(image, env: env)),
    _wrap_docker_command(cmd),
  ].join(' '), timeout: 24*60*60, desc: desc, **cmd_opts
end
run_in_image!(cmd_opts: {}, **kwargs) click to toggle source
# File lib/buildizer/docker.rb, line 172
def run_in_image!(cmd_opts: {}, **kwargs)
  cmd_opts[:do_raise] = true
  run_in_image(cmd_opts: cmd_opts, **kwargs)
end
shell_in_container(container:) click to toggle source
# File lib/buildizer/docker.rb, line 144
def shell_in_container(container:)
  system "docker exec -ti #{container} bash -lec 'cd #{container_package_mount_path}; bash'"
end
shutdown_container!(container:) click to toggle source
# File lib/buildizer/docker.rb, line 130
def shutdown_container!(container:)
  builder.buildizer.command! "docker kill #{container}", desc: "Kill container '#{container}'"
  builder.buildizer.command! "docker rm #{container}", desc: "Remove container '#{container}'"
end
with_cache() { || ... } click to toggle source
# File lib/buildizer/docker.rb, line 33
def with_cache(&blk)
  builder.buildizer.warn "No docker cache account settings " +
                         "(BUILDIZER_DOCKER_CACHE, BUILDIZER_DOCKER_CACHE_USERNAME," +
                         " BUILDIZER_DOCKER_CACHE_PASSWORD, BUILDIZER_DOCKER_CACHE_EMAIL," +
                         " BUILDIZER_DOCKER_CACHE_SERVER)" unless cache

  cache_login! if cache
  begin
    yield if block_given?
  ensure
    cache_logout! if cache
  end
end
with_container(**kwargs) { |container| ... } click to toggle source
# File lib/buildizer/docker.rb, line 135
def with_container(**kwargs, &blk)
  container = run_container!(**kwargs)
  begin
    yield container if block_given?
  ensure
    shutdown_container!(container: container)
  end
end