mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-04-10 11:34:33 +08:00
101 lines
3.3 KiB
Bash
Executable File
101 lines
3.3 KiB
Bash
Executable File
#!/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."
|