Speed up Heroku deploys
1 min read

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!

Enjoying these posts? Subscribe for more