Continuous Integration for Ruby on Rails Ross Niemi ThoughtWorks, Inc. Email: rniemi@thoughtworks.com Blog: http://rossniemi.wordpress.com March 12th, 2007
Agenda • What is Continuous Integration (CI)? • What CI tools are currently available for Ruby and Ruby on Rails (RoR)? • How do these tools compare? • Demo • Questions
Agile Software Development • 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.html
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 Java 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:<rspec|testunit> 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 web server ./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?
Recommend
More recommend