86 lines
2.5 KiB
Bash
86 lines
2.5 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
DIST_DIR="${DIST_DIR:-dist}"
|
|
REMOTE_ROOT="${RELEASE_DEPLOY_REMOTE_ROOT:-/}"
|
|
HOST="${RELEASE_DEPLOY_HOST:-}"
|
|
USER_NAME="${RELEASE_DEPLOY_USER:-}"
|
|
PASSWORD="${RELEASE_DEPLOY_PASSWORD:-}"
|
|
DEPLOY_URL="${RELEASE_DEPLOY_URL:-}"
|
|
|
|
if [[ ! -d "$DIST_DIR" ]]; then
|
|
echo "Missing dist directory: $DIST_DIR" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if ! command -v lftp >/dev/null 2>&1; then
|
|
echo "lftp is required for FTP/SFTP uploads." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -z "$DEPLOY_URL" ]]; then
|
|
if [[ -z "$HOST" || -z "$USER_NAME" || -z "$PASSWORD" ]]; then
|
|
echo "Set RELEASE_DEPLOY_URL or RELEASE_DEPLOY_HOST, RELEASE_DEPLOY_USER, and RELEASE_DEPLOY_PASSWORD." >&2
|
|
exit 1
|
|
fi
|
|
DEPLOY_URL="ftp://${HOST}"
|
|
elif [[ -n "$USER_NAME" || -n "$PASSWORD" ]]; then
|
|
if [[ -z "$USER_NAME" || -z "$PASSWORD" ]]; then
|
|
echo "Set both RELEASE_DEPLOY_USER and RELEASE_DEPLOY_PASSWORD when providing deploy credentials separately." >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
lftp_quote() {
|
|
local value="${1//\'/\'\\\'\'}"
|
|
printf "'%s'" "$value"
|
|
}
|
|
|
|
run_lftp() {
|
|
local transfer_command="$1"
|
|
|
|
{
|
|
printf 'set ftp:ssl-allow true\n'
|
|
printf 'set ftp:ssl-force true\n'
|
|
printf 'set ftp:ssl-protect-data true\n'
|
|
printf 'set net:max-retries 3\n'
|
|
printf 'set net:timeout 20\n'
|
|
|
|
if [[ -n "$USER_NAME" && -n "$PASSWORD" ]]; then
|
|
printf 'open -u %s,%s %s\n' "$(lftp_quote "$USER_NAME")" "$(lftp_quote "$PASSWORD")" "$(lftp_quote "$DEPLOY_URL")"
|
|
else
|
|
printf 'open %s\n' "$(lftp_quote "$DEPLOY_URL")"
|
|
fi
|
|
|
|
printf 'cd %s\n' "$(lftp_quote "$REMOTE_ROOT")"
|
|
printf '%s\n' "$transfer_command"
|
|
printf 'bye\n'
|
|
} | lftp -f /dev/stdin
|
|
}
|
|
|
|
upload_file() {
|
|
local source_file="$1"
|
|
local remote_file="$2"
|
|
if [[ -f "$source_file" ]]; then
|
|
run_lftp "put -O $(lftp_quote "$(dirname "$remote_file")") $(lftp_quote "$source_file") -o $(lftp_quote "$(basename "$remote_file")")"
|
|
fi
|
|
}
|
|
|
|
for directory in assets resources favicons icons img sounds .well-known; do
|
|
if [[ -d "$DIST_DIR/$directory" ]]; then
|
|
run_lftp "mirror -R --only-newer --parallel=4 $(lftp_quote "$DIST_DIR/$directory") $(lftp_quote "$directory")"
|
|
fi
|
|
done
|
|
|
|
find "$DIST_DIR" -maxdepth 1 -type f \
|
|
! -name 'index.html' \
|
|
! -name 'release-entry.json' \
|
|
! -name 'release-manifest.json' \
|
|
-print0 | while IFS= read -r -d '' file; do
|
|
upload_file "$file" "$(basename "$file")"
|
|
done
|
|
|
|
upload_file "$DIST_DIR/release-manifest.json" "release-manifest.json"
|
|
upload_file "$DIST_DIR/release-entry.json" "release-entry.json"
|
|
upload_file "$DIST_DIR/index.html" "index.html"
|