Files
BizGaze_Remote/publish-desktop.sh
Sravan 820e7a08fc add publish-desktop.sh — one-command desktop installer publish from laptop
Mirrors redeploy.sh conventions (pinned host key, DEPLOY_PASS/deploy.secret/
prompt password resolution, plink discovery). Uploads the three electron-builder
artifacts via pscp to a temp dir, then docker cp's them into the app container's
/data/downloads (volume-path-independent), and verifies the public feed serves
the new version. Keeps older versions; only latest.yml is overwritten.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 16:04:22 +05:30

101 lines
4.6 KiB
Bash

#!/usr/bin/env bash
#
# publish-desktop.sh — publish a desktop installer FROM YOUR LAPTOP (Git Bash).
# It uploads the three electron-builder artifacts to the server and drops them into
# the app container's DOWNLOADS_DIR (/data/downloads), which powers both the site's
# "Download for Windows" button and the auto-update feed for installed apps.
#
# Uploaded artifacts (from desktop/dist/):
# - Biz Connect Setup <ver>.exe the installer
# - Biz Connect Setup <ver>.exe.blockmap differential-update map
# - latest.yml update manifest (the ONLY file overwritten)
#
# It does NOT delete older versions — keeping old .exe/.blockmap lets installed apps
# pull deltas. Only latest.yml is replaced (there must be exactly one, newest wins).
#
# Usage:
# ./publish-desktop.sh # publish the version in desktop/package.json
# ./publish-desktop.sh 0.1.4 # publish a specific version
#
# Password (in priority order), same as redeploy.sh:
# 1. $DEPLOY_PASS environment variable
# 2. a gitignored `deploy.secret` file next to this script (one line = the pw)
# 3. hidden prompt
set -euo pipefail
HOST=118.95.33.89
PORT=61
USER=root
CONTAINER=bizgaze-support
DEST=/data/downloads
# Pinned server host key (SHA256). -batch won't prompt to cache an unknown key, so
# we pin it here (same value as redeploy.sh). Override with $DEPLOY_HOSTKEY if the
# server is rebuilt.
HOSTKEY="${DEPLOY_HOSTKEY:-SHA256:hxfv/hH5aplnM4wOsl+jLjWaXwEeceZ4Uz932/5IoCE}"
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
DIST="$DIR/desktop/dist"
# Locate plink + pscp (PuTTY).
PLINK="$(command -v plink 2>/dev/null || true)"; [ -n "$PLINK" ] || PLINK="/c/Program Files/PuTTY/plink"
PSCP="$(command -v pscp 2>/dev/null || true)"; [ -n "$PSCP" ] || PSCP="/c/Program Files/PuTTY/pscp"
[ -x "$PLINK" ] || { echo "ERROR: plink not found (install PuTTY or add to PATH)"; exit 1; }
[ -x "$PSCP" ] || { echo "ERROR: pscp not found (install PuTTY or add to PATH)"; exit 1; }
# Resolve the version: explicit arg, else desktop/package.json.
VER="${1:-}"
if [ -z "$VER" ]; then
VER="$(grep -oE '"version"[[:space:]]*:[[:space:]]*"[^"]+"' "$DIR/desktop/package.json" | head -1 | sed -E 's/.*"([^"]+)"$/\1/')"
fi
[ -n "$VER" ] || { echo "ERROR: could not determine version (pass it as an argument)"; exit 1; }
EXE="$DIST/Biz Connect Setup $VER.exe"
MAP="$DIST/Biz Connect Setup $VER.exe.blockmap"
YML="$DIST/latest.yml"
for f in "$EXE" "$MAP" "$YML"; do
[ -f "$f" ] || { echo "ERROR: missing artifact: $f"; echo " build it first: cd desktop && npm run dist"; exit 1; }
done
# Sanity: latest.yml should reference this version, or installed apps won't update to it.
if ! grep -qE "^version:[[:space:]]*$VER([^0-9]|$)" "$YML"; then
echo "WARNING: $YML does not declare version $VER — is dist/ from an older build?"
fi
# Resolve password (same precedence as redeploy.sh).
PW="${DEPLOY_PASS:-}"
if [ -z "$PW" ] && [ -f "$DIR/deploy.secret" ]; then
PW="$(tr -d '\r\n' < "$DIR/deploy.secret")"
fi
if [ -z "$PW" ]; then
read -rsp "Server password for $USER@$HOST: " PW; echo
fi
STAGE="/tmp/bizc-desktop-$VER"
echo "==> Publishing Biz Connect $VER to $USER@$HOST:$CONTAINER:$DEST"
# 1. Stage a clean temp dir on the server.
"$PLINK" -ssh -batch -hostkey "$HOSTKEY" -P "$PORT" -pw "$PW" "$USER@$HOST" "rm -rf '$STAGE' && mkdir -p '$STAGE'"
# 2. Upload the three artifacts into it.
echo "--> uploading installer, blockmap, manifest …"
"$PSCP" -P "$PORT" -pw "$PW" -hostkey "$HOSTKEY" "$EXE" "$MAP" "$YML" "$USER@$HOST:$STAGE/"
# 3. Copy them into the container's DOWNLOADS_DIR (volume-path-independent), then clean up.
# \$f stays literal so the REMOTE shell iterates/quotes the space-containing names.
REMOTE_CMD="set -e; for f in '$STAGE'/*; do docker cp \"\$f\" $CONTAINER:$DEST/; done; echo '--- $DEST now holds ---'; docker exec $CONTAINER ls -la $DEST; rm -rf '$STAGE'"
echo "--> installing into container …"
"$PLINK" -ssh -batch -hostkey "$HOSTKEY" -P "$PORT" -pw "$PW" "$USER@$HOST" "$REMOTE_CMD"
# 4. Verify the public feed actually serves this version (GET, not HEAD — the route is GET-only).
echo "==> Verifying public feed …"
if command -v curl >/dev/null 2>&1; then
echo -n " latest.yml -> "; curl -s "https://remote.bizgaze.com/downloads/latest.yml" | grep -E '^version:' || echo "??"
code="$(curl -s -r 0-1 -o /dev/null -w '%{http_code}' -L "https://remote.bizgaze.com/download/windows")"
echo " /download/windows -> HTTP $code (expect 200 or 206)"
else
echo " (curl not found — skip; check https://remote.bizgaze.com/downloads/latest.yml manually)"
fi
echo "==> Done. Installed 0.x apps will auto-update to $VER on next launch (or within 6h)."