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!


Now read this

The Power of Language

Every now and again, you learn something new that challenges your basic assumptions about the world. This happened to me the other day as I was reading Aatish Bhatia’s article on colors. What’s quite fascinating, is that the majority of... Continue →