Files
Felis/deploy/e2e_upstream.sh
T

57 lines
2.6 KiB
Bash

#!/bin/bash
# Whether a failed installer run in the e2e workflow stopped on an upstream download that
# was refused or dropped, which says nothing about the commit under test. Each install step
# hands its log and the installer's status here when the installer fails:
#
# sudo ... bash deploy/bootstrap.sh 2>&1 | tee install.log || bash deploy/e2e_upstream.sh install.log $?
#
# It reads the installer's last ERR-trap line ("bootstrap failed near line N (exit E)") and
# the line just before it. When that line is curl's own error for the same status, and the
# error is one a mirror or GitHub answers with on a bad minute (a connection refused, reset
# or timed out, a 403, 408, 429 or 5xx), it leaves a warning and E2E_UPSTREAM_SKIP=1 in
# $GITHUB_ENV and exits 0: the job's later steps are gated on that variable, so the job ends
# green with the warning on the run. Anything else exits with the installer's status. A 404
# is a URL or a version the installer names, which a commit can break, so it fails.
#
# deploy/e2e_upstream_test.sh holds its checks, against bootstrap.sh's own trap message.
set -euo pipefail
log="${1:?usage: e2e_upstream.sh LOG STATUS}"
status="${2:?usage: e2e_upstream.sh LOG STATUS}"
# The last run of trap lines and the line before it. bash may fire the trap again for each
# function the failure unwinds through, and the EXIT cleanup can print after it. The log
# keeps the installer's colour codes, so nothing is anchored on the left.
code="" before=""
{ read -r code && IFS= read -r before; } < <(awk '
/bootstrap failed near line [0-9]+ \(exit [0-9]+\)$/ {
code = $0; sub(/.*\(exit /, "", code); sub(/\)$/, "", code)
found = code; foundprev = last
next
}
{ last = $0 }
END { if (found != "") { print found; print foundprev } }
' "$log") || true
upstream=""
case "$before" in
*"curl: (${code}) "*)
case "$code" in
# Could not resolve or connect, an HTTP/2 or TLS failure, a transfer cut short, no
# reply, a send or receive failure, a timeout.
5 | 6 | 7 | 16 | 18 | 28 | 35 | 52 | 55 | 56 | 92) upstream=yes ;;
# -f's HTTP error; curl before 7.75 appends the reason phrase.
22) if [[ "$before" =~ returned\ error:\ (403|408|429|5[0-9][0-9])([^0-9]|$) ]]; then upstream=yes; fi ;;
esac
;;
esac
if [ -n "$upstream" ]; then
echo "::warning::the installer stopped on an upstream download (curl: ${before#*curl: }); this job skips its remaining steps"
echo "E2E_UPSTREAM_SKIP=1" >> "${GITHUB_ENV:-/dev/null}"
exit 0
fi
echo "the installer failed (exit ${status}) on something other than a refused upstream download; its log is above"
[ "$status" -ne 0 ] 2>/dev/null || status=1
exit "$status"