Skip to content

Commit

Permalink
Add a very basic github action rspec extractor
Browse files Browse the repository at this point in the history
  • Loading branch information
oliverguenther committed Feb 19, 2021
1 parent 204cfe7 commit 6b94334
Showing 1 changed file with 80 additions and 0 deletions.
80 changes: 80 additions & 0 deletions script/github_pr_errors
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#!/usr/bin/env ruby

require 'pathname'
require 'json'
require 'rest-client'
require 'pry'
require 'zip'
require 'tempfile'

# current branch
branch_name = `git rev-parse --abbrev-ref HEAD`.strip

raise "Missing GITHUB_USERNAME env" unless ENV['GITHUB_USERNAME']
raise "Missing GITHUB_TOKEN env" unless ENV['GITHUB_TOKEN']

def get_http(path, json: true)
url =
if path.start_with?('http')
path
else
"https://api.github.com/repos/opf/openproject/#{path}"
end

response = RestClient::Request.new(
method: :get,
url: url,
user: ENV['GITHUB_USERNAME'],
password: ENV['GITHUB_TOKEN']
).execute

if json
JSON.parse(response.to_str)
else
response.to_str
end
rescue => e
warn "Failed to perform API request #{url}: #{e} #{e.message}"
end

response = get_http "pulls?state=open&head=opf:#{branch_name}"
raise "No PR found" if response.empty?
raise "More than one PR found??" if response.count > 1

pr_number = response.first['number']

warn "Looking for PR #{pr_number}"

response = get_http "actions/runs?branch=#{CGI.escape(branch_name)}"

last_test_action =
response
.dig('workflow_runs')
.select { |entry| entry['name'] == 'Core/Test' }
.max_by { |entry| entry['run_number'] }

raise "No action run found for PR #{pr_number}" unless last_test_action
log_response = get_http last_test_action['logs_url'], json: false
errors = []

# rubyzip needs a file to read with general purpose bit set
Tempfile.open('logs.zip') do |file|
file.write log_response
file.close

zip = Zip::File.open(file)
zip.each do |entry|
next unless entry.file?

log = entry.get_input_stream.read
log.scan(/^\S+ rspec (\S+) #.+$/) do |match|
errors << match
end
end
end

if errors.empty?
warn "No rspec errors found :-/"
else
puts errors.flatten.join(" ")
end

0 comments on commit 6b94334

Please sign in to comment.