Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
Exports Github issues to CSV (API v3)
require 'octokit'
require 'csv'
require 'date'
# Github credentials to access your private project
# Project you want to export issues from
# Your local timezone offset to convert times
client = => USERNAME, :password => PASSWORD)
csv = + "/issues3.csv", 'w'))
puts "Initialising CSV file..."
#CSV Headers
header = [
"Date created",
"Date modified",
"Issue type",
# We need to add a column for each comment, so this dictates how many comments for each issue you want to support
#20.times { header << "Comments" }
csv << header
puts "Getting issues from Github..."
temp_issues = []
issues = []
page = 0
page = page +1
temp_issues = client.list_issues("#{USER}/#{PROJECT}", :state => "closed", :page => page)
issues = issues + temp_issues;
end while not temp_issues.empty?
temp_issues = []
page = 0
page = page +1
temp_issues = client.list_issues("#{USER}/#{PROJECT}", :state => "open", :page => page)
issues = issues + temp_issues;
end while not temp_issues.empty?
puts "Processing #{issues.size} issues..."
issues.each do |issue|
puts "Processing issue #{issue['number']}..."
# Work out the type based on our existing labels
when issue['labels'].to_s =~ /Bug/i
type = "Bug"
when issue['labels'].to_s =~ /Feature/i
type = "New feature"
when issue['labels'].to_s =~ /Task/i
type = "Task"
# Work out the priority based on our existing labels
when issue['labels'].to_s =~ /HIGH/i
priority = "Critical"
when issue['labels'].to_s =~ /MEDIUM/i
priority = "Major"
when issue['labels'].to_s =~ /LOW/i
priority = "Minor"
milestone = issue['milestone'] || "None"
if (milestone != "None")
milestone = milestone['title']
# Needs to match the header order above, date format are based on Jira default
row = [
DateTime.parse(issue['created_at']).new_offset(TIMEZONE_OFFSET).strftime("%d/%b/%y %l:%M %p"),
DateTime.parse(issue['updated_at']).new_offset(TIMEZONE_OFFSET).strftime("%d/%b/%y %l:%M %p"),
csv << row
Copy link

tkarpinski commented Apr 12, 2012

this does not reimplement comments from the original gist. that wouldn't be too hard using the gem.

Copy link

tkarpinski commented Apr 12, 2012

its also worth noting that this works on both windows and *nix with Ruby 1.9.3

Copy link

mikermcneil commented May 17, 2012

If you're a complete ruby n00b like me, maybe this'll save you some time.

On a clean Mac with an old version of ruby (1.8.x or something), here's what I did:

# First download the script and save it to: ~/Desktop/github_issues_to_csv.rb
# Then customize it with your credentials and the target repo

# then update ruby
curl -L | bash -s stable
source ~/.rvm/scripts/rvm
rvm requirements
rvm install 1.9.3

# install the octokit gem (package containing the github sdk for ruby)
sudo gem install octokit
ruby ~/Desktop/github_issues_to_csv.rb &

# There you have it:
tail -f ~/Desktop/issues3.csv

Copy link

jkmaxwell commented May 22, 2012

don't sudo gem install!

Copy link

kevinpschaaf commented Jun 20, 2012

I updated this to support comment import in my fork here:

Saved a lot of time. Thanks, tkarpinski (and henare).

Copy link

mikermcneil commented Jun 21, 2012

Copy link

laurencesmithever commented Jan 23, 2013


Having a little problem. When I run github_issues_to_csv.rb I get the following:

C:\Ruby193>ruby github_issues_to_csv.rb
Initialising CSV file...
Getting issues from Github...
C:/Ruby193/lib/ruby/1.9.1/net/http.rb:799:in connect': SSL_connect returned=1 e rrno=0 state=SSLv3 read server certificate B: certificate verify failed (Faraday ::Error::ConnectionFailed) from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:799:inblock in connect'
from C:/Ruby193/lib/ruby/1.9.1/timeout.rb:54:in timeout' from C:/Ruby193/lib/ruby/1.9.1/timeout.rb:99:intimeout'
from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:799:in connect' from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:755:indo_start'
from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:744:in start' from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1284:inrequest'
from C:/Ruby193/lib/ruby/1.9.1/net/http.rb:1026:in get' from C:/Ruby193/lib/ruby/gems/1.9.1/gems/faraday-0.8.4/lib/faraday/adapt er/net_http.rb:72:inperform_request'
from C:/Ruby193/lib/ruby/gems/1.9.1/gems/faraday-0.8.4/lib/faraday/adapt
er/net_http.rb:37:in call' from C:/Ruby193/lib/ruby/gems/1.9.1/gems/faraday_middleware-0.9.0/lib/fa raday_middleware/response_middleware.rb:30:incall'
from C:/Ruby193/lib/ruby/gems/1.9.1/gems/faraday-0.8.4/lib/faraday/respo
nse.rb:8:in call' from C:/Ruby193/lib/ruby/gems/1.9.1/gems/faraday_middleware-0.9.0/lib/fa raday_middleware/response/follow_redirects.rb:79:inperform_with_redirection'
from C:/Ruby193/lib/ruby/gems/1.9.1/gems/faraday_middleware-0.9.0/lib/fa
raday_middleware/response/follow_redirects.rb:65:in call' from C:/Ruby193/lib/ruby/gems/1.9.1/gems/faraday-0.8.4/lib/faraday/respo nse.rb:8:incall'
from C:/Ruby193/lib/ruby/gems/1.9.1/gems/faraday_middleware-0.9.0/lib/fa
raday_middleware/request/encode_json.rb:23:in call' from C:/Ruby193/lib/ruby/gems/1.9.1/gems/faraday-0.8.4/lib/faraday/conne ction.rb:226:inrun_request'
from C:/Ruby193/lib/ruby/gems/1.9.1/gems/faraday-0.8.4/lib/faraday/conne
ction.rb:87:in get' from C:/Ruby193/lib/ruby/gems/1.9.1/gems/octokit-1.22.0/lib/octokit/requ est.rb:61:inrequest'
from C:/Ruby193/lib/ruby/gems/1.9.1/gems/octokit-1.22.0/lib/octokit/requ
est.rb:11:in get' from C:/Ruby193/lib/ruby/gems/1.9.1/gems/octokit-1.22.0/lib/octokit/clie nt/issues.rb:42:inlist_issues'
from github_issues_to_csv.rb:42:in `


Can you help?


Copy link

okolehao commented Feb 9, 2014

@laurencesmithever probably too late, but you add this line: (note that introduces a security problem)

Octokit.configure do |c|
c.connection_options = { ssl: { verify: false } }

Copy link

dylanjw commented Aug 18, 2015

I get this error:

Initialising CSV file...
Getting issues from Github...
Processing 570 issues...
Processing issue 564...
./github_issues_to_csv.rb:85:in `parse': no implicit conversion of Time into String (TypeError)
    from ./github_issues_to_csv.rb:85:in `block in <main>'
    from ./github_issues_to_csv.rb:55:in `each'
    from ./github_issues_to_csv.rb:55:in `<main>'

Copy link

spyhunter99 commented Apr 6, 2017

i get the same as @dylanjw

Copy link

spyhunter99 commented Apr 6, 2017

It can be fixed by updating the two lines that parse the date time to this


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment