Get Workflow Data From CircleCI

I needed to analyze some data about the costs of my client’s current CI system, and CircleCI’s insights dashboard—while impressive—isn’t quite up to the task.

Sometimes you just need the plain old “spreadsheet analysis technique” to make progress.

Here’s a quick Ruby script I wrote to get data from all the workflows for a particular project and write it to a CSV file for easy import into a spreadsheet program.

#!/usr/bin/env ruby

require 'uri'
require 'net/http'
require 'openssl'
require 'json'
require 'csv'

def get_data(next_page_token)
  project_slug="gh/org/repo"
  all_branches=true
  start_date="2022-08-15T00:00:00Z"
  end_date="2022-09-15T00:00:00Z"
  workflow="build-workflow"

  url = URI("https://circleci.com/api/v2/insights/#{project_slug}/workflows/#{workflow}?all-branches=#{all_branches}&start-date=#{start_date}&end-date=#{end_date}#{next_page_token && '&page-token=' + next_page_token}")
  http = Net::HTTP.new(url.host, url.port)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE

  request = Net::HTTP::Get.new(url)
  request["Circle-Token"] = ENV["CIRCLE_TOKEN"]

  response = http.request(request)
  JSON.parse(response.read_body)
end

next_page_token=nil
items = []

loop do
  payload = get_data(next_page_token)
  items = items + payload["items"]
  next_page_token = payload["next_page_token"]
  break if next_page_token.nil?
end

puts items.count

# id, duration, status, created_at, stopped_at, credits_used, branch, is_approval
File.write("out.csv", items.first.keys.to_csv)
File.write("out.csv", items.map { |item| item.values.to_csv }.join, mode: 'a')

Comments

comments powered by Disqus