Skip to content


Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

warp: distributed workflow management

warp distributes scenarios across any number of machines.

hubot: deploy to production, engage!

build status

The story

Your applications span a large group of hosts and deployment involves several separate steps.

Let's say that you have a web application deployment process that involves:

  • Updating a git repository
  • Restarting a service

This process is likely the same for several profiles such as test, staging and production.

warp scenarios

Warp provides a DSL for writing scenarios and schedules executions over a pub-sub system, streaming the results to the controller which makes results available through an API and web view

Command executions can be scheduled through the following means:

  • The web interface exposed by the controller
  • API queries to the controller
  • IRC/Campfire/Hipchat through a hubot script

A sample scenario

{:timeout 2
 :name    "ping"
 :matcher {:type :none}
 :profiles {:everyone {:type :all}
            :platform {:type :and :clauses [{:type :fact :fact "facter.sp_environment" :value "{{0}}"}
                                            {:type :fact :fact "facter.platform" :value "{{1}}"}]}
            :prod     {:type :fact :fact "facter.sp_environment" :value "prod"}
            :preprod  {:type :fact :fact "facter.sp_environment" :value "preprod"}
            :host     {:type :host :host "{{0}}"}}
 :commands [{:type :ping}]}

More screenshots

warp index warp output

Pub-Sub support

Scenario execution happens through an HTTP api.

Warp and warp-agent borrow from mcollective and my first implementation within amiral

Warp aims to improve on amiral in the following ways:

  • Bundle matchers, timeouts and a list of commands (a script) options in named "scenarios"
  • Extract out of the IRC bot framework and display extended execution results in a web view
  • Deprecate signing requests with ssh-keys and move to SSL
  • Provide a lighter-weight agent
  • Support arguments


To build and run the controller:

lein cljsbuild
lein run -- -f doc/controller.clj

When working on the ClojureScript part, you can automatically rebuild it when a change happens:

lein cljsbuild auto

You can run the agent with:

./agent/warp-agent doc/warp-agent.json