Speed up Heroku deploys

While building Monocle, I noticed that deploys to Heroku were taking absolutely ages; specifically the asset pre-compilation stage. I tried a variety of things, including removing a bunch of CoffeeScript files, but deploys were still taking in the order of several minutes.

After talking to Josh, it seems the solution is a simple one. Simply enable Memcache caching for sprockets during the pre-compilation stage. By doing this, I’ve reduced asset compilation from 100 seconds to between 4-9 seconds.

By default, each Heroku deploy is in a isolated environment. This means that Sprockets can’t take advantage of previous asset compilations, and has to compile everything from scratch. The solution is to have a shared cache between deploys.

If you’re using Heroku, the first step is enabling a Memcache addon. I’ve gone with the memcachier service, as they’ve got a generous free plan (which is all we need at this stage).

heroku addons:add memcachier:dev

Then we need to make sure the environmental variables are available to your app during the pre-compilation stage. Usually this isn’t the case on Heroku, but they’ve got a new labs feature called user-env-compile which will do the trick.

heroku labs:enable user-env-compile

Next you’ll need to add the dalli and memcachier gems to your Gemfile. Finally, the last step is to configure Sprockets.

 With Sinatra

I’m using Sinatra, so I’m configuring Sprockets manually. I’ve written a wrapper around the Memcache gem Dalli to ensure it exposes the sort of interface Sprockets expects.

assets       = Sprockets::Environment.new
assets.cache = Sprockets::Cache::MemcacheStore.new

 With Rails

With Rails, just configure the assets cache store in config/environments/production.rb.

config.assets.cache_store = :dalli_store

Welcome to faster deploys!

 
1,275
Kudos
 
1,275
Kudos

Now read this

How to travel around the world for a year

While my last post covered my previous year traveling, writing and programming, this article will go into the specifics of planning your own round the world trip, including flights, costs, activities and accommodation. I’ll show you how... Continue →