class Revup::DeployTask

Constants

DEFAULT_TO_CLASS_ATTRS

Attributes

app_dir[RW]
files[RW]
files_root[RW]
host[RW]
local_tmp_dir[RW]
logger[RW]
remote_setup[RW]
remote_tmp_dir[RW]
revision[RW]
task_name_and_prerequisites[RW]
user[RW]
versioned_asset_name[RW]

Public Class Methods

new(task_name_and_prerequisites) { |self| ... } click to toggle source
# File lib/revup/deploy_task.rb, line 41
def initialize(task_name_and_prerequisites)
  DEFAULT_TO_CLASS_ATTRS.each do |attr|
    send("#{attr}=", self.class.send(attr))
  end

  @task_name_and_prerequisites = task_name_and_prerequisites
  @versioned_asset_name = task_name

  @revision ||= begin
    result = sh("git rev-parse --short HEAD 2>&1")
    result unless result.empty?
  end

  yield self if block_given?
  define
end

Public Instance Methods

archive_basename() click to toggle source
# File lib/revup/deploy_task.rb, line 58
def archive_basename
  "#{versioned_asset_name}-#{revision}"
end
cleanup!() click to toggle source
# File lib/revup/deploy_task.rb, line 122
def cleanup!
  sh  "rm -f '#{local_archive_path}'"
  ssh "rm -f '#{remote_archive_path}'"
  ssh "rm -rf '#{remote_archive_dir}'"
end
create_archive() click to toggle source
# File lib/revup/deploy_task.rb, line 99
def create_archive
  sh "mkdir -p '#{local_tmp_dir}'"
  sh "tar -C '#{files_root}' -zcf '#{local_archive_path}' '#{files.sort.join("' '")}'"
end
define() click to toggle source

Actual task definition

# File lib/revup/deploy_task.rb, line 76
def define
  task(task_name_and_prerequisites) do
    deploy
  end
  Rake::Task[task_name].add_description("Deploy build of the `#{versioned_asset_name}' versioned_asset")
end
deploy() click to toggle source
# File lib/revup/deploy_task.rb, line 83
def deploy
  validate files_root, "Please specify the location of the root of the files that should be deployed."
  validate files,      "Please specify a list of files that should be deployed."
  validate host,       "Please specify the host of the machine to deploy to."
  validate user,       "Please specify the user of the machine to deploy to."
  validate app_dir,    "Please specify the path to the application."
  validate revision,   "Please specify the Git revision hash."

  create_archive
  upload_and_register

rescue Object => e
  logger.error("#{e.message}\n\t#{e.backtrace.join("\n\t")}")
  raise e
end
local_archive_path() click to toggle source
# File lib/revup/deploy_task.rb, line 62
def local_archive_path
  File.join(local_tmp_dir, "#{archive_basename}.tgz")
end
remote_archive_dir() click to toggle source
# File lib/revup/deploy_task.rb, line 70
def remote_archive_dir
  File.join(remote_tmp_dir, archive_basename)
end
remote_archive_path() click to toggle source
# File lib/revup/deploy_task.rb, line 66
def remote_archive_path
  File.join(remote_tmp_dir, "#{archive_basename}.tgz")
end
upload_and_register() click to toggle source
# File lib/revup/deploy_task.rb, line 104
def upload_and_register
  Net::SSH.start(host, user) do |connection|
    @ssh = connection

    ssh "mkdir -p '#{remote_archive_dir}'"
    # Upload archive
    logger.info("Transferring `#{local_archive_path}' to `#{host}:#{remote_archive_path}'")
    @ssh.scp.upload!(local_archive_path, remote_archive_path)
    # Unpack archive
    ssh "tar -C '#{remote_archive_dir}' -zxf '#{remote_archive_path}'"
    # Register revision
    ssh "cd '#{app_dir}' && /usr/local/rbenv/shims/bundle exec ./script/register_versioned_asset_revision '#{remote_archive_dir}' '#{versioned_asset_name}' '#{revision}'"

    cleanup!
  end
  @ssh = nil
end

Private Instance Methods

sh(cmd) click to toggle source
# File lib/revup/deploy_task.rb, line 139
def sh(cmd)
  logger.info("[local] executing: #{cmd}")
  result = `#{cmd} 2>&1`.strip
  raise "Failed to execute: #{result}" unless $?.success?
  logger.info("[local] output: #{result}") unless result.empty?
  result
end
ssh(cmd) click to toggle source
# File lib/revup/deploy_task.rb, line 147
def ssh(cmd)
  cmd = "#{remote_setup}; #{cmd}" if remote_setup
  logger.info("[remote] executing: #{cmd}")
  if result = @ssh.exec!(cmd)
    logger.info("[remote] output: #{result}")
  end
end
task_name() click to toggle source
# File lib/revup/deploy_task.rb, line 130
def task_name
  task_name_and_prerequisites.is_a?(Hash) ?
    task_name_and_prerequisites.keys.first : task_name_and_prerequisites
end
validate(value, message) click to toggle source
# File lib/revup/deploy_task.rb, line 135
def validate(value, message)
  raise message if value.nil? || value.empty?
end