Files
eigen/ci/scripts/push_perf_data.sh

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

101 lines
3.3 KiB
Bash
Raw Permalink Normal View History

#!/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."