Crazy Ivan

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

Usage

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://github.com/edward/active_merchant.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
                       /shopify
      looks in each    /liquid
      of these dirs    /active_merchant
           ========>   /active_shipping

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

        /shopify
          /.ci/update
               version
               test
               conclusion

* 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.