Setting up CruiseControl.rb with/for Git Based Projects
[Updated to refer to official ThoughtWorks CC.rb Git repo.]
I have a new Rails project I'm working on and I use Git/GitHub for source control. It was time to setup continuous integration, and my usual weapon of choice for that is CruiseControl.rb. Here's what I did to get my project setup under CruiseControl.rb with Git, on an Ubuntu 7.10 machine...
Setup for accessing GitHub repo
All I needed to do here was generate an SSH key for my account on the host machine, and then add that key to the allowed keys for my GitHub account.
Prerequisites
- I setup a builder@mydomain.com email address which will get used by CruiseControl for sending build related emails/notifications.
- You'll need to determine a port you want CruiseControl to run on, and your strategy for accessing it. For example, I run mine on a port other than port 80, and other than the default 3333. I then proxy that via Nginx, and also use Nginx to password protect access to it (since this is not a public project, etc. This will affect the CC dashboard URL setting specified below. Some notes on this:
- I did my initial Nginx configuration using err's Nginx config generator. However, this makes a lot of path assumptions, and various other things, so you'll definitely want to go through the resulting file closely. I had a few sites on this server, so it was relatively useful to use this as a base starting point, and then just fix up paths to the access and error logs, and the PID file.
- Here's a quicky on how to add password protection to an Nginx server (and a specific location).
Install CruiseControl and Do Site Configuration
- Cloned the Git version of CruiseControl.rb in location I wanted it (you could also simply download it and expand the tarball):
git clone git://github.com/benburkert/cruisecontrolrb.git - The DEPENDENCIES file indicated I needed to have the grit and mime-types gems, so installed those.
- Where your projects get stored for CruiseControl.rb is now defined by the
CRUISE_DATA_ROOTenvironment variable, and if you don't set this, it defaults to$HOME/.cruise. I personally changed this to be/var/cruisecontrolrb. - Edit the
config/site_configuration.rb(probably need to rename the example version accordingly) to set site-wide settings, such as your email config and so on. - For email setup, I use Gmail for domains, so I have a block like this:
ActionMailer::Base.smtp_settings = { :address => "smtp.gmail.com", :port => 587, :domain => "mydomain.com", :authentication => :plain, :user_name => "builder@ mydomain.com", :password => "password"} - You'll want to specify the
Configuration.dashboard_urlsetting so URL's work properly. - There are a variety of other settings available in the file that you may want to tweak.
Add Project and Configure
- Did the usual usual
cruise addcommand to add my project, but with the Git variant:./cruise add MyProjectName --git-url git@github.com:mylogin/myproject.git(modify the Git project URL for your Git repo of course). Note that you can see all the options by doing a./cruise add - Create the test database for your project. The easiest way is just to go into
$CRUISE_DATA_ROOT/projects/MyProjectName/workand do arake db:create RAILS_ENV=test. Your first build will have already failed because this hasn't been made, this step hopefully fixes that. - If your log directory isn't in Git, you'll need to go mkdir it, so something like:
mkdir $CRUISE_DATA_ROOT/projects/MyProjectName/work/log.
Setup CruiseControl.rb Service/Daemon
- Copy the
cruisecontrolrbfile into/etc/init.d. - I set the port for CruiseControl.rb to run on in the above /etc/init.d/cruisecontrolrb daemon file, by adding "--port 1234" (for example) to the DAEMON_ARGS variable.
- Start the CruiseControl.rb daemon as appropriate for your system (e.g. "sudo /etc/init.d/cruisecontrolrb start").
$CRUISE_DATA_ROOT/projects/MyProjectName directory (or rather, the subdirectory in there for the particular build). And Enjoy!