mirror of
https://github.com/opf/openproject.git
synced 2026-06-14 03:30:14 +00:00
Add a very basic github action rspec extractor
This commit is contained in:
Executable
+80
@@ -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
|
||||
Reference in New Issue
Block a user