Skip to content

Commit 75b7e82

Browse files
committed
refactor(logs): Improve clarity and correctness in build reports
Refactored trial_build.py and report_generator.py to provide clearer and more accurate build logs. Key changes: - Differentiated between 'projects' and 'builds' for precise counting. - Consolidated and clarified the reporting of skipped builds. - Updated the results JSON schema with descriptive keys. - Updated the report generator to consume the new schema and display both build counts per version and a final summary of projects analyzed.
1 parent f0fdd8a commit 75b7e82

File tree

2 files changed

+56
-44
lines changed

2 files changed

+56
-44
lines changed

infra/build/functions/report_generator.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,18 +59,29 @@ def _print_box(title, lines):
5959
def generate_final_summary(all_results):
6060
"""Prints a visually appealing summary of all build versions."""
6161
summary_lines = []
62+
total_unique_projects = set()
63+
6264
for version, data in all_results.items():
6365
if data:
64-
passed = str(data['successful'])
65-
failed = str(data['failed'])
66-
skipped = str(data['skipped'])
67-
total = str(data['total'])
66+
total_unique_projects.update(data.get('all_projects', []))
67+
passed = str(data['successful_builds'])
68+
failed = str(data['failed_builds'])
69+
skipped = str(data['skipped_builds'])
70+
total_builds = str(data['successful_builds'] + data['failed_builds'] +
71+
data['skipped_builds'])
6872
line = (
6973
f" {version.ljust(15)}{'Passed:'.ljust(8)} {passed.ljust(6)} | "
7074
f"{'Failed:'.ljust(8)} {failed.ljust(6)} | {'Skipped:'.ljust(8)} {skipped.ljust(6)} | "
71-
f"{'Total:'.ljust(7)} {total.ljust(6)}")
75+
f"{'Total:'.ljust(7)} {total_builds.ljust(6)}")
7276
summary_lines.append(line)
7377

78+
if summary_lines:
79+
separator = '╟' + '─' * 90 + '╢'
80+
summary_lines.append(separator)
81+
project_summary_line = (
82+
f" Total Projects Analyzed: {len(total_unique_projects)}")
83+
summary_lines.append(project_summary_line)
84+
7485
_print_box('FINAL BUILD REPORT', summary_lines)
7586

7687

@@ -131,7 +142,7 @@ def main():
131142
data = json.load(f)
132143
all_results[version] = data
133144
any_results_found = True
134-
if data['failed'] > 0:
145+
if data['failed_builds'] > 0:
135146
any_failures = True
136147

137148
if not any_results_found:

infra/build/functions/trial_build.py

Lines changed: 39 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ def _do_test_builds(args, test_image_suffix, end_time, version_tag):
285285
build_types.append(BUILD_TYPES['fuzzing'])
286286

287287
build_ids = collections.defaultdict(list)
288-
skipped_projects = []
288+
skipped_projects = collections.defaultdict(list)
289289
failed_to_start_builds = []
290290
credentials = oauth2client.client.GoogleCredentials.get_application_default()
291291

@@ -302,8 +302,8 @@ def _do_test_builds(args, test_image_suffix, end_time, version_tag):
302302
if not args.force_build:
303303
unselected_projects = set(specified_projects) - set(projects_to_build)
304304
for project in unselected_projects:
305-
skipped_projects.append(
306-
(project, f'{build_type.type_name}: Production build succeeded'))
305+
skipped_projects[build_type.type_name].append(
306+
(project, 'Production build succeeded'))
307307

308308
logging.info('Build type: %s', build_type.type_name)
309309
logging.info(
@@ -327,7 +327,8 @@ def _do_test_builds(args, test_image_suffix, end_time, version_tag):
327327
build_type=build_type.type_name)
328328
project_builds, new_skipped, new_failed_to_start = _do_build_type_builds(
329329
args, config, credentials, build_type, projects_to_build)
330-
skipped_projects.extend(new_skipped)
330+
for project, reason in new_skipped:
331+
skipped_projects[build_type.type_name].append((project, reason))
331332
failed_to_start_builds.extend(new_failed_to_start)
332333
for project, project_build_id in project_builds.items():
333334
build_ids[project].append(project_build_id)
@@ -336,13 +337,17 @@ def _do_test_builds(args, test_image_suffix, end_time, version_tag):
336337
if skipped_projects:
337338
logging.info(
338339
'================================================================')
339-
logging.info(' PHASE 2: SKIPPED PROJECTS')
340+
logging.info(' PHASE 2: SKIPPED BUILDS')
340341
logging.info(
341342
'================================================================')
342-
logging.info('Total projects skipped: %d', len(skipped_projects))
343-
logging.info('--- SKIPPED PROJECTS ---')
344-
for project, reason in sorted(skipped_projects):
345-
logging.info(' - %s: %s', project, reason)
343+
total_skipped_builds = sum(
344+
len(skips) for skips in skipped_projects.values())
345+
logging.info('Total skipped builds: %d', total_skipped_builds)
346+
logging.info('--- SKIPPED BUILDS ---')
347+
for build_type_name, skips in sorted(skipped_projects.items()):
348+
logging.info(' - %s:', build_type_name)
349+
for project, reason in sorted(skips):
350+
logging.info(' - %s: %s', project, reason)
346351
logging.info('-----------------------')
347352

