Files
goldenChart/scripts/publish-desktop-update.sh
T
Macbook 7f5e7b22d2 fix: Desktop publish가 build-info 버전을 tauri.conf로 덮어쓰지 않음
CI bump(0.1.7) 후 deploy checkout으로 tauri.conf가 0.1.4로 돌아가도
latest.json에 올바른 빌드 버전이 반영되도록 한다.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-14 17:26:35 +09:00

97 lines
3.6 KiB
Bash
Executable File

#!/usr/bin/env bash
# GoldenChart Desktop — updater 서명 + latest.json + 웹 static 배포
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
ARTIFACT_DIR="${ARTIFACT_DIR:-$ROOT/dist-desktop}"
UPDATES_SRC="${UPDATES_SRC:-$ARTIFACT_DIR/updates}"
UPDATES_DIR="${UPDATES_DIR:-${WORK_TREE:-$ROOT}/frontend/public/desktop/updates}"
WEB_STATIC_DIR="${WEB_STATIC_DIR:-$UPDATES_DIR}"
BASE_URL="${DESKTOP_UPDATE_BASE_URL:-https://exdev.co.kr/desktop/updates}"
BASE_URL="${BASE_URL/http:\/\//https:\/\/}"
DESKTOP_RELEASE_DIR="${GC_DESKTOP_APP_RELEASE_DIR:-$ROOT/data/desktop-releases}"
KEY_PATH="${TAURI_SIGNER_KEY:-$HOME/.tauri/goldenchart.key}"
DESKTOP_DIR="$ROOT/desktop"
CONF="$DESKTOP_DIR/src-tauri/tauri.conf.json"
BUILD_INFO="$ARTIFACT_DIR/build-info.json"
export PATH="/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:${PATH:-/usr/bin:/bin}"
# shellcheck disable=SC1091
[[ -f "$HOME/.cargo/env" ]] && source "$HOME/.cargo/env"
log() { echo "[publish-desktop] $*"; }
# CI bump 후 deploy checkout 등으로 tauri.conf가 되돌아갈 수 있음 — build-info 우선
VERSION="$(node -p "require('$CONF').version" 2>/dev/null || echo '0.1.0')"
if [[ -f "$BUILD_INFO" ]]; then
VERSION="$(node -e "try{console.log(JSON.parse(require('fs').readFileSync(process.argv[1],'utf8')).version||'')}catch{}" "$BUILD_INFO" 2>/dev/null || echo "$VERSION")"
[[ -z "$VERSION" ]] && VERSION="$(node -p "require('$CONF').version" 2>/dev/null || echo '0.1.0')"
fi
NOTES="${DESKTOP_RELEASE_NOTES:-GoldenChart Desktop $VERSION}"
log "=== Publish Desktop v$VERSION ==="
log "Updates src: $UPDATES_SRC"
log "Web static: $WEB_STATIC_DIR"
mkdir -p "$WEB_STATIC_DIR"
# 설치 파일(dist-desktop/*.dmg, *setup.exe) 복사 — nginx static + backend API 디렉터리
if [[ -d "$ARTIFACT_DIR" ]]; then
mkdir -p "$DESKTOP_RELEASE_DIR"
find "$ARTIFACT_DIR" -maxdepth 1 -type f \( -name '*.dmg' -o -name '*setup.exe' \) | while read -r f; do
cp -f "$f" "$WEB_STATIC_DIR/"
cp -f "$f" "$DESKTOP_RELEASE_DIR/"
log "Installer: $(basename "$f")"
done
fi
PUBLISH_UPDATES="$WEB_STATIC_DIR"
mkdir -p "$PUBLISH_UPDATES"
if [[ -d "$UPDATES_SRC" ]]; then
cp -f "$UPDATES_SRC"/* "$PUBLISH_UPDATES/" 2>/dev/null || true
fi
# updater 번들 서명
if [[ -f "$KEY_PATH" ]]; then
shopt -s nullglob
for bundle in "$PUBLISH_UPDATES"/*.tar.gz "$PUBLISH_UPDATES"/*-setup.exe "$PUBLISH_UPDATES"/*.nsis.zip "$PUBLISH_UPDATES"/*.zip; do
[[ -f "$bundle" ]] || continue
[[ "$bundle" == *.sig ]] && continue
log "Signing $(basename "$bundle")"
unset TAURI_SIGNING_PRIVATE_KEY TAURI_SIGNING_PRIVATE_KEY_PASSWORD 2>/dev/null || true
(cd "$DESKTOP_DIR" && npx tauri signer sign -f "$KEY_PATH" -p "${TAURI_SIGNING_PRIVATE_KEY_PASSWORD-}" "$bundle")
done
shopt -u nullglob
else
log "[WARN] TAURI_SIGNER_KEY 없음 ($KEY_PATH) — updater 서명 생략"
log " ./scripts/setup-desktop-updater-keys.sh 실행 후 Jenkins Credential 등록"
fi
# build-info 복사 (빌드 시 기록된 버전 유지 — tauri.conf로 덮어쓰지 않음)
if [[ -f "$BUILD_INFO" ]]; then
cp -f "$BUILD_INFO" "$PUBLISH_UPDATES/build-info.json"
fi
# latest.json
set +e
node "$ROOT/scripts/generate-desktop-latest-json.mjs" \
--version "$VERSION" \
--dir "$PUBLISH_UPDATES" \
--base-url "$BASE_URL" \
--notes "$NOTES"
GEN_RC=$?
set -e
if [[ "$GEN_RC" -eq 2 ]]; then
log "[WARN] signed updater bundle 없음 — latest.json 유지 (placeholder 덮어쓰기 안 함)"
elif [[ "$GEN_RC" -ne 0 ]]; then
exit "$GEN_RC"
fi
log "Published:"
ls -la "$PUBLISH_UPDATES"
log "nginx: /desktop/updates/ → frontend/public/desktop/updates (Docker rebuild 시 반영)"
log "Done."