diff --git a/script/github_pr_errors b/script/github_pr_errors new file mode 100755 index 000000000000..5b2cf91df3be --- /dev/null +++ b/script/github_pr_errors @@ -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