348353
logging.info(
@@ -525,46 +530,42 @@ def wait_on_builds(build_ids, credentials, cloud_project, end_time,
525530
time.sleep(1) # Avoid rate limiting.
526531

527532
# Final Report
528-
total_projects = (len(successful_builds) + len(failed_builds) +
529-
len(skipped_projects))
530-
all_projects_in_build = (list(successful_builds.keys()) +
531-
list(failed_builds.keys()) +
532-
[name for name, reason in skipped_projects])
533+
successful_builds_count = sum(
534+
len(builds) for builds in successful_builds.values())
535+
failed_builds_count = sum(len(builds) for builds in failed_builds.values())
536+
skipped_builds_count = sum(
537+
len(skips) for skips in skipped_projects.values())
538+
539+
# Note: To get all unique project names, we create a set from the keys of
540+
# successful_builds, failed_builds, and the project names in skipped_projects.
541+
all_projects_in_build = set(successful_builds.keys()) | set(
542+
failed_builds.keys()) | set(p for sl in skipped_projects.values()
543+
for p, r in sl)
544+
total_projects = len(all_projects_in_build)
545+
533546
results = {
534-
'total': total_projects,
535-
'successful': len(successful_builds),
536-
'failed': len(failed_builds),
537-
'skipped': len(skipped_projects),
547+
'total_projects_analyzed': total_projects,
548+
'successful_builds': successful_builds_count,
549+
'failed_builds': failed_builds_count,
550+
'skipped_builds': skipped_builds_count,
538551
'failed_projects': sorted(list(failed_builds.keys())),
539-
'skipped_projects': sorted([name for name, reason in skipped_projects]),
540-
'all_projects': sorted(all_projects_in_build),
552+
'skipped_projects':
553+
sorted(
554+
list(set(p for sl in skipped_projects.values() for p, r in sl))),
555+
'all_projects': sorted(list(all_projects_in_build)),
541556
}
542557
with open(f'{version_tag}-results.json', 'w') as f:
543558
json.dump(results, f)
544559

545560
summary_title = f'BUILD REPORT: {version_tag.upper()}'
546561
summary_lines = [
547562
f"Total projects analyzed: {total_projects}",
548-
f"[PASSED] Successful builds: {len(successful_builds)}",
549-
f"[FAILED] Failed builds: {len(failed_builds)}",
550-
f"[SKIPPED] Skipped projects: {len(skipped_projects)}",
563+
f"[PASSED] Successful builds: {successful_builds_count}",
564+
f"[FAILED] Failed builds: {failed_builds_count}",
565+
f"[SKIPPED] Skipped builds: {skipped_builds_count}",
551566
]
552567
_print_summary_box(summary_title, summary_lines)
553568

554-
if skipped_projects:
555-
logging.info('--- SKIPPED PROJECTS ---')
556-
# Group skipped projects by reason
557-
grouped_skipped = {}
558-
for project, reason in skipped_projects:
559-
if reason not in grouped_skipped:
560-
grouped_skipped[reason] = []
561-
grouped_skipped[reason].append(project)
562-
563-
for reason, projects in sorted(grouped_skipped.items()):
564-
logging.info(' - %s:', reason)
565-
for project in sorted(projects):
566-
logging.info(' - %s', project)
567-
568569
if failed_builds:
569570
logging.error('--- FAILED BUILDS ---')
570571
for project, failures in sorted(failed_builds.items()):
@@ -577,7 +578,7 @@ def wait_on_builds(build_ids, credentials, cloud_project, end_time,
577578
logging.info('-----------------------')
578579
return False
579580

580-
if not finished_builds_count and not skipped_projects:
581+
if not finished_builds_count and not skipped_builds_count:
581582
logging.warning('No builds were run.')
582583
return False
583584

0 commit comments

Comments
 (0)