MeshChatX/scripts/ci/github-warm-appimage-tools.sh

113 lines
3.5 KiB
Bash
Executable file

#!/usr/bin/env bash
# Pre-download the electron-builder AppImage toolset into ELECTRON_BUILDER_CACHE.
# GitHub release CDN over HTTP/2 (got inside electron-builder) often resets the
# TLS stream after freeze has already finished (read ECONNRESET). curl HTTP/1.1
# plus --retry-all-errors matches scripts/ci/setup-task.sh.
#
# Pins must match package.json build.toolsets.appimage and the sha256 in
# app-builder-lib toolsets/linux.js for that version (electron-builder 26.15.3:
# appimage@1.0.2).
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
cd "$ROOT"
APPIMAGE_TOOLSET="1.0.2"
FILENAME="appimage-tools-runtime-20251108.tar.gz"
SHA256="a784a8c26331ec2e945c23d6bdb14af5c9df27f5939825d84b8709c61dc81eb0"
RELEASE_NAME="appimage@${APPIMAGE_TOOLSET}"
URL="https://github.com/electron-userland/electron-builder-binaries/releases/download/${RELEASE_NAME}/${FILENAME}"
pkg_toolset="$(node -p "require('./package.json').build.toolsets.appimage" 2>/dev/null || true)"
if [ "$pkg_toolset" != "$APPIMAGE_TOOLSET" ]; then
echo "github-warm-appimage-tools.sh: package.json build.toolsets.appimage is '${pkg_toolset:-missing}', script pin is '${APPIMAGE_TOOLSET}'" >&2
echo "Update APPIMAGE_TOOLSET, FILENAME, and SHA256 in this script to match app-builder-lib." >&2
exit 1
fi
electron_builder_cache_dir() {
if [ -n "${ELECTRON_BUILDER_CACHE:-}" ]; then
case "${ELECTRON_BUILDER_CACHE}" in
/*)
printf '%s\n' "${ELECTRON_BUILDER_CACHE}"
return
;;
esac
fi
if [ -n "${XDG_CACHE_HOME:-}" ]; then
case "${XDG_CACHE_HOME}" in
/*)
printf '%s\n' "${XDG_CACHE_HOME}/electron-builder"
return
;;
esac
fi
printf '%s\n' "${HOME}/.cache/electron-builder"
}
CACHE_DIR="$(electron_builder_cache_dir)"
DEST_DIR="${CACHE_DIR}/${RELEASE_NAME}"
DEST="${DEST_DIR}/${FILENAME}"
mkdir -p "$DEST_DIR"
hash_ok() {
[ -f "$1" ] || return 1
local actual
actual="$(sha256sum "$1" | cut -d' ' -f1)"
[ "$actual" = "$SHA256" ]
}
if hash_ok "$DEST"; then
echo "github-warm-appimage-tools.sh: using cached ${DEST}"
exit 0
fi
if [ "${MESHCHATX_OFFLINE_BUILD:-0}" = "1" ]; then
echo "github-warm-appimage-tools.sh: MESHCHATX_OFFLINE_BUILD=1 but ${DEST} is missing or checksum-mismatched" >&2
exit 1
fi
download_release() {
dest="$1"
url="$2"
token="${GITHUB_TOKEN:-${GH_TOKEN:-}}"
if [ -n "$token" ]; then
curl -fsSL --http1.1 \
--retry 8 \
--retry-all-errors \
--retry-delay 4 \
--retry-max-time 180 \
--connect-timeout 20 \
--max-time 180 \
-H "Authorization: Bearer ${token}" \
-o "$dest" \
"$url"
else
curl -fsSL --http1.1 \
--retry 8 \
--retry-all-errors \
--retry-delay 4 \
--retry-max-time 180 \
--connect-timeout 20 \
--max-time 180 \
-o "$dest" \
"$url"
fi
}
TMP="${DEST}.tmp"
rm -f "$TMP" "$DEST"
echo "github-warm-appimage-tools.sh: downloading ${FILENAME} (${RELEASE_NAME})"
download_release "$TMP" "$URL"
ACTUAL="$(sha256sum "$TMP" | cut -d' ' -f1)"
if [ "$ACTUAL" != "$SHA256" ]; then
echo "github-warm-appimage-tools.sh: SHA256 mismatch for ${FILENAME}" >&2
echo " expected: ${SHA256}" >&2
echo " got: ${ACTUAL}" >&2
rm -f "$TMP"
exit 1
fi
mv -f "$TMP" "$DEST"
echo "github-warm-appimage-tools.sh: cached ${DEST} (${ACTUAL})"