|
274 | 274 | task test_py: [:py_prep_for_install_release, 'py:marionette_test'] |
275 | 275 | task build: %i[all firefox remote selenium tests] |
276 | 276 |
|
| 277 | +desc 'Retry failed tests from a log file' |
| 278 | +task :retry_failed_tests, [:log_file, :rbe] do |_task, arguments| |
| 279 | + log_file = arguments[:log_file] |
| 280 | + |
| 281 | + raise 'Error: Please provide a bazel log file containing test results.' if log_file.nil? |
| 282 | + raise "Error: Log file '#{log_file}' does not exist." unless File.exist?(log_file) |
| 283 | + |
| 284 | + rbe = arguments[:rbe] |
| 285 | + failing_tests = [] |
| 286 | + |
| 287 | + File.readlines(log_file).reverse_each do |line| |
| 288 | + if line.match?(%r{//.+:.*FAILED}) |
| 289 | + failing_tests << line.strip.split[0] |
| 290 | + elsif !failing_tests.empty? && line.match?(%r{//.+:.*PASSED}) |
| 291 | + break |
| 292 | + end |
| 293 | + end |
| 294 | + |
| 295 | + puts "Found #{failing_tests.size} failing tests; Retrying" |
| 296 | + |
| 297 | + retry_args = arguments.extras + %w[--test_output=streamed --test_env DEBUG=true] |
| 298 | + retry_args << (rbe == 'true' ? '--config=remote' : '--pin_browsers') |
| 299 | + |
| 300 | + retry_failures = false |
| 301 | + failing_tests.each do |failed_target| |
| 302 | + target_name = failed_target.split('/').last.tr(':', '_') |
| 303 | + target_name += rbe ? '_rbe' : '_gha' |
| 304 | + retry_logs = log_file.sub('.log', "_#{target_name}_retry.log") |
| 305 | + begin |
| 306 | + Bazel.execute('test', retry_args, failed_target, verbose: true, log_file: retry_logs) |
| 307 | + rescue StandardError => e |
| 308 | + retry_failures = true |
| 309 | + puts "Failed retry of #{failed_target}: #{e.message}" |
| 310 | + end |
| 311 | + end |
| 312 | + |
| 313 | + raise 'Some tests failed during retry' if retry_failures |
| 314 | +end |
| 315 | + |
277 | 316 | desc 'Clean build artifacts.' |
278 | 317 | task :clean do |
279 | 318 | rm_rf 'build/' |
|
0 commit comments