scripts/test-github-installer-release-assets.sh
Rama main · réplica de lectura del repositorio original.
#!/bin/sh
set -eu
script_dir="$(CDPATH='' cd -- "$(dirname -- "$0")" && pwd)"
project_dir="$(CDPATH='' cd -- "$script_dir/.." && pwd)"
temporary_dir="$(mktemp -d "${TMPDIR:-/tmp}/vastora-github-assets-test.XXXXXX")"
cleanup() { rm -rf "$temporary_dir"; }
trap cleanup EXIT HUP INT TERM
fake_bin="$temporary_dir/bin"
fake_release="$temporary_dir/release"
source_dir="$temporary_dir/dist"
bundle_dir="$temporary_dir/bundle"
mkdir -p "$fake_bin" "$fake_release" "$source_dir" "$bundle_dir"
version="0.1.0-alpha.10"
tag="v$version"
printf 'VASTORA_VERSION=%s\n' "$version" > "$bundle_dir/release.env"
printf 'VASTORA_CENTER_IMAGE=ghcr.io/petauron/vastora-center@sha256:%064d\n' 0 >> "$bundle_dir/release.env"
tar -czf "$source_dir/vastora-center-install.tar.gz" -C "$bundle_dir" .
(cd "$source_dir" && sha256sum vastora-center-install.tar.gz > vastora-center-install.tar.gz.sha256)
cp "$project_dir/install.sh" "$source_dir/install.sh"
"$script_dir/create-installer-release-manifest.sh" --version "$version" --source-dir "$source_dir" >/dev/null
cat > "$fake_bin/gh" <<'EOF'
#!/bin/sh
set -eu
[ "${1:-}" = "release" ] || exit 2
operation="${2:-}"
shift 2
case "$operation" in
view)
if [ -f "$FAKE_RELEASE_DIR/published" ]; then draft=false; else draft=true; fi
find "$FAKE_RELEASE_DIR" -maxdepth 1 -type f ! -name published ! -name names -exec basename {} \; | sort > "$FAKE_RELEASE_DIR/names"
jq -R -s --argjson draft "$draft" '{isDraft:$draft,assets:(split("\n") | map(select(length > 0) | {name:.}))}' "$FAKE_RELEASE_DIR/names"
;;
upload)
shift
echo "$*" >> "$FAKE_UPLOAD_LOG"
if [ "${FAKE_PERMANENT_FAILURE:-}" = "true" ]; then
echo 'HTTP 403: Forbidden' >&2
exit 1
fi
if [ "${FAKE_TRANSIENT_FAILURE:-}" = "true" ]; then
echo 'HTTP 503: Service Unavailable' >&2
exit 1
fi
if [ -f "$FAKE_FAILURE_FILE" ]; then
rm "$FAKE_FAILURE_FILE"
echo 'HTTP 404: Not Found' >&2
exit 1
fi
for argument in "$@"; do
[ "$argument" = "--clobber" ] && continue
cp "$argument" "$FAKE_RELEASE_DIR/$(basename "$argument")"
done
;;
download)
shift
output=""
pattern=""
while [ "$#" -gt 0 ]; do
case "$1" in --dir) output="$2"; shift 2 ;; --pattern) pattern="$2"; shift 2 ;; *) shift ;; esac
done
mkdir -p "$output"
if [ -n "$pattern" ]; then
cp "$FAKE_RELEASE_DIR/$pattern" "$output/"
else
find "$FAKE_RELEASE_DIR" -maxdepth 1 -type f ! -name published ! -name names -exec cp {} "$output/" \;
fi
;;
*) exit 2 ;;
esac
EOF
chmod 0755 "$fake_bin/gh"
export FAKE_RELEASE_DIR="$fake_release"
export FAKE_UPLOAD_LOG="$temporary_dir/uploads"
export FAKE_FAILURE_FILE="$temporary_dir/fail-once"
export PATH="$fake_bin:$PATH"
touch "$FAKE_FAILURE_FILE"
"$script_dir/github-installer-release-assets.sh" upload --tag "$tag" --directory "$source_dir" >/dev/null
test "$(find "$fake_release" -maxdepth 1 -type f ! -name names | wc -l | tr -d ' ')" = "4"
test "$(wc -l < "$FAKE_UPLOAD_LOG" | tr -d ' ')" = "5"
# A completed upload is verified, not overwritten or uploaded again.
"$script_dir/github-installer-release-assets.sh" upload --tag "$tag" --directory "$source_dir" >/dev/null
test "$(wc -l < "$FAKE_UPLOAD_LOG" | tr -d ' ')" = "5"
# Only the missing file is retried; permanent errors stop on the first attempt.
rm "$fake_release/install.sh"
if FAKE_PERMANENT_FAILURE=true "$script_dir/github-installer-release-assets.sh" upload --tag "$tag" --directory "$source_dir" >/dev/null 2>&1; then
echo 'Permanent upload failure was ignored.' >&2
exit 1
fi
test "$(wc -l < "$FAKE_UPLOAD_LOG" | tr -d ' ')" = "6"
if FAKE_TRANSIENT_FAILURE=true "$script_dir/github-installer-release-assets.sh" upload --tag "$tag" --directory "$source_dir" >/dev/null 2>&1; then
echo 'Transient upload failure exceeded its retry boundary.' >&2
exit 1
fi
test "$(wc -l < "$FAKE_UPLOAD_LOG" | tr -d ' ')" = "9"
"$script_dir/github-installer-release-assets.sh" upload --tag "$tag" --directory "$source_dir" >/dev/null
test "$(wc -l < "$FAKE_UPLOAD_LOG" | tr -d ' ')" = "10"
retry_dir="$temporary_dir/retry"
"$script_dir/github-installer-release-assets.sh" download --tag "$tag" --directory "$retry_dir" >/dev/null
for asset in install.sh vastora-center-install.tar.gz vastora-center-install.tar.gz.sha256 vastora-release-manifest.json; do
cmp -s "$source_dir/$asset" "$retry_dir/$asset"
done
printf 'corrupt\n' >> "$fake_release/install.sh"
if "$script_dir/github-installer-release-assets.sh" upload --tag "$tag" --directory "$source_dir" >/dev/null 2>&1; then
echo "GitHub asset publication replaced a mismatched existing asset." >&2
exit 1
fi
cp "$source_dir/install.sh" "$fake_release/install.sh"
printf 'unexpected\n' > "$fake_release/unexpected.txt"
if "$script_dir/github-installer-release-assets.sh" upload --tag "$tag" --directory "$source_dir" >/dev/null 2>&1; then
echo "GitHub asset publication accepted an unexpected release asset." >&2
exit 1
fi
rm "$fake_release/unexpected.txt"
touch "$fake_release/published"
if "$script_dir/github-installer-release-assets.sh" upload --tag "$tag" --directory "$source_dir" >/dev/null 2>&1; then
echo "GitHub asset publication mutated a published release." >&2
exit 1
fi
echo "GitHub installer release asset tests: OK"