Continuous Integration for Ross Niemi ThoughtWorks, Inc.

Email: [email protected] : http://rossniemi.wordpress.com

March 12th, 2007 Agenda

• What is (CI)? • What CI tools are currently available for Ruby and Ruby on Rails (RoR)? • How do these tools compare?

• Demo • Questions Agile

• Agile Manifesto – Individuals and interactions over processes and tools – Working software over comprehensive documentation – Customer collaboration over contract negotiation – Responding to change over following a plan

• Continuous Integration helps us to deliver working software Continuous Integration

• “… is a software development practice where members of a team integrate their work frequently…”

• “Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible”

- Martin Fowler Before we continue…

• It is important to note that Continuous Integration: – IS NOT a tool or product – IT IS a practice or philosophy that a team has to buy into • Recall: Individuals and interactions over processes and tools

• Tools can be used to help automate Continuous Integration

“Continuous Integration is an Attitude, Not a Tool” - James Shore Early Days

• Check-in “token” – Developer wanting to check in code into the repository must acquire the “token” – Only one person can check in at a time – The same person would then check out the code on a different machine and run the build in a clean environment – If the build “breaks”, the offender fixes it on their machine and tries the verification step again – Once the build passes, the “token” is returned so someone else could perform a check in – Very serial process, time consuming Early Days

• Cron / Scheduler Jobs – An attempt to automate the verification build – Schedule builds to happen during set times • Nightly or Daily Builds (quiet times) • Depending on the length of the build, you typically would want to increase the build frequency – The greater the time between scheduled builds • The less useful the feedback from the build would be • The more difficult debugging a broken build would be Present Day

• CI Tools are responsible for orchestrating the verification build – Detects a change in the code repository – Update its working copy – Runs the build and executes tests – Notifies interested parties of success or failure

• The repetition of these steps is known as a build cycle or build loop

• Typically implemented as a server / daemon CI Tool Realizations

• By automating the verification build: – The verification step is done for the committer automatically – Verification builds can be done more often • For example, after every checkin – The tool can notify the developer(s) of a broken or successful build as soon as the verification build finishes – Shorter verification build cycles means: • The developer can check in code more often (XP) • Faster feedback will lead to greater productive Typical Architecture CI for Ruby On Rails

• Jay Field!s Poor Man!s CI • Continuous Builder • Cerberus • CruiseControl with CI_Reporter • CruiseControl.rb Jay Field!s Poor Man!s CI

• If using Subversion, use a post-commit hook to fire off a build • Pass a revision number as an argument – Use number to create output directories for running build • If on a Mac, use Growl to send a status message to developer workstation

• http://jayfields.blogspot.com/2006/07/ruby- continuous-integration. Continuous Builder

• Simple Rails plugin written by DHH • Add a Subversion post-commit hook to build the latest revision and notify the developer on success / failure by: – Email – Campfire

• http://dev.rubyonrails.org/browser/plugins/con tinuous_builder Cerberus

• Designed to be a light-weight CI solution with a small memory footprint – Loaded into memory and executed only when needed • Similar to previous approaches, but offers support for managing multiple projects – Command line – YML

• http://cerberus.rubyforge.org/ Commands

# Add application directory to monitor cerberus add directory APPLICATION_NAME=application RECIPIENTS=email address, …

# Add application SVN repository to monitor cerberus add subversion_url APPLICATION_NAME=application RECIPIENTS=email address, …

# List of active projects cerberus list

# Build a single or all applications cerberus build application cerberus buildall

# Command line help cerberus --help Files and Directories

# Default home $CERBERUS_HOME=~/.cerberus

# Server artifacts ~/.cerberus/config.yml ~/.cerberus/error.log

# Project artifacts ~/.cerberus/config/application.yml ~/.cerberus/work/application /logs - timestamped build logs /Status.log - status of last build Build Loop

• Cerberus will check if there were any changes to application directory or Subversion repository – Build only if there were

• Since build and buildall are one time shots, you will either need to setup Cerberus with: – Cron (polling) – Subversion post-commit hook (trigger) CruiseControl

• The defacto standard for Continuous Integration in the world • CruiseControl 2.6 has direct support for Rake – Leverage existing plugins • Source Code Management (SCM) systems • Publishers / Notifiers • Using CI Reporter with CruiseControl will allow for reporting on test failure

• http://cruisecontrol.sourceforge.net Commands cruise_dir/cruisecontrol.sh cruise_dir/cruisecontrol.bat

• Windows service now available Files and Directories

# Server / Project configuration cruise_dir/config.xml

# Project artifacts - can override locations cruise_dir/project.ser cruise_dir/projects/project cruise_dir/logs/project cruise_dir/artifacts/project Configuration

• CruiseControl build projects are defined in cruise_dir/config.xml

• Each build project has the following sections: – Bootstrappers are operations done before the build takes place, regardless if a build is necessary or not – ModificationSet is scheduled to poll to see if change in the code repository occurred – Schedule is a reoccurring event used to perform a build provided that there are modifications – Publishers distribute the results of a build – Log is used to report on the build execution CI Reporter • Can use with existing CI solutions that understand JUnit XML – CruiseControl, Bamboo, etc. • Support for Test::Unit or RSpec

• http://svn.caldersphere.net/svn/main/ci_ reporter/ Files and Directories

• Modify Rakefile require 'rubygems' gem 'ci_reporter’ # use the following if using RSpec require 'ci/reporter/rake/rspec’ # use the following if using Test::Unit require 'ci/reporter/rake/test_unit’

• Make ci:setup: a dependency of your test tasks CruiseControl.rb

• CruiseControl for Ruby and RoR • Written from the ground up on Rails

• http://cruisecontrolrb.rubyforge.org/ Commands

# Start the ./cruise start [options ] --port=port --binding=ip --daemon --environment=test|development|production

# Add application SVN repository to monitor ./cruise add your_project --url subversion-url [--username username --password password]

# Build your_project ./cruise build your_project [--trace ]

# Command line help ./cruise help [command ] Files and Directories

# Server artifacts cruise_dir/config/site_config.rb

# Project artifacts cruise_dir/projects/your_project /work /build-rev /build.log /build_status.status /changeset.log /cruise_config.rb Build Loop

• Assumption: – Rails application built by Rake

• Alternatively: – Use Rake to build other applications • Ruby, Java – Could call a shell script Rake Execution • Loads all Rake files from cruise_dir/tasks and then the Rakefile of your_project

• The cc:build task is invoked and looks for all other Rake tasks defined in your_project – cruise_dir/tasks/cc_build.rake Rake Execution

Note: project.rake_task and project.build_command both cannot be set Build Scheduling

• Specify a polling interval in the cruise_config.rb – project.scheduler.polling_interval = 5.minutes

• Provide your own custom scheduler – project.scheduler = MyCustomScheduler.new(project) Build Artifacts

• Artifacts are visible via dashboard

• CC_BUILD_ARTIFACTS environment variable is set by CruiseControl.rb – Make sure your Rakefile task writes to this directory or in a subdirectory • Coverage reports, build products, etc. Comparison Matrix

• Just the facts, please – http://rossniemi.wordpress.com/docs Slides make me sleepy…

• Where is my Demo! Questions?