| #!/bin/false | |
| # shellcheck shell=bash | |
| # This file is intended to be sourced with `. shared.sh` or | |
| # `source shared.sh`, hence the invalid shebang and not being | |
| # marked as an executable file in git. | |
| function hide_output { | |
| { set +x; } 2>/dev/null | |
| on_err=" | |
| echo ERROR: An error was encountered with the build. | |
| cat /tmp/build.log | |
| exit 1 | |
| " | |
| trap "$on_err" ERR | |
| bash -c "while true; do sleep 30; echo \$(date) - building ...; done" & | |
| PING_LOOP_PID=$! | |
| "$@" &> /tmp/build.log | |
| trap - ERR | |
| kill $PING_LOOP_PID | |
| set -x | |
| } | |
| # See https://unix.stackexchange.com/questions/82598 | |
| # Duplicated in src/ci/shared.sh | |
| function retry { | |
| echo "Attempting with retry:" "$@" | |
| local n=1 | |
| local max=5 | |
| while true; do | |
| "$@" && break || { | |
| if [[ $n -lt $max ]]; then | |
| sleep $n # don't retry immediately | |
| ((n++)) | |
| echo "Command failed. Attempt $n/$max:" | |
| else | |
| echo "The command has failed after $n attempts." | |
| return 1 | |
| fi | |
| } | |
| done | |
| } | |
| download_tar_and_extract_into_dir() { | |
| local url="$1" | |
| local sum="$2" | |
| local dir="$3" | |
| local file=$(mktemp -u) | |
| while :; do | |
| if [[ -f "$file" ]]; then | |
| if ! h="$(sha256sum "$file" | awk '{ print $1 }')"; then | |
| printf 'ERROR: reading hash\n' >&2 | |
| exit 1 | |
| fi | |
| if [[ "$h" == "$sum" ]]; then | |
| break | |
| fi | |
| printf 'WARNING: hash mismatch: %s != expected %s\n' "$h" "$sum" >&2 | |
| rm -f "$file" | |
| fi | |
| printf 'Downloading: %s\n' "$url" | |
| if ! curl -f -L -o "$file" "$url"; then | |
| rm -f "$file" | |
| sleep 1 | |
| fi | |
| done | |
| mkdir -p "$dir" | |
| cd "$dir" | |
| tar -xf "$file" | |
| rm -f "$file" | |
| } |