mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
Add nightly benchmark regression detection pipeline
libeigen/eigen!2349 Co-authored-by: Rasmus Munk Larsen <rmlarsen@gmail.com>
This commit is contained in:
100
ci/scripts/push_perf_data.sh
Executable file
100
ci/scripts/push_perf_data.sh
Executable file
@@ -0,0 +1,100 @@
|
||||
#!/bin/sh
|
||||
# Push benchmark results to the perf-data orphan branch.
|
||||
# POSIX sh compatible (runs under Alpine's busybox ash).
|
||||
#
|
||||
# Expected environment variables:
|
||||
# EIGEN_CI_BUILDDIR - build directory containing results/
|
||||
# EIGEN_CI_GIT_PUSH_URL - authenticated git push URL
|
||||
# CI_COMMIT_SHORT_SHA - short commit hash
|
||||
|
||||
set -ex
|
||||
|
||||
results_dir="$(pwd)/${EIGEN_CI_BUILDDIR:-.bench-build}/results"
|
||||
perf_branch="perf-data"
|
||||
clone_dir="/tmp/perf-data-push"
|
||||
push_url="${EIGEN_CI_GIT_PUSH_URL:?EIGEN_CI_GIT_PUSH_URL must be set}"
|
||||
|
||||
rm -rf "${clone_dir}"
|
||||
|
||||
# Clone perf-data branch, or create orphan if it doesn't exist.
|
||||
if git clone --depth=1 --single-branch --branch "${perf_branch}" \
|
||||
"${push_url}" "${clone_dir}" 2>/dev/null; then
|
||||
echo "Cloned existing ${perf_branch} branch."
|
||||
else
|
||||
echo "${perf_branch} branch does not exist, creating orphan..."
|
||||
mkdir -p "${clone_dir}"
|
||||
cd "${clone_dir}"
|
||||
git init
|
||||
git checkout --orphan "${perf_branch}"
|
||||
cat > README.md <<'EOF'
|
||||
# Benchmark Performance Data
|
||||
|
||||
This branch stores nightly/weekly benchmark results as JSON files.
|
||||
It is maintained automatically by the CI benchmark pipeline.
|
||||
|
||||
## Structure
|
||||
|
||||
<target>/
|
||||
<date>_<commit>_<target>.json
|
||||
|
||||
## Analysis
|
||||
|
||||
See `ci/scripts/detect_regressions.py` on the main branch for the
|
||||
regression detection script that consumes this data.
|
||||
EOF
|
||||
git add README.md
|
||||
git -c user.name="CI Bot" -c user.email="ci@eigen.tuxfamily.org" \
|
||||
commit -m "Initialize perf-data branch"
|
||||
git remote add origin "${push_url}"
|
||||
cd -
|
||||
fi
|
||||
|
||||
cd "${clone_dir}"
|
||||
|
||||
# Copy combined result files into target subdirectories.
|
||||
# Only match canonical combined formats:
|
||||
# YYYY-MM-DDTHH-MM-SSZ_<hex>_<target>.json
|
||||
# YYYY-MM-DD_<hex>_<target>.json
|
||||
# This avoids picking up raw per-benchmark files like bench_gemm_double.json.
|
||||
copied=0
|
||||
for combined_json in "${results_dir}"/*.json; do
|
||||
[ -f "${combined_json}" ] || continue
|
||||
filename=$(basename "${combined_json}")
|
||||
# Must start with a UTC timestamp or date, followed by a hex commit hash.
|
||||
case "${filename}" in
|
||||
[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]T[0-9][0-9]-[0-9][0-9]-[0-9][0-9]Z_[0-9a-f]*_*.json) ;;
|
||||
[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]_[0-9a-f]*_*.json) ;;
|
||||
*) continue ;;
|
||||
esac
|
||||
# Extract target: strip timestamp/date + commit prefix and .json suffix.
|
||||
target=$(echo "${filename}" | sed 's/^[^_]*_[a-f0-9]*_//' | sed 's/\.json$//')
|
||||
mkdir -p "${target}"
|
||||
cp "${combined_json}" "${target}/${filename}"
|
||||
copied=$((copied + 1))
|
||||
done
|
||||
|
||||
if [ "${copied}" -eq 0 ]; then
|
||||
echo "No result files to store."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Prune data older than 90 days to keep the branch manageable.
|
||||
# We parse the date from the filename since clone mtime is always "now".
|
||||
cutoff=$(date -u -d "@$(($(date +%s) - 90*86400))" +%Y-%m-%d)
|
||||
find . -name '*.json' -path './*/*.json' | while IFS= read -r f; do
|
||||
file_date=$(basename "$f" | grep -oE '^[0-9]{4}-[0-9]{2}-[0-9]{2}')
|
||||
if [ -n "$file_date" ] && [ "$file_date" \< "$cutoff" ]; then
|
||||
rm -f "$f"
|
||||
fi
|
||||
done
|
||||
|
||||
# Commit and push.
|
||||
git add -A
|
||||
git -c user.name="CI Bot" -c user.email="ci@eigen.tuxfamily.org" \
|
||||
commit -m "Add benchmark results for $(date -u +%Y-%m-%d) (${CI_COMMIT_SHORT_SHA:-unknown})" || {
|
||||
echo "No changes to commit."
|
||||
exit 0
|
||||
}
|
||||
git push origin "${perf_branch}"
|
||||
|
||||
echo "Pushed ${copied} result file(s) to ${perf_branch} branch."
|
||||
Reference in New Issue
Block a user