ztunnel/scripts/run-cached.sh

82 lines
2.3 KiB
Bash
Executable File

#!/bin/bash
set -e
SCRIPT_INPUT=("$@")
# Function to log error and execute command
function error_and_exec() {
echo "Error: $1" >&2
exec "${SCRIPT_INPUT[@]}"
}
# Check if RUST_CACHE_DIR is set
if [ -z "${RUST_CACHE_DIR}" ]; then
error_and_exec "RUST_CACHE_DIR is not set" "$@"
fi
# Check if out/ directory exists
if [ -d "out" ]; then
error_and_exec "out/ directory already exists" "$@"
fi
# Get current branch name
if [ -z "${PULL_BASE_REF}" ]; then
error_and_exec "Could not determine current branch" "$@"
fi
# Make sure we are on presubmit
if [ "${JOB_TYPE}" != "presubmit" ]; then
error_and_exec "Caching only available on presubmit" "$@"
fi
CACHE_DIR="${RUST_CACHE_DIR}/${PULL_BASE_REF}"
# Strip binaries to keep things smaller
cat <<EOF > ~/.cargo/config.toml
[target.'cfg(debug_assertions)']
rustflags = ["-C", "strip=debuginfo"]
EOF
# Check if branch cache exists
if [ ! -d "${CACHE_DIR}" ]; then
# Not an error, we may need to populate it the first time
echo "Cache for branch ${PULL_BASE_REF} not found, we will populate it" >&2
else
echo "Found cache for branch ${PULL_BASE_REF}, copying it" >&2
# Copy cache to out directory
mkdir -p out
cp -ar "${CACHE_DIR}" out/rust
echo "Cache size: $(du -sh out/rust)" >&2
fi
# Run the provided command
"$@"
# Clean up everything except build and deps directories
find out/rust -mindepth 1 -maxdepth 1 -type d \
! -path "out/rust/debug" \
-exec rm -rf {} +
find out/rust -mindepth 2 -maxdepth 2 -type d \
! -path "out/rust/debug/build" \
! -path "out/rust/debug/deps" \
! -path "out/rust/debug/.fingerprint" \
-exec rm -rf {} +
# Update the cache with our state
tmp="${RUST_CACHE_DIR}/${RANDOM}"
tmp_to_delete="${RUST_CACHE_DIR}/${RANDOM}"
echo "Backing up cache" >&2
# Move our cache into the volume (this is slow since its cross-filesystem)
mv out/rust "${tmp}"
# Move the existing cache - we would delete it now, but mv is faster than delete, so we do this later
# to prevent the time period when things are down
# Note: we could use `exch` here in the future, but its not in our Ubuntu version
mv "${CACHE_DIR}" "${tmp_to_delete}" || true
# Populate the cache with our new info
mv "${tmp}" "${CACHE_DIR}"
# Remove the old one
rm -rf "${tmp_to_delete}" || true