From 9e9833b888ce893396ef085dc5cfb6c674f3d4e5 Mon Sep 17 00:00:00 2001 From: Eric Haag Date: Tue, 3 Jan 2023 17:01:18 -0600 Subject: [PATCH 1/2] Display potential build time savings in experiment summary --- .../com/gradle/enterprise/cli/Fields.java | 10 +++++++ components/scripts/lib/build-scan-parse.sh | 7 ++++- components/scripts/lib/info.sh | 30 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/Fields.java b/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/Fields.java index 6aad492c..b9a12ef7 100644 --- a/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/Fields.java +++ b/components/fetch-build-scan-data-cmdline-tool/src/main/java/com/gradle/enterprise/cli/Fields.java @@ -33,6 +33,7 @@ public enum Fields { EXECUTED_NOT_CACHEABLE_DURATION("Executed not cacheable duration", d -> totalDuration(d, "executed_not_cacheable")), EFFECTIVE_TASK_EXECUTION_DURATION("Effective task execution duration", d -> String.valueOf(d.getEffectiveTaskExecutionDuration().toMillis())), SERIALIZATION_FACTOR("Serialization factor", d -> formatBigDecimal(d.getSerializationFactor())), + EXECUTED_CACHEABLE_DURATION_MILLISECONDS("Executed cacheable duration milliseconds", d -> totalDurationMillis(d, "executed_cacheable")), ; public final String label; @@ -77,6 +78,15 @@ private static String totalDuration(BuildValidationData data, String avoidanceOu ); } + private static String totalDurationMillis(BuildValidationData data, String avoidanceOutcome) { + return String.valueOf( + data.getTasksByAvoidanceOutcome() + .getOrDefault(avoidanceOutcome, TaskExecutionSummary.ZERO) + .totalDuration() + .toMillis() + ); + } + private static String formatDuration(Duration duration) { long hours = duration.toHours(); long minutes = duration.minusHours(hours).toMinutes(); diff --git a/components/scripts/lib/build-scan-parse.sh b/components/scripts/lib/build-scan-parse.sh index 887fbcee..9dd87671 100644 --- a/components/scripts/lib/build-scan-parse.sh +++ b/components/scripts/lib/build-scan-parse.sh @@ -28,6 +28,7 @@ executed_not_cacheable_duration=() # Build duration metrics effective_task_execution_duration=() serialization_factors=() +executed_cacheable_duration_milliseconds=() parse_build_scan_csv() { # This isn't the most robust way to read a CSV, @@ -46,7 +47,7 @@ parse_build_scan_csv() { idx=0 # shellcheck disable=SC2034 # not all scripts use all of the fetched data - while IFS=, read -r field_1 field_2 field_3 field_4 field_5 field_6 field_7 field_8 field_9 field_10 field_11 field_12 field_13 field_14 field_15 field_16 field_17 field_18 field_19 field_20 field_21; do + while IFS=, read -r field_1 field_2 field_3 field_4 field_5 field_6 field_7 field_8 field_9 field_10 field_11 field_12 field_13 field_14 field_15 field_16 field_17 field_18 field_19 field_20 field_21 field_22; do if [[ "$header_row_read" == "false" ]]; then header_row_read=true continue; @@ -86,6 +87,10 @@ parse_build_scan_csv() { serialization_factors[idx]="${field_21}" fi + if [[ -n "$field_22" ]]; then + executed_cacheable_duration_milliseconds[idx]="${field_22}" + fi + ((idx++)) done <<< "${build_scan_csv}" } diff --git a/components/scripts/lib/info.sh b/components/scripts/lib/info.sh index 21e59ba0..302b325d 100644 --- a/components/scripts/lib/info.sh +++ b/components/scripts/lib/info.sh @@ -140,6 +140,8 @@ print_performance_characteristics() { print_realized_build_time_savings + print_potential_build_time_savings + print_build_caching_leverage_metrics print_serialization_factor @@ -172,6 +174,34 @@ print_realized_build_time_savings() { fi } +print_potential_build_time_savings() { + local build_1_effective_execution_duration="${effective_task_execution_duration[0]}" + + local build_2_effective_execution_duration="${effective_task_execution_duration[1]}" + local build_2_executed_cacheable_duration="${executed_cacheable_duration_milliseconds[1]}" + local build_2_serialization_factor="${serialization_factors[1]}" + + # Do not print potential build time savings at all if these values do not exist + # This can happen since build-scan-support-tool does not yet support these fields + if [[ -z "${build_1_effective_execution_duration}" || -z "${build_2_effective_execution_duration}" || -z "${build_2_executed_cacheable_duration}" || -z "${build_2_serialization_factor}" ]]; then + return 0 + fi + + local value + value="" + # Only calculate realized build time savings when these have valid values + # These values can be returned as zero when an error occurs processing the Build Scan data + if [[ "${build_1_effective_execution_duration}" && "${build_2_effective_execution_duration}" && -n "${build_2_serialization_factor}" ]]; then + local first_build second_build potential_build_duration potential_savings + first_build=$(format_duration "${effective_task_execution_duration[0]}") + potential_build_duration=$(echo "${build_2_effective_execution_duration}-(${build_2_executed_cacheable_duration}/${build_2_serialization_factor})" | bc) + potential_savings=$(format_duration build_1_effective_execution_duration-potential_build_duration) + second_build=$(format_duration potential_build_duration) + value="${potential_savings} wall-clock time (from ${first_build} to ${second_build})" + fi + summary_row "Potential build time savings:" "${value}" +} + print_build_caching_leverage_metrics() { local task_count_padding task_count_padding=$(max_length "${avoided_from_cache_num_tasks[1]}" "${executed_cacheable_num_tasks[1]}" "${executed_not_cacheable_num_tasks[1]}") From 9e73951f6a5ff139b1f4f2c451b972649c8d6151 Mon Sep 17 00:00:00 2001 From: Eric Haag Date: Wed, 4 Jan 2023 09:04:16 -0600 Subject: [PATCH 2/2] Suppress incorrect shellcheck --- components/scripts/lib/info.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/components/scripts/lib/info.sh b/components/scripts/lib/info.sh index 302b325d..b1958be4 100644 --- a/components/scripts/lib/info.sh +++ b/components/scripts/lib/info.sh @@ -194,6 +194,7 @@ print_potential_build_time_savings() { if [[ "${build_1_effective_execution_duration}" && "${build_2_effective_execution_duration}" && -n "${build_2_serialization_factor}" ]]; then local first_build second_build potential_build_duration potential_savings first_build=$(format_duration "${effective_task_execution_duration[0]}") + # shellcheck disable=SC2034 # it's used on the next few lines potential_build_duration=$(echo "${build_2_effective_execution_duration}-(${build_2_executed_cacheable_duration}/${build_2_serialization_factor})" | bc) potential_savings=$(format_duration build_1_effective_execution_duration-potential_build_duration) second_build=$(format_duration potential_build_duration)