Parity

Shell commands for development, staging, and production parity for Heroku apps.

Prerequisites

Your development machine will need these command-line programs:

curl
heroku
pg_restore

On a Mac, curl is installed by default and the other programs can be installed with Homebrew:

brew install heroku-toolbelt
brew install postgres

Install

gem install parity

This installs three shell commands:

development
staging
production

Usage

Backup a database:

production backup
staging backup

Restore a production or staging database backup into development:

development restore production
development restore staging

Restore a production database backup into staging:

staging restore production

Open a console:

production console
staging console

Open log2viz:

production log2viz
staging log2viz

Migrate a database and restart the dynos:

production migrate
staging migrate

Tail a log:

production tail
staging tail

Use redis-cli with your REDIS_URL add-on:

production redis-cli
staging redis-cli

The scripts also pass through, so you can do anything with them that you can do with heroku ______ --remote staging or heroku ______ --remote production:

watch production ps
staging open

Convention

Parity expects:

  • A staging remote pointing to the staging Heroku app.
  • A production remote pointing to the production Heroku app.
  • There is a config/database.yml file that can be parsed as Yaml for ['development']['database'].
  • The Heroku apps are named like app-staging and app-production where app is equal to basename $PWD.

Customization

Override some of the conventions:

Parity.configure do |config|
  config.database_config_path = "different/path.yml"
  config.heroku_app_basename = "different-base-name"
  config.redis_url_env_variable = "DIFFERENT_REDIS_URL"
end

If you have Heroku environments beyond staging and production (such as a feature environment for each developer), you can add a binstub to the bin folder of your application. Custom environments share behavior with staging: they can be backed up and can restore from production.

Here's an example binstub for a 'feature-geoff' environment, hosted at myapp-feature-geoff.herokuapp.com.

#!/usr/bin/env ruby

require 'parity'

if ARGV.empty?
  puts Parity::Usage.new
else
  Parity::Environment.new('feature-geoff', ARGV).run
end

Contributing

Please see CONTRIBUTING.md for details.

Credits

Parity is maintained by Dan Croak. It is free software and may be redistributed under the terms specified in the LICENSE file.