Oct 24 2010

Package Assets For Rails 3 and Upload to Amazon s3

Rails3 Ruby Amazon s3 | comments

I like to share this quickly for those who are concerned about application performance. Rails has always provided a way to cache assets. It's been very simple but when we think about the "cloud" and scaling, we realized it's a pain to actually make it all work with amazon s3.

We need a command line solution or some rake tasks and asset packager plugin provides these for us.

I've updated the plugin, asset_packager for Rails 3.0.1. Click here to check it out (git).

How to install

              
              rails plugin install git://github.com/bridgeutopia/asset_packager.git
              
              

One rake task to cache and upload assets

              namespace :cache do
                BUCKET = 'bucketname'
                
                desc "start aws"
                task :aws do
                  require 'aws/s3'
              
                  AWS::S3::Base.establish_connection!(
                    access_key_id: 'key',
                    secret_access_key: 'secret'
                  )
                end
                
                
                desc "update s3"
                task :s3=> :aws do
                  prefix = ''
              
                  files = Dir[
                    "./public/stylesheets/admin_all_packaged.css",
                    "./public/stylesheets/splash_all_packaged.css",
                    "./public/stylesheets/all_packaged.css",
                    "./public/javascripts/admin_all_packaged.js",
                    "./public/javascripts/splash_all_packaged.js",
                    "./public/javascripts/all_packaged.js"
                  ]
              
                  files.each do |f|
                    next if File.directory?(f)
                    puts f
              
                    key = f.gsub(/\.\/public/, prefix)
                    puts " -> %s" % key
              
                    AWS::S3::S3Object.store(
                      key, File.open(f), BUCKET,
                      :access => :public_read, 'Cache-Control' => 'max-age=315360000'
                    )
                  end
                end  
                
                
                desc "cache assets and update s3 for production"
                task :production do
                  Rake::Task['asset:packager:delete_all'].invoke
                  Rake::Task['asset:packager:build_all'].invoke
                  Rake::Task['cache:s3'].invoke
              
                end
                
                
                
              end
              

How to use

              rake cache:production 
              

It's sort of saying cache all assets for production.

Thanks to Marco Palinar and Cyril David of Sinefunc for sharing a similar gist on how to upload assets to Amazon s3 through a very simple rake task.