16 Jul 2011

Smoothing Rails development in Bash

This post covers a few ways that I've automated the repetitive tasks that are required while building and deploying Rails apps.

Rails console

In Rails 2 apps, you get a console by running ./script/console, but in Rails 3, you get a console by running ./script/rails console. Because I want to open a console without having to remember which version of Rails I'm using, I wrote an alias to figure it out and do the right thing for me.

# Rails 2 and Rails 3 console
# usage: rc [ENVIRONMENT]
function rc {
  if [ -e "./script/console" ]; then
    ./script/console $@
  else
    rails console $@
  fi
}

SSH Host Keys

Deploying apps to EC2 or something similar means that you will inevitably run into SSH telling you that the host key has changed and you could be experiencing a man-in-the-middle attack. Making the error go away requires opening your known_hosts file, finding the right line, deleting it, saving the file, and then trying again. It's a giant pain in the ass.

The most common "fix" that I have seen is to disable host key checking entirely, but that removes the security provided by host keys. My fix is to be able to remove stale host keys quickly and then get back to what I was doing.

# Remove known host entries
# usage: ssh-rm-host -n LINENUM
#        ssh-rm-host HOSTNAME
function ssh-rm-host () {
  if [ "$1" == "-n" ]; then
    sed -i old $2d ~/.ssh/known_hosts
  else
    ssh-keygen -R $1
  fi
}

Running specs

Similar to the console, running specs in Rails 3 apps requires RSpec 2 and the rspec binary. Specs in Rails 2 require RSpec 1 and the spec binary. Fortunately, the spec_helper.rb helps us distinguish between versions of RSpec, so we can just run the tests without stressing about versions.

# easy spec running
# usage: s [RSPEC_OPTS]
function s {
  if grep -q -i "RSpec.configure do" spec/spec_helper.rb; then
    # echo "rspec2!"
    if [ -z "$*" ]; then
      rspec -fs -c spec
    else
      rspec -fs -c $*
    fi
  else
    # echo "rspec1!"
    if [ -z "$*" ]; then
      spec _1.3.2_ -fs -c spec
    else
      spec _1.3.2_ -fs -c $*
    fi
  fi
}

Rails logs

Tailing logs isn't actually that hard, but I type it so frequently that I got tired of doing it. While I'm at it, I'll throw in my less-related configuration that comes in handy.

export PAGER='less' # less is more (than more)
export LESSEDIT='mate -l %lm %f' # open in textmate from less
export LESS='-XFRf' # don't clear screen on exit, show colors
alias rl='less log/development.log'

Other handy stuff

It's not directly related to Rails development, but I highly endorse autojump for getting around quickly and my tm tool for opening TextMate projects from the command line.

That's all I've got at the moment, but if you have any suggestions or additions I'd be interested to hear about them.