Remote Shell Script Runner
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

Remote Run.

Our development team wanted a way to distribute our test suite to many machines to reduce the total run time. Remote Run is intended to be a simple way to run a list of shell scripts on a pool of hosts until all have completed.

When two Remote Runs are in progress, the runners will compete to lock machines until all tasks are complete.


    require 'rubygems'
    require 'remote_run'
    require 'benchmark'

    hosts = ["broadway", "wall"]
    setup = "source ~/.profile; rvm use ree; bundle install;"
    tasks = [
      "#{setup} bundle exec rspec spec/models",
      "#{setup} bundle exec rspec spec/controllers"

    # configure runner
    runner = do |config|
      config.hosts = hosts
      config.tasks = tasks
      config.before_task = lambda do |host, task, remote_runner|
        puts "#{host.hostname} is running '#{task.command}' "
      config.around_task = lambda do |&block|
        time = Benchmark.measure do

        puts time

    # kick off the run

Configuration Options:

    hosts - hostnames of remote machines.
    tasks - a string that is a shell script to be run on one of the hosts.

    local_path - the local path to be rsync'd  (default: working directory)
    temp_path - the location where the working directory is cached on the local machine when starting a run (default: /tmp/remote)
    remote_path - the location to rsync files to on the remote host.  (default: /tmp/remote/<local_hostname>)
    exclude - directories to exclude when rsyncing to remote host (default: [])
    login_as - the user used to log into ssh (default: current user)

    Callbacks (optional):
    before_run and after_run - the code to be executed before and after the run respectively, receives the remote_run instance as a paramater
    before_task and after_task - the code to be executed before and after each task respectively, receives host, task and the remote_run instance as paramaters
    around_run - the code to execute around the run, receives the block to call
    around_task - the code to execute around each task, receives the block to call

Accessible Attributes:

    local_hostname - your computer's hostname
    identifier - a unique identifier for your test run

What it Does:

  • checks that all hosts can be logged into via ssh
  • runs each task on a remote host in parallel
    • finds an unlocked remote host
    • locks a remote host (puts a file on the remote host)
    • finds a task to run
    • forks a separate process and gives it the selected task
      • rsyncs your current directory to the locked remote host
      • via ssh, runs a shell command of your choice on the locked remote host
      • unlocks the machine (removes the file from the remote host)
      • returns the status code of the shell script
    • finds the next machine to be locked
    • waits for all forks to return
    • displays success message if all status codes from the forks are zero (0)
    • displays failure message if any status codes from the forks are non-zero


  • HighLine