45 lines
1.2 KiB
Ruby
45 lines
1.2 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Ci
|
||
|
class TestCasesService
|
||
|
MAX_TRACKABLE_FAILURES = 200
|
||
|
|
||
|
def execute(build)
|
||
|
return unless Feature.enabled?(:test_failure_history, build.project)
|
||
|
return unless build.has_test_reports?
|
||
|
return unless build.project.default_branch_or_master == build.ref
|
||
|
|
||
|
test_suite = generate_test_suite_report(build)
|
||
|
|
||
|
track_failures(build, test_suite)
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def generate_test_suite_report(build)
|
||
|
build.collect_test_reports!(Gitlab::Ci::Reports::TestReports.new)
|
||
|
end
|
||
|
|
||
|
def track_failures(build, test_suite)
|
||
|
return if test_suite.failed_count > MAX_TRACKABLE_FAILURES
|
||
|
|
||
|
test_suite.failed.keys.each_slice(100) do |keys|
|
||
|
Ci::TestCase.transaction do
|
||
|
test_cases = Ci::TestCase.find_or_create_by_batch(build.project, keys)
|
||
|
Ci::TestCaseFailure.insert_all(test_case_failures(test_cases, build))
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def test_case_failures(test_cases, build)
|
||
|
test_cases.map do |test_case|
|
||
|
{
|
||
|
test_case_id: test_case.id,
|
||
|
build_id: build.id,
|
||
|
failed_at: build.finished_at
|
||
|
}
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|