class Dockly::Deb

Public Instance Methods

build() click to toggle source
# File lib/dockly/deb.rb, line 46
def build
  create_package!
  upload_to_s3
end
build_path() click to toggle source
# File lib/dockly/deb.rb, line 64
def build_path
  ensure_present! :build_dir, :deb_build_dir
  File.join(build_dir, deb_build_dir, output_filename)
end
copy_from_s3(sha) click to toggle source
# File lib/dockly/deb.rb, line 51
def copy_from_s3(sha)
  ensure_present! :s3_bucket
  object = s3_object_name_for(sha)
  info "Copying s3://#{s3_bucket}/#{object} to s3://#{s3_bucket}/#{s3_object_name}"
  Dockly.s3.copy_object(
    copy_source: File.join(s3_bucket, object),
    bucket: s3_bucket,
    key: s3_object_name,
    acl: 'bucket-owner-full-control',
  )
  info "Successfully copied s3://#{s3_bucket}/#{object} to s3://#{s3_bucket}/#{s3_object_name}"
end
create_package!() click to toggle source
# File lib/dockly/deb.rb, line 30
def create_package!
  info "creating package"
  ensure_present! :build_dir, :deb_build_dir
  FileUtils.mkdir_p(File.join(build_dir, deb_build_dir))
  FileUtils.rm(build_path) if File.exist?(build_path)
  debug "exporting #{package_name} to #{build_path}"
  build_package
  if @deb_package
    @deb_package.output(build_path)
    info "exported #{package_name} to #{build_path}"
  end
ensure
  @dir_package.cleanup if @dir_package
  @deb_package.cleanup if @deb_package
end
exists?() click to toggle source
# File lib/dockly/deb.rb, line 69
def exists?
  debug "#{name}: checking for package: #{s3_url}"
  Dockly.s3.head_object(bucket: s3_bucket, key: s3_object_name)
  info "#{name}: found package: #{s3_url}"
  true
rescue
  info "#{name}: could not find package: #{s3_url}"
  false
end
file(source, destination) click to toggle source
# File lib/dockly/deb.rb, line 26
def file(source, destination)
  @files << { :source => source, :destination => destination }
end
output_filename() click to toggle source
# File lib/dockly/deb.rb, line 105
def output_filename
  "#{package_name}_#{version}.#{release}_#{arch}.deb"
end
s3_object_name() click to toggle source
# File lib/dockly/deb.rb, line 97
def s3_object_name
  s3_object_name_for(Dockly::Util::Git.sha)
end
s3_object_name_for(sha) click to toggle source
# File lib/dockly/deb.rb, line 101
def s3_object_name_for(sha)
  "#{package_name}/#{sha}/#{output_filename}"
end
s3_url() click to toggle source
# File lib/dockly/deb.rb, line 93
def s3_url
  "s3://#{s3_bucket}/#{s3_object_name}"
end
startup_script() click to toggle source
# File lib/dockly/deb.rb, line 109
def startup_script
  scripts = []
  bb = Dockly::BashBuilder.new
  scripts << bb.normalize_for_dockly
  scripts << bb.get_and_install_deb(s3_url, "/opt/dockly/#{File.basename(s3_url)}")

  scripts.join("\n")
end
upload_to_s3() click to toggle source
# File lib/dockly/deb.rb, line 79
def upload_to_s3
  return if s3_bucket.nil?
  raise "Package wasn't created!" unless File.exist?(build_path)
  info "uploading package to s3"
  File.open(build_path, 'rb') do |file|
    Dockly.s3.put_object(
      bucket: s3_bucket,
      key: s3_object_name,
      body: file,
      acl: 'bucket-owner-full-control',
    )
  end
end

Private Instance Methods

add_docker(package) click to toggle source
# File lib/dockly/deb.rb, line 199
def add_docker(package)
  return if docker.nil? || docker.s3_bucket
  info "adding docker image"
  docker.generate!

  return if get_registry

  package.attributes[:prefix] = docker.package_dir
  Dir.chdir(File.dirname(docker.tar_path)) do
    package.input(File.basename(docker.tar_path))
  end
  package.attributes[:prefix] = nil
end
add_docker_auth_config(package) click to toggle source
# File lib/dockly/deb.rb, line 182
def add_docker_auth_config(package)
  return if (registry = get_registry).nil? || !should_auth?(registry)
  info "adding docker config file"
  registry.generate_config_file!

  package.attributes[:prefix] = registry.auth_config_file || "~#{app_user}"
  Dir.chdir(File.dirname(registry.config_file)) do
    package.input(File.basename(registry.config_file))
  end
  package.attributes[:prefix] = nil
