Skip to content

Instantly share code, notes, and snippets.

@special-k
Created April 19, 2013 14:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save special-k/5420893 to your computer and use it in GitHub Desktop.
Save special-k/5420893 to your computer and use it in GitHub Desktop.
require 'fileutils'
require 'openstack'
set :application, "projects_assets"
set :assets_root, '/path/to/project'
set :repository, "#{assets_root}/public/assets"
set :scm, :none # You can set :scm explicitly or Capistrano will make an intelligent guess based on known version control directory names
# Or: `accurev`, `bzr`, `cvs`, `darcs`, `git`, `mercurial`, `perforce`, `subversion` or `none`
set :deploy_via, :copy
set :copy_compression, :gzip
before 'deploy:update', 'deploy:assets_precompile', 'deploy:openstack'
after 'deploy:create_symlink', 'deploy:assets_clean'
#role :web, "your web-server here" # Your HTTP server, Apache/etc
role :app, "123.456.789.101" # This may be the same as your `Web` server
#role :db, "your primary db-server here", :primary => true # This is where Rails migrations will run
#role :db, "your slave db-server here"
set :deploy_to, "/path/to/#{application}"
set :use_sudo, false
default_run_options[:pty] = true
namespace :deploy do
task :assets_precompile do
system "cd #{ assets_root }&&rake assets:precompile"
end
task :assets_clean do
system "cd #{ assets_root }&&rake assets:clean"
end
task :openstack do
os = OpenStack::Connection.create username: 'username',
api_key: 'api_key',
:auth_url => 'https://auth_url/',
:service_type => 'object-store'
c = os.get_container( 'assets' )
local_files_list = Dir.entries( repository ).select{|file_name| file_name != '.' && file_name != '..' }
remote_files_list = c.objects
remote_files_detail = c.objects_detail
( remote_files_list - local_files_list ).each{|file_name|
c.delete_object file_name
remote_files_detail.delete file_name
}
local_files_list.each{|file_name|
full_file_name = "#{ repository }/#{ file_name }"
o = if remote_files_detail[file_name].nil?
c.create_object file_name
else
next if remote_files_detail[file_name][:hash] == `md5sum #{full_file_name}`.split(' ')[0]
c.get_object file_name
end
mime_type = if file_name =~ /\.css$/
'text/css; charset=utf-8'
elsif file_name =~ /\.js$/
'application/javascript; charset=utf-8'
else
`file --mime -b #{ full_file_name }`.strip
end
p [ o.write( File.new(full_file_name), 'content-type' => mime_type ), file_name ]
}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment