Crazy Ivan: the really simple continuous integration tool
JavaScript Ruby
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Crazy Ivan

Crazy Ivan (CI) is simplest possible continuous integration tool.


Create a directory where your projects will live
  $ mkdir /var/continuous-integration

Place some project(s) in that directory
  $ cd /var/continuous-integration
  $ git clone git://

Set up continuous integration for each project
  $ crazy_ivan setup  # creates example ci scripts in 
                      # each project (see How this works)

  $ crazy_ivan setup  # creates the ci directory, and
                      # creates a configuration file,
                      # sets a cron job to run crazy_ivan

Manually run it once to check everything is ok
  $ cd /var/continuous-integration
  $ crazy_ivan /var/www/ci       # the test reports path should be
                                 # accessible via your web server

  $ open /var/www/ci/index.html  # or check it through your browser

Set a cron job to run it every 15 minutes
  $ echo "0,15,30,45 * * * * cd /var/continuous-integration; crazy_ivan /var/www/ci" > ci.cron
  $ crontab ci.cron

Note that you don’t want this running too frequently; having overlapping 
runs is possible and would be bad.

(Functionality to have this run as a web-hook is planned.)

How this works

* crazy_ivan is executed periodically by cron
* crazy_ivan looks in directories one level deeper than where it’s been called

  => asked to run in /projects
      looks in each    /liquid
      of these dirs    /active_merchant
           ========>   /active_shipping

  => within each directory, it expects four executable scripts
     to execute at the /:


* crazy_ivan first executes `update` and captures the output:

    #!/usr/bin/env bash

    git pull  # Whatever your application
              # needs to do to update your
              # source from a repository

* crazy_ivan then exectutes `version` and captures the output:

    #!/usr/bin/env bash

    #!/usr/bin/env ruby -wKU             # Get a version hash/fingerprint/id
    puts `git show`[/^commit (.+)$/, 1]  # from your version control system
                                         # (Note that this will be truncated
                                         #  to fit within a filename length.)

* crazy_ivan then executes `test` and captures the output:

    #!/usr/bin/env bash

    rake db:migrate    # This task prepares the application
    rake test          # for running tests, then runs them

* At each of these three steps, the output is repackaged
  into a .json file to be consumed in the directory holding
  the static html.

* crazy_ivan then executes `conclusion`, passing it the same results packaged
  in the .json file used in the static html view.

Copyright and Credits

Copyright © 2009 Edward Ocampo-Gooding. See LICENSE for details.

Heavily inspired/first code sketch written by Tobi Lütke.