Cruise Control.rb is moving to Lighthouse
April 23rd, 2008
So, following rSpec’s example, we’re moving from JIRA to Lighthouse. Check us out at http://cruisecontrolrb.lighthouseapp.com/
I have to say I wasn’t thrilled about Jira. It does everything, and it does it slowly, with a UI that is bloated at best. Lighthouse, on the other hand, keeps it REALLY simple. And does not a lot more than what we need. It also just opened itself up for OSS projects (which is cool).
How did we migrate all of our stories from JIRA to Lighthouse? I thought you’d never ask.
Lighthouse exposes a slick RESTful API for managing your data. I exported the JIRA issues into a csv file, wrote a short ruby script, waited about 5 minutes for it to run, and I was done.
Here’s the script:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
#!/usr/bin/env ruby require 'rubygems' require 'csv' JiraIssue = Struct.new(:issue_type, :key, :status, :assign_to, :summary, :description, :fix_version, :reporter, :priority, :original_estimate, :votes) def load_issues(csv_file) header = true issues = [] CSV.open(csv_file, 'r') do |row| if header header = false else issues << JiraIssue.new(*row) end end issues end issues = load_issues(File.dirname(__FILE__) + "/jiraissues.csv") # this code is just to examine what our JIRA data looks like def show(issues, field) puts "#{field} = #{issues.map{|i| i.send(field)}.uniq.inspect}" end show issues, :issue_type show issues, :status show issues, :assign_to show issues, :fix_version show issues, :reporter show issues, :priority show issues, :original_estimate show issues, :votes # these hashes translate between JIRA and Lighthouse states = { "Open" => 'open', "Resolved" => 'resolved', "Closed" => 'invalid' } users = { "Unassigned" => nil, "Alexey Verkhovsky" => 10545, "Rolf Russell" => 17992, "Jeremy Stell-Smith" => 10638, "Zhang Lin" => nil, "Jeff Xiong" => nil } milestones = { "1" => 9885, "1.1" => 9886, "1.2" => 9887, "1.3" => 9888, "1.4" => 9889, "\302\240 " => nil, } require File.dirname(__FILE__) + "/lib/lighthouse" include Lighthouse Lighthouse.account = "cruisecontrolrb" # enter your own user, password here... Lighthouse.authenticate "jeremystellsmith@gmail.com", "*******" issues.each do |i| # enter your own project id here... ticket = Ticket.new :project_id => 9150 ticket.title = i.summary ticket.body = i.description ticket.state = states[i.status.to_s.strip] ticket.assigned_user_id = users[i.assign_to.to_s.strip] ticket.milestone_id = milestones[i.fix_version] ticket.tags << i.issue_type << i.priority ticket.save end |
There was another step. I ran the first part of the script a couple times to tell me what the different issue_types, statuses, assigned users, fix versions, etc were that my JIRA data was using. I then found or created the appropriate data in Lighthouse and added some hashes to translate for me.
All in all, I’m pretty thrilled with how easy this was.

April 28th, 2008 at 06:12 PM Hey Jeremy, I appreciate your write-up. I managed to use this script with Unfuddle and after a little bit of time I got it to play great. Thanks!