Files
swift-nio/scripts/check_benchmark_thresholds.sh
Rick Newton-Rogers af3eee91b9 Benchmark diffs not being output on threshold regression
Motivation

* `check_benchmark_thresholds.sh` was updated to check for exit code 2
from `swift package benchmark thresholds check` to distinguish
threshold regression from build errors.
* It seems SwiftPM's `CommandPlugin` infrastructure always exits with code 1 when
`performCommand` throws, regardless of the error's raw value. So the
exit code is never 2, causing all regressions to fall through to the
`else` branch and be misreported as build errors, with no diff output.

Modifications

* Remove the `rc == 2` check and instead attempt `thresholds update`
for any non-zero `rc` from `thresholds check`.
* Use the result of `thresholds update` to distinguish regression
(success) from build error (failure).
* Remove `--exit-code` from `git diff` to prevent `set -uo pipefail`
from aborting the script before output is fully flushed.

Result

* Benchmark threshold regressions correctly output the `=== BEGIN DIFF
===` section again.
* Actual build errors are still correctly detected and reported.
2026-02-20 15:30:18 +00:00

60 lines
2.1 KiB
Bash
Executable File

#!/bin/bash
##===----------------------------------------------------------------------===##
##
## This source file is part of the SwiftNIO open source project
##
## Copyright (c) 2025 Apple Inc. and the SwiftNIO project authors
## Licensed under Apache License v2.0
##
## See LICENSE.txt for license information
## See CONTRIBUTORS.txt for the list of SwiftNIO project authors
##
## SPDX-License-Identifier: Apache-2.0
##
##===----------------------------------------------------------------------===##
set -uo pipefail
log() { printf -- "** %s\n" "$*" >&2; }
error() { printf -- "** ERROR: %s\n" "$*" >&2; }
fatal() { error "$@"; exit 1; }
# Parameter environment variables
if [ -z "$SWIFT_VERSION" ]; then
fatal "SWIFT_VERSION must be specified."
fi
benchmark_package_path="${BENCHMARK_PACKAGE_PATH:-"."}"
swift_version="${SWIFT_VERSION:-""}"
# Any parameters to the script are passed along to SwiftPM
swift_package_arguments=("$@")
#"swift package --package-path ${{ inputs.benchmark_package_path }} ${{ inputs.swift_package_arguments }} benchmark baseline check --check-absolute-path ${{ inputs.benchmark_package_path }}/Thresholds/${SWIFT_VERSION}/"
swift package --package-path "$benchmark_package_path" "${swift_package_arguments[@]}" benchmark thresholds check --format metricP90AbsoluteThresholds --path "${benchmark_package_path}/Thresholds/${swift_version}/"
rc="$?"
# Benchmarks are unchanged, nothing to recalculate
if [[ "$rc" == 0 ]]; then
exit 0
fi
# Non-zero exit from 'thresholds check' means thresholds regressed or a build
# error occurred. Try 'thresholds update' to distinguish: if it also fails, it
# was a build error; if it succeeds, thresholds were updated.
log "Recalculating thresholds..."
swift package --package-path "$benchmark_package_path" "${swift_package_arguments[@]}" benchmark thresholds update --format metricP90AbsoluteThresholds --path "${benchmark_package_path}/Thresholds/${swift_version}/"
update_rc="$?"
if [[ "$update_rc" != 0 ]]; then
error "Benchmark failed to run due to build error."
exit $update_rc
fi
echo "=== BEGIN DIFF ===" # use echo, not log for clean output to be scraped
git diff HEAD
exit 1