end
add_files(package) click to toggle source
# File lib/dockly/deb.rb, line 170
def add_files(package)
  return if files.empty?
  info "adding files to package"
  files.each do |file|
    package.attributes[:prefix] = file[:destination]
    Dir.chdir(File.dirname(file[:source])) do
      package.input(File.basename(file[:source]))
    end
    package.attributes[:prefix] = nil
  end
end
add_foreman(package) click to toggle source
# File lib/dockly/deb.rb, line 159
def add_foreman(package)
  return if (foreman || []).empty?
  foreman.each do |fore|
    info "adding foreman export '#{fore.name}'"
    fore.create!
    package.attributes[:prefix] = fore.init_dir
    Dir.chdir(fore.build_dir) { package.input('.') }
    package.attributes[:prefix] = nil
  end
end
add_startup_script(package, startup_script = "dockly-startup.sh") click to toggle source
# File lib/dockly/deb.rb, line 260
def add_startup_script(package, startup_script = "dockly-startup.sh")
  ensure_present! :build_dir
  startup_script_path = File.join(build_dir, startup_script)
  File.open(startup_script_path, 'w+') do |f|
    f.write(post_startup_script)
    f.chmod(0755)
  end
  package.attributes[:prefix] = "/opt/dockly"
  Dir.chdir(build_dir) do
    package.input(startup_script)
  end
  package.attributes[:prefix] = nil
end
build_package() click to toggle source
# File lib/dockly/deb.rb, line 119
def build_package
  ensure_present! :package_name, :version, :release, :arch

  info "building #{package_name}"
  @dir_package = FPM::Package::Dir.new
  add_foreman(@dir_package)
  add_files(@dir_package)
  add_docker_auth_config(@dir_package)
  add_docker(@dir_package)

  if package_startup_script.is_a?(String)
    raise ArgumentError,
          'package_startup_script filename must not be empty if specified' if package_startup_script.empty?
    add_startup_script(@dir_package, package_startup_script)
  elsif package_startup_script
    add_startup_script(@dir_package)
  end

  convert_package

  @deb_package.scripts[:before_install] = pre_install
  @deb_package.scripts[:after_install] = post_install
  @deb_package.scripts[:before_remove] = pre_uninstall
  @deb_package.scripts[:after_remove] = post_uninstall

  @deb_package.name = package_name
  @deb_package.version = version
  @deb_package.iteration = release
  @deb_package.architecture = arch
  @deb_package.vendor = vendor


  info "done building #{package_name}"
end
collect_non_registry_scripts(bb) click to toggle source
# File lib/dockly/deb.rb, line 239
def collect_non_registry_scripts(bb)
  scripts = []

  if docker.s3_bucket.nil?
    docker_output = File.join(docker.package_dir, docker.export_filename)
    if docker.tar_diff
      scripts << bb.file_diff_docker_import(docker.import, docker_output, docker.name, docker.tag)
    else
      scripts << bb.file_docker_import(docker_output, docker.name, docker.tag)
    end
  else
    if docker.tar_diff
      scripts << bb.s3_diff_docker_import(docker.import, docker.s3_url, docker.name, docker.tag)
    else
      scripts << bb.s3_docker_import(docker.s3_url, docker.name, docker.tag)
    end
  end

  scripts << bb.docker_tag_latest(docker.repo, docker.tag, docker.repo)
end
convert_package() click to toggle source
# File lib/dockly/deb.rb, line 154
def convert_package
  debug "converting to deb"
  @deb_package = @dir_package.convert(FPM::Package::Deb)
end
get_registry() click to toggle source
# File lib/dockly/deb.rb, line 213
def get_registry
  if docker && (registry = docker.registry)
    registry
  end
end
post_startup_script() click to toggle source
# File lib/dockly/deb.rb, line 219
def post_startup_script
  scripts = ["#!/bin/bash"]
  bb = Dockly::BashBuilder.new
  scripts << bb.normalize_for_dockly

  if docker
    if (registry = docker.registry)
      if registry.is_a?(Dockly::Docker::ECR)
        scripts << bb.auth_ecr(registry.server_address)
      end

      scripts << bb.registry_import(docker.repo, docker.tag)
      scripts << bb.docker_tag_latest(docker.repo, docker.tag, docker.name)
    else
      scripts += collect_non_registry_scripts(bb)
    end
  end
  scripts.join("\n")
end
should_auth?(registry) click to toggle source
# File lib/dockly/deb.rb, line 194
def should_auth?(registry)
  registry.is_a?(Dockly::Docker::Registry) &&
    registry.authentication_required?
end