OpenProject is the leading open source project management software.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
openproject/script/github_pr_errors

75 lines
1.6 KiB

#!/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
warn "Looking for the last action in branch #{branch_name}"
response = get_http "actions/runs?branch=#{CGI.escape(branch_name)}"
last_test_action =
response
.dig('workflow_runs')
.select { |entry| entry['name'] == 'Test suite' }
.max_by { |entry| entry['run_number'] }
raise "No action run found for branch #{branch_name}" 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.uniq.join(" ")
end