diff --git a/database/scripts/format_report.rb b/database/scripts/format_report.rb
new file mode 100755
index 0000000..8f40648
--- /dev/null
+++ b/database/scripts/format_report.rb
@@ -0,0 +1,16 @@
+#!/usr/bin/env ruby
+
+require_relative 'lib/report_formatter'
+require 'json'
+
+report_name = ARGV.shift
+
+report = JSON.load_file(report_name)
+
+report['urgent']['build_regressions'] = ReportFormatter::build_regressions(report['urgent']['build_regressions'])
+report['urgent']['test_regressions_consecutive'] = ReportFormatter::test_regressions_consecutive(report['urgent']['test_regressions_consecutive'])
+report['urgent']['test_regressions_flaky'] = ReportFormatter::test_regressions_flaky(report['urgent']['test_regressions_flaky'])
+
+# Sample output:
+# puts report['urgent']['build_regressions']
+puts ReportFormatter::format_report report
diff --git a/database/scripts/generate_report.rb b/database/scripts/generate_report.rb
index d9757f0..2329726 100755
--- a/database/scripts/generate_report.rb
+++ b/database/scripts/generate_report.rb
@@ -28,8 +28,8 @@ def generate_report(report_name, exclude_set)
report = {
'urgent' => {
'build_regressions' => urgent_build_regressions = BuildfarmToolsLib::build_regressions_today(filter_known: true),
- 'test_regressions_consecutive' => urgent_consistent_test_regressions = BuildfarmToolsLib::test_regressions_today(filter_known: true, only_consistent: true),
- 'test_regressions_flaky' => urgent_flaky_test_regressions = BuildfarmToolsLib::flaky_test_regressions(filter_known: true),
+ 'test_regressions_consecutive' => urgent_consistent_test_regressions = BuildfarmToolsLib::test_regressions_today(filter_known: true, only_consistent: true, group_issues: true),
+ 'test_regressions_flaky' => urgent_flaky_test_regressions = BuildfarmToolsLib::flaky_test_regressions(filter_known: true, group_issues: true),
},
'maintenance' => {
'jobs_failing' => [],
@@ -40,7 +40,6 @@ def generate_report(report_name, exclude_set)
'build_regressions_known' => [],
'test_regressions_all' => [],
'test_regressions_known' => [],
- 'build_regressions_known' => [],
}
}
@@ -51,3 +50,4 @@ def generate_report(report_name, exclude_set)
end
generate_report(options[:report_name], options[:exclude])
+puts options[:report_name]
diff --git a/database/scripts/lib/buildfarm_tools.rb b/database/scripts/lib/buildfarm_tools.rb
index 703f1aa..0083057 100644
--- a/database/scripts/lib/buildfarm_tools.rb
+++ b/database/scripts/lib/buildfarm_tools.rb
@@ -34,7 +34,7 @@ def self.error_appearances_in_job(test_name, job_name)
run_command('./sql_run.sh error_appearances_in_job.sql', args: [test_name, job_name])
end
- def self.test_regressions_today(filter_known: false, only_consistent: false)
+ def self.test_regressions_today(filter_known: false, only_consistent: false, group_issues: false)
# Keys: job_name, build_number, error_name, build_datetime, node_name
out = run_command('./sql_run.sh errors_check_last_build.sql')
if filter_known
@@ -45,15 +45,22 @@ def self.test_regressions_today(filter_known: false, only_consistent: false)
out.filter! { |tr| tr['age'].to_i >= CONSECUTIVE_THRESHOLD || tr['age'].to_i == WARNING_AGE_CONSTANT }
out.sort_by! { |tr| -tr['age'].to_i }
end
+ out.each do |e|
+ e['reports'] = test_regression_reported_issues e['error_name']
+ end
+ if group_issues
+ # Group by (job_name, age)
+ out = out.group_by { |o| [o['job_name'], o['age']] }.to_a.map { |e| e[1] }
+ end
out
end
- def self.flaky_test_regressions(filter_known: false, time_range: FLAKY_BUILDS_DEFAULT_RANGE)
+ def self.flaky_test_regressions(filter_known: false, group_issues: false, time_range: FLAKY_BUILDS_DEFAULT_RANGE)
# Keys: job_name, build_number, error_name, build_datetime, node_name, flakiness
out = []
today_regressions = test_regressions_today(filter_known: filter_known)
today_regressions.each do |tr|
- next if !tr['age'].to_i.nil? && tr['age'].to_i >= CONSECUTIVE_THRESHOLD
+ next if !tr['age'].to_i.nil? && (tr['age'].to_i >= CONSECUTIVE_THRESHOLD || tr['age'].to_i == WARNING_AGE_CONSTANT)
tr_flakiness = test_regression_flakiness(tr['error_name'], time_range: time_range)
if tr_flakiness.nil?
@@ -66,6 +73,9 @@ def self.flaky_test_regressions(filter_known: false, time_range: FLAKY_BUILDS_DE
end
end
out.sort_by! { |e| -e['flakiness'][0]['failure_percentage'].to_f }
+ if group_issues
+ out = out.group_by { |o| o['flakiness'] }.values
+ end
out
end
diff --git a/database/scripts/lib/report_formatter.rb b/database/scripts/lib/report_formatter.rb
new file mode 100644
index 0000000..5a5ec1f
--- /dev/null
+++ b/database/scripts/lib/report_formatter.rb
@@ -0,0 +1,149 @@
+# frozen_string_literal: true
+
+require 'json'
+
+module ReportFormatter
+ JOB_URL_PATTERN = {
+ /^gz|^sdformat|^ros_gz/ => 'https://build.osrfoundation.org/job/',
+ /^[A-Z]ci/ => 'https://build.ros2.org/job/',
+ /^nightly_|^packaging_/ => 'https://ci.ros2.org/job/',
+ }
+
+ def self.format_reference_build(issue_hash)
+ job_name = issue_hash['job_name']
+ build_number = issue_hash['build_number']
+ base_url = ""
+
+ JOB_URL_PATTERN.each_pair do |pattern, url|
+ if pattern.match? job_name
+ base_url = url
+ break
+ end
+ end
+
+ "[#{job_name}##{build_number}](#{base_url}#{job_name}/#{build_number})"
+ end
+
+ def self.format_datetime(datetime)
+ date, time = datetime.split
+ hour, minute, _ = time.split(':')
+ "#{date} #{hour}:#{minute}"
+ end
+
+ def self.format_flakiness(flakiness_arr)
+ table_head = " "
+ table_body = ""
+ flakiness_arr.each do |e|
+ table_body += "Job Name Last Fail First Fail Build Count Failure Count Failure Percentage