Files
2026-07-13 13:17:40 +08:00

164 lines
4.8 KiB
Bash
Executable File

#!/bin/bash
# shellcheck disable=SC2317
set -e
cd "${0%/*}" || exit 1
reason() {
# Keep in sync with e2e.py ExitCode enum
if [[ "$1" -eq 0 ]]; then
REASON="success"
elif [[ "$1" -ge 1 && "$1" -lt 10 ]]; then
REASON="runtime error"
elif [[ "$1" -ge 10 && "$1" -lt 20 ]]; then
REASON="infra error"
elif [[ "$1" -ge 30 && "$1" -lt 40 ]]; then
REASON="infra timeout"
elif [[ "$1" -eq 42 ]]; then
REASON="command timeout"
elif [[ "$1" -ge 40 && "$1" -lt 50 ]]; then
REASON="command error"
fi
echo "${REASON}"
}
RAY_TEST_SCRIPT=${RAY_TEST_SCRIPT-"python ray_release/scripts/run_release_test.py"}
RELEASE_RESULTS_DIR=${RELEASE_RESULTS_DIR-/tmp/artifacts}
BUILDKITE_MAX_RETRIES=1
BUILDKITE_RETRY_CODE=79
BUILDKITE_TIME_LIMIT_FOR_RETRY=10800 # 3 hours
export RAY_TEST_REPO RAY_TEST_BRANCH RELEASE_RESULTS_DIR BUILDKITE_MAX_RETRIES BUILDKITE_RETRY_CODE BUILDKITE_TIME_LIMIT_FOR_RETRY
if [[ -n "${RAY_COMMIT_OF_WHEEL-}" ]]; then
git config --global --add safe.directory /workdir
HEAD_COMMIT=$(git rev-parse HEAD)
echo "The test repo has head commit of ${HEAD_COMMIT}"
if [[ "${HEAD_COMMIT}" != "${RAY_COMMIT_OF_WHEEL}" ]]; then
echo "The checked out test code doesn't match with the installed wheel. \
This is likely due to a racing condition when a PR is landed between \
a wheel is installed and test code is checked out."
echo "Hard resetting from ${HEAD_COMMIT} to ${RAY_COMMIT_OF_WHEEL}."
git reset --hard "${RAY_COMMIT_OF_WHEEL}"
fi
fi
if [[ -z "${NO_INSTALL}" ]]; then
# Strip the hashes from the constraint file
# TODO(aslonnie): use bazel run..
grep '==' ./requirements_py310.txt > /tmp/requirements_nohash.txt
sed -i 's/ \\//' /tmp/requirements_nohash.txt # Remove ending slashes.
sed -i 's/\[.*\]//g' /tmp/requirements_nohash.txt # Remove extras.
pip install -c /tmp/requirements_nohash.txt -e .
fi
RETRY_NUM=0
MAX_RETRIES=${MAX_RETRIES-1}
if [[ "${BUILDKITE_RETRY_COUNT-0}" -ge 1 ]]; then
echo "This is a manually triggered retry from the Buildkite web UI, so we set the number of infra retries to 1."
MAX_RETRIES=1
fi
ALL_EXIT_CODES=()
while [[ "$RETRY_NUM" -lt "$MAX_RETRIES" ]]; do
RETRY_NUM=$((RETRY_NUM + 1))
if [[ "$RETRY_NUM" -gt 1 ]]; then
# Sleep for random time between 30 and 90 minutes
SLEEP_TIME=$((1800 + RANDOM % 5400))
if [[ -n "${OVERRIDE_SLEEP_TIME}" ]]; then
SLEEP_TIME=${OVERRIDE_SLEEP_TIME}
fi
echo "----------------------------------------"
echo "Retry count: ${RETRY_NUM}/${MAX_RETRIES}. Sleeping for ${SLEEP_TIME} seconds before retrying the run."
echo "----------------------------------------"
sleep "${SLEEP_TIME}"
fi
if [[ -z "${NO_ARTIFACTS}" ]]; then
rm -rf "${RELEASE_RESULTS_DIR:?}"/* || true
fi
_term() {
echo "[SCRIPT $(date +'%Y-%m-%d %H:%M:%S'),...] Caught SIGTERM signal, sending SIGTERM to release test script"
kill "$proc"
wait "$proc"
}
START=$(date +%s)
set +e
if [[ "$1" == *".kuberay"* ]]; then
export GOOGLE_CLOUD_PROJECT=dhyey-dev
export AWS_REGION="us-west-2"
fi
trap _term SIGINT SIGTERM
${RAY_TEST_SCRIPT} "$@" &
proc=$!
wait "$proc"
EXIT_CODE=$?
set -e
END=$(date +%s)
REASON=$(reason "${EXIT_CODE}")
RUNTIME=$((END-START))
ALL_EXIT_CODES[${#ALL_EXIT_CODES[@]}]=$EXIT_CODE
case ${EXIT_CODE} in
0)
echo "Script finished successfully on try ${RETRY_NUM}/${MAX_RETRIES}"
break
;;
30 | 31 | 32 | 33)
echo "Script failed on try ${RETRY_NUM}/${MAX_RETRIES} with exit code ${EXIT_CODE} (${REASON})."
;;
*)
echo "Script failed on try ${RETRY_NUM}/${MAX_RETRIES} with exit code ${EXIT_CODE} (${REASON}), aborting."
break
;;
esac
done
if [[ -z "${NO_ARTIFACTS}" ]]; then
rm -rf /tmp/ray_release_test_artifacts/* || true
cp -rf "${RELEASE_RESULTS_DIR}"/* /tmp/ray_release_test_artifacts/ || true
fi
echo "----------------------------------------"
echo "Release test finished with final exit code ${EXIT_CODE} after ${RETRY_NUM}/${MAX_RETRIES} tries"
echo "Run results:"
COUNTER=1
for EX in "${ALL_EXIT_CODES[@]}"; do
REASON=$(reason "${EX}")
echo " Run $COUNTER: Exit code = ${EX} (${REASON})"
COUNTER=$((COUNTER + 1))
done
echo "----------------------------------------"
REASON=$(reason "${EXIT_CODE}")
echo "Final release test exit code is ${EXIT_CODE} (${REASON}). Took ${RUNTIME}s"
if [[ "$EXIT_CODE" -eq 0 ]]; then
echo "RELEASE MANAGER: This test seems to have passed."
elif [[ "$EXIT_CODE" -ge 30 && "$EXIT_CODE" -lt 40 ]]; then
echo "RELEASE MANAGER: This is likely an infra error that can be solved by RESTARTING this test."
else
echo "RELEASE MANAGER: This could be an error in the test. Please REVIEW THE LOGS and ping the test owner."
fi
if [[ "$EXIT_CODE" -ne 0 && "$RUNTIME" -le "$BUILDKITE_TIME_LIMIT_FOR_RETRY" ]]; then
exit "$BUILDKITE_RETRY_CODE"
else
exit "$EXIT_CODE"
fi