Files
gitlab-foss/tooling/bin/predictive_test_metrics
2025-07-23 21:20:38 +00:00

118 lines
3.6 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# frozen_string_literal: true
require 'bundler/inline'
require 'optparse'
require 'fileutils'
gemfile do
source 'https://rubygems.org'
gem 'gitlab', '~> 5.1'
gem 'test_file_finder', '~> 0.3'
# loaded from standard library by gitlab and will stop working on ruby 3.4
gem 'base64'
gem 'csv'
end
require_relative '../lib/tooling/predictive_tests/metrics_exporter'
options = {}
OptionParser.new do |opts|
opts.banner = "Usage: #{$PROGRAM_NAME} [options]"
opts.on('--export-backend-metrics', 'Export predictive test metrics for rspec') do
options[:export_backend_metrics] = true
end
opts.on('--export-frontend-metrics', 'Export predictive test metrics for frontend') do
options[:export_frontend_metrics] = true
end
opts.on('--failed-backend-tests-file [string]', String, 'File with list of failed rspec tests') do |value|
options[:failed_backend_tests_file] = value
end
opts.on('--failed-frontend-tests-file [string]', String, 'File with list of failed jest tests') do |value|
options[:failed_frontend_tests_file] = value
end
opts.on('--knapsack-report-file [string]', String, 'Knapsack report JSON file with specs runtimes') do |value|
options[:knapsack_report_file] = value
end
opts.on('--output-dir [string]', String, 'Output directory for generated metrics files') do |value|
options[:output_dir] = value
end
opts.on('--debug', 'Enable debug logging') do
options[:debug] = true
end
opts.on('-h', '--help', 'Show this help message') do
puts opts
exit
end
end.parse!
results = []
log_level = options[:debug] ? :debug : :info
def empty_arg?(arg)
arg.nil? || arg.empty?
end
export_backend = options[:export_backend_metrics]
failed_backend_tests_file = options[:failed_backend_tests_file]
export_frontend = options[:export_frontend_metrics]
failed_frontend_tests_file = options[:failed_frontend_tests_file]
knapsack_report_file = options[:knapsack_report_file]
# Validate at least one option is provided
if [export_backend, export_frontend].all?(&:nil?)
puts <<~MSG
Error: Please specify at least one of these flags:
1. --export-backend-metrics
2. --export-frontend-metrics
MSG
exit 1
end
if export_backend
if empty_arg?(failed_backend_tests_file)
puts "[predictive tests] Error: Missing argument: --failed-backend-tests-file"
puts "[predictive tests] skipping backend metrics export"
results << false
else
# scripts that fetch failed tests do not create empty file when no failures were detected
FileUtils.touch(failed_backend_tests_file) unless File.exist?(failed_backend_tests_file)
results << Tooling::PredictiveTests::MetricsExporter.new(
test_type: :backend,
output_dir: options[:output_dir],
all_failed_tests_file: failed_backend_tests_file,
test_runtime_report_file: knapsack_report_file,
log_level: log_level
).execute
end
end
if export_frontend
if empty_arg?(failed_frontend_tests_file)
puts "[predictive tests] Error: Missing argument: --failed-frontend-tests-file"
puts "[predictive tests] skipping frontend metrics export"
results << false
else
# scripts that fetch failed tests do not create empty file when no failures were detected
FileUtils.touch(failed_frontend_tests_file) unless File.exist?(failed_frontend_tests_file)
results << Tooling::PredictiveTests::MetricsExporter.new(
test_type: :frontend,
output_dir: options[:output_dir],
all_failed_tests_file: options[:failed_frontend_tests_file],
log_level: log_level
).execute
end
end
results.include?(false) ? exit(1) : exit(0)