diff --git a/deploy/README.md b/deploy/README.md index a349f4b..e780396 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -152,12 +152,16 @@ Push the desktop builds and their update metadata to the frontend's feed: ```bash ./push_desktop.sh # Linux packages (deb + pacman) ./push_desktop.sh --win # also cross-build the NSIS installer (wine) +./push_desktop.sh --win --host jakerasp:/home/jake/servers/J621 ``` Artifacts land in `deploy/data/desktop/`, which the frontend nginx mounts -read-only and serves at `/desktop/`. The desktop app's "Check for updates…" -menu item reads `latest-linux.yml` / `latest.yml` from there (see -`desktop/README.md`). Backend-only composes have no frontend, so no feed. +read-only and serves at `/desktop/`. `--host` also copies that directory to +a remote deploy checkout — rsync when both ends have it, tar over ssh when +the server does not — so the build can run here and prod only receives the +files. The desktop app's "Check for updates…" menu item reads +`latest-linux.yml` / `latest.yml` from there (see `desktop/README.md`). +Backend-only composes have no frontend, so no feed. ## Scheduled jobs diff --git a/deploy/push_desktop.sh b/deploy/push_desktop.sh index 2b2ca37..6c6d9ff 100755 --- a/deploy/push_desktop.sh +++ b/deploy/push_desktop.sh @@ -1,28 +1,40 @@ #!/bin/bash -# Build the J621 desktop packages and publish them to the frontend's update -# feed (deploy/data/desktop, mounted read-only into the frontend nginx and -# served at /desktop/). electron-updater reads latest-linux.yml / latest.yml -# from there; the app's feed URL comes from desktop/electron-builder.yml. +# Build the J621 desktop packages and publish them to the update feed. # -# Usage: ./push_desktop.sh [--win] [--no-build] +# Locally the feed is deploy/data/desktop, which the frontend nginx mounts +# read-only and serves at /desktop/. With --host the same directory is also +# copied to a remote deploy checkout (rsync, or tar over ssh when the server +# has no rsync). electron-updater reads latest-linux.yml / latest.yml from +# there; the feed URL comes from desktop/electron-builder.yml. +# +# Usage: ./push_desktop.sh [--win] [--no-build] [--host user@server:/path] # --win also cross-build the Windows NSIS installer (needs wine) # --no-build publish what is already in desktop/release/ +# --host remote deploy checkout, e.g. jakerasp:/home/jake/servers/J621 set -euo pipefail cd "$(dirname "$0")/.." BUILD=1 WIN=0 -for arg in "$@"; do - case "$arg" in +REMOTE="" +while [ $# -gt 0 ]; do + case "$1" in --win) WIN=1 ;; --no-build) BUILD=0 ;; + --host) REMOTE="${2:?--host needs user@server:/path}"; shift ;; *) - echo "usage: $0 [--win] [--no-build]" >&2 + echo "usage: $0 [--win] [--no-build] [--host user@server:/path]" >&2 exit 2 ;; esac + shift done +if [ -n "$REMOTE" ] && [ "$REMOTE" = "${REMOTE#*:}" ]; then + echo "--host needs user@server:/path (got '$REMOTE')" >&2 + exit 2 +fi + if [ "$BUILD" = 1 ]; then echo "==> Building Linux packages (deb + pacman) ..." npm --prefix desktop run dist:linux @@ -57,6 +69,36 @@ fi echo "==> Published to $FEED:" ls -1sh "$FEED" | sed 's/^/ /' + +if [ -n "$REMOTE" ]; then + REMOTE_TARGET="${REMOTE%%:*}" + REMOTE_ROOT="${REMOTE#*:}" + REMOTE_FEED="${REMOTE_ROOT%/}/deploy/data/desktop" + + echo + echo "==> Copying the feed to $REMOTE_TARGET:$REMOTE_FEED ..." + transferred=0 + if command -v rsync >/dev/null 2>&1; then + if rsync -a --info=progress2 "$FEED"/ "$REMOTE_TARGET:$REMOTE_FEED/"; then + transferred=1 + else + echo "==> rsync did not work (missing on the server?); trying tar over ssh ..." + fi + fi + if [ "$transferred" -eq 0 ]; then + if ! ssh "$REMOTE_TARGET" "mkdir -p '$REMOTE_FEED'"; then + echo "ssh to $REMOTE_TARGET failed; nothing was copied." >&2 + exit 1 + fi + if ! tar -C "$FEED" -cf - . | + ssh "$REMOTE_TARGET" "tar -C '$REMOTE_FEED' -xf -"; then + echo "Copy to $REMOTE_TARGET:$REMOTE_FEED failed." >&2 + exit 1 + fi + fi + echo "==> Feed live at $REMOTE_TARGET:$REMOTE_FEED (no restart needed)." +fi + echo echo "Served read-only by the frontend nginx at /desktop/ (no restart needed):" echo " https:///desktop/latest-linux.yml"