Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save micahbrich/236059 to your computer and use it in GitHub Desktop.
Save micahbrich/236059 to your computer and use it in GitHub Desktop.
capistrano recipe for moving public files to s3
desc "Generate and deploy assets"
task :deploy_assets, :roles => :app do
# get the previous timestamp
old_timestamp = File.read("config/deploy_timestamp").to_i rescue 0
# generate timestamp into config/deploy_timestamp
timestamp = Time.now.to_i
File.open("config/deploy_timestamp", 'w') do |f|
f.write(timestamp)
end
# generate minified JS and CSS
system('rake asset:packager:build_all')
# sync local public/ directory to S3 bucket
# the S3 bucket directory should be the timestamp generated above
require 'right_aws'
s3 = RightAws::S3.new(access_key_id, secret_access_key)
bucket = s3.bucket('a-bucket')
put_count = 0
copy_count = 0
Dir.glob('public/**/*').each do |f|
next if File.directory?(f)
key = "#{timestamp}/#{f.gsub(/public\//, '')}"
if File.new(f).mtime.to_i > old_timestamp
puts "putting #{f} into S3 as #{key}"
bucket.put(key, File.read(f), {}, 'public-read')
put_count += 1
else
old_key = bucket.key("#{old_timestamp}/#{f.gsub(/public\//, '')}")
# comment this out until I can replace RightAWS::S3 with something that supports
# S3 ACL URI groups.
#if old_key.exists?
# puts "copying #{old_key} to #{key}"
# old_key.copy(key)
# copy_count += 1
#else
puts "putting #{f} into S3 as #{key}"
bucket.put(key, File.read(f), {}, 'public-read')
put_count += 1
#end
end
end
puts "done. #{put_count} files uploaded, #{copy_count} keys copied"
# add and commit the config/deploy_timestamp file
system('git add config/deploy_timestamp')
system('git commit -m "deploy_assets complete, updating timestamp"')
system('git push')
end
@atomical
Copy link

Does this delete old files off S3 or just sync the files in the public folder?